--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.internal.ui.text;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Shell;
+
+import org.eclipse.core.runtime.Assert;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.LineChangeHover;
+
+import org.eclipse.ui.editors.text.EditorsUI;
+
+/**
+ * A line change hover for Java source code. Adds a custom information control creator returning a
+ * source viewer with syntax coloring.
+ *
+ * @since 3.0
+ */
+public class JavaChangeHover extends LineChangeHover {
+
+ /** The last computed partition type. */
+ private String fPartition;
+ /** The last created information control. */
+ private ChangeHoverInformationControl fInformationControl;
+ /** The document partitioning to be used by this hover. */
+ private String fPartitioning;
+ /** The last created information control. */
+ private int fLastScrollIndex= 0;
+
+ /**
+ * The orientation to be used by this hover.
+ * Allowed values are: SWT#RIGHT_TO_LEFT or SWT#LEFT_TO_RIGHT
+ * @since 3.2
+ */
+ private int fOrientation;
+
+ /**
+ * Creates a new change hover for the given document partitioning.
+ *
+ * @param partitioning the document partitioning
+ * @param orientation the orientation, allowed values are: SWT#RIGHT_TO_LEFT or SWT#LEFT_TO_RIGHT
+ */
+ public JavaChangeHover(String partitioning, int orientation) {
+ Assert.isLegal(orientation == SWT.RIGHT_TO_LEFT || orientation == SWT.LEFT_TO_RIGHT);
+ fPartitioning= partitioning;
+ fOrientation= orientation;
+ }
+
+ /*
+ * @see org.eclipse.ui.internal.editors.text.LineChangeHover#formatSource(java.lang.String)
+ */
+ @Override
+ protected String formatSource(String content) {
+ return content;
+ }
+
+ /*
+ * @see org.eclipse.jface.text.source.IAnnotationHoverExtension#getHoverControlCreator()
+ */
+ @Override
+ public IInformationControlCreator getHoverControlCreator() {
+ return new IInformationControlCreator() {
+ public IInformationControl createInformationControl(Shell parent) {
+ fInformationControl= new ChangeHoverInformationControl(parent, false, fOrientation, fPartition, EditorsUI.getTooltipAffordanceString());
+ fInformationControl.setHorizontalScrollPixel(fLastScrollIndex);
+ return fInformationControl;
+ }
+ };
+ }
+
+ /*
+ * @see org.eclipse.jface.text.information.IInformationProviderExtension2#getInformationPresenterControlCreator()
+ * @since 3.2
+ */
+ @Override
+ public IInformationControlCreator getInformationPresenterControlCreator() {
+ return new IInformationControlCreator() {
+ public IInformationControl createInformationControl(Shell parent) {
+ fInformationControl= new ChangeHoverInformationControl(parent, true, fOrientation, fPartition, null);
+ fInformationControl.setHorizontalScrollPixel(fLastScrollIndex);
+ return fInformationControl;
+ }
+ };
+ }
+
+ /*
+ * @see org.eclipse.jface.text.source.LineChangeHover#computeLineRange(org.eclipse.jface.text.source.ISourceViewer, int, int, int)
+ */
+ @Override
+ protected Point computeLineRange(ISourceViewer viewer, int line, int first, int number) {
+ Point lineRange= super.computeLineRange(viewer, line, first, number);
+ if (lineRange != null) {
+ fPartition= getPartition(viewer, lineRange.x);
+ } else {
+ fPartition= IDocument.DEFAULT_CONTENT_TYPE;
+ }
+ fLastScrollIndex= viewer.getTextWidget().getHorizontalPixel();
+ if (fInformationControl != null) {
+ fInformationControl.setStartingPartitionType(fPartition);
+ fInformationControl.setHorizontalScrollPixel(fLastScrollIndex);
+ }
+ return lineRange;
+ }
+
+ /**
+ * Returns the partition type of the document displayed in <code>viewer</code> at <code>startLine</code>.
+
+ * @param viewer the viewer
+ * @param startLine the line in the viewer
+ * @return the partition type at the start of <code>startLine</code>, or <code>IDocument.DEFAULT_CONTENT_TYPE</code> if none can be detected
+ */
+ private String getPartition(ISourceViewer viewer, int startLine) {
+ if (viewer == null)
+ return null;
+ IDocument doc= viewer.getDocument();
+ if (doc == null)
+ return null;
+ if (startLine <= 0)
+ return IDocument.DEFAULT_CONTENT_TYPE;
+ try {
+ ITypedRegion region= TextUtilities.getPartition(doc, fPartitioning, doc.getLineOffset(startLine) - 1, true);
+ return region.getType();
+ } catch (BadLocationException e) {
+ }
+ return IDocument.DEFAULT_CONTENT_TYPE;
+ }
+
+
+ /*
+ * @see org.eclipse.jface.text.source.LineChangeHover#getTabReplacement()
+ */
+ @Override
+ protected String getTabReplacement() {
+ return Character.toString('\t');
+ }
+}