/******************************************************************************* * Copyright (c) 2000, 2003 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package net.sourceforge.phpdt.internal.ui.text; import net.sourceforge.phpdt.internal.ui.text.java.hover.SourceViewerInformationControl; import org.eclipse.jface.resource.JFaceResources; //incastrix //import org.eclipse.jface.text.Assert; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewerExtension; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; /** * Source viewer used to display quick diff hovers. * * @since 3.0 */ public class CustomSourceInformationControl extends SourceViewerInformationControl { /** The font name for the viewer font - the same as the java editor's. */ private static final String SYMBOLIC_FONT_NAME = "net.sourceforge.phpdt.ui.editors.textfont"; //$NON-NLS-1$ /** * The maximum width of the control, set in * setSizeConstraints(int, int). */ int fMaxWidth = Integer.MAX_VALUE; /** * The maximum height of the control, set in * setSizeConstraints(int, int). */ int fMaxHeight = Integer.MAX_VALUE; /** * The partition type to be used as the starting partition type by the * paritition scanner. */ private String fPartition; /** The horizontal scroll index. */ private int fHorizontalScrollPixel; /* * @see org.eclipse.jface.text.IInformationControl#setSizeConstraints(int, * int) */ public void setSizeConstraints(int maxWidth, int maxHeight) { fMaxWidth = maxWidth; fMaxHeight = maxHeight; } /** * Creates a new information control. * * @param parent * the shell that is the parent of this hover / control * @param partition * the initial partition type to be used for the underlying * viewer */ public CustomSourceInformationControl(Shell parent, String partition) { super(parent); setViewerFont(); setStartingPartitionType(partition); } /* * @see org.eclipse.jface.text.IInformationControl#computeSizeHint() */ public Point computeSizeHint() { Point size = super.computeSizeHint(); size.x = Math.min(size.x, fMaxWidth); size.y = Math.min(size.y, fMaxHeight); return size; } /** * Sets the font for this viewer sustaining selection and scroll position. */ private void setViewerFont() { Font font = JFaceResources.getFont(SYMBOLIC_FONT_NAME); if (getViewer().getDocument() != null) { Point selection = getViewer().getSelectedRange(); int topIndex = getViewer().getTopIndex(); StyledText styledText = getViewer().getTextWidget(); Control parent = styledText; if (getViewer() instanceof ITextViewerExtension) { ITextViewerExtension extension = (ITextViewerExtension) getViewer(); parent = extension.getControl(); } parent.setRedraw(false); styledText.setFont(font); getViewer().setSelectedRange(selection.x, selection.y); getViewer().setTopIndex(topIndex); if (parent instanceof Composite) { Composite composite = (Composite) parent; composite.layout(true); } parent.setRedraw(true); } else { StyledText styledText = getViewer().getTextWidget(); styledText.setFont(font); } } /** * Sets the initial partition for the underlying source viewer. * * @param partition * the partition type */ public void setStartingPartitionType(String partition) { if (partition == null) fPartition = IDocument.DEFAULT_CONTENT_TYPE; else fPartition = partition; } /* * @see org.eclipse.jface.text.IInformationControl#setInformation(java.lang.String) */ public void setInformation(String content) { super.setInformation(content); IDocument doc = getViewer().getDocument(); if (doc == null) return; // ensure that we can scroll enough ensureScrollable(); String start = null; if (IPHPPartitions.PHP_PHPDOC_COMMENT.equals(fPartition)) { start = "/**" + doc.getLegalLineDelimiters()[0]; //$NON-NLS-1$ } else if (IPHPPartitions.PHP_MULTILINE_COMMENT.equals(fPartition)) { start = "/*" + doc.getLegalLineDelimiters()[0]; //$NON-NLS-1$ } if (start != null) { try { doc.replace(0, 0, start); int startLen = start.length(); getViewer().setDocument(doc, startLen, doc.getLength() - startLen); } catch (BadLocationException e) { // impossible Assert.isTrue(false); } } getViewer().getTextWidget().setHorizontalPixel(fHorizontalScrollPixel); } /** * Ensures that the control can be scrolled at least to * fHorizontalScrollPixel and adjusts fMaxWidth * accordingly. */ private void ensureScrollable() { IDocument doc = getViewer().getDocument(); if (doc == null) return; StyledText widget = getViewer().getTextWidget(); if (widget == null || widget.isDisposed()) return; int last = doc.getNumberOfLines() - 1; GC gc = new GC(widget); gc.setFont(widget.getFont()); int maxWidth = 0; String content = new String(); try { for (int i = 0; i <= last; i++) { IRegion line; line = doc.getLineInformation(i); content = doc.get(line.getOffset(), line.getLength()); int width = gc.textExtent(content).x; if (width > maxWidth) { maxWidth = width; } } } catch (BadLocationException e) { return; } finally { gc.dispose(); } // limit the size of the window to the maximum width minus scrolling, // but never more than the configured max size (viewport size). fMaxWidth = Math.max(0, Math.min(fMaxWidth, maxWidth - fHorizontalScrollPixel + 8)); } /* * @see net.sourceforge.phpdt.internal.ui.text.java.hover.SourceViewerInformationControl#hasContents() */ public boolean hasContents() { return super.hasContents() && fMaxWidth > 0; } /** * Sets the horizontal scroll index in pixels. * * @param scrollIndex * the new horizontal scroll index */ public void setHorizontalScrollPixel(int scrollIndex) { scrollIndex = Math.max(0, scrollIndex); fHorizontalScrollPixel = scrollIndex; } }