refactory: added UI removed from core plugin.
[phpeclipse.git] / net.sourceforge.phpeclipse.ui / src / net / sourceforge / phpdt / internal / ui / text / CustomSourceInformationControl.java
diff --git a/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpdt/internal/ui/text/CustomSourceInformationControl.java b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpdt/internal/ui/text/CustomSourceInformationControl.java
new file mode 100644 (file)
index 0000000..3f3c40a
--- /dev/null
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * 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;
+import org.eclipse.jface.text.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
+        * <code>setSizeConstraints(int, int)</code>.
+        */
+       int fMaxWidth = Integer.MAX_VALUE;
+
+       /**
+        * The maximum height of the control, set in
+        * <code>setSizeConstraints(int, int)</code>.
+        */
+       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
+        * <code>fHorizontalScrollPixel</code> and adjusts <code>fMaxWidth</code>
+        * 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;
+       }
+}