Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 25467 Details for
Bug 105384
Caret not revealed when typing in text example
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
patch for the caret and scrolling problem
caret_and_scrolling.patch (text/plain), 7.46 KB, created by
Takahiro Kato
on 2005-07-29 11:56:10 EDT
(
hide
)
Description:
patch for the caret and scrolling problem
Filename:
MIME Type:
Creator:
Takahiro Kato
Created:
2005-07-29 11:56:10 EDT
Size:
7.46 KB
patch
obsolete
>diff -Naur /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/GraphicalTextViewer.java src/org/eclipse/gef/examples/text/GraphicalTextViewer.java >--- /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/GraphicalTextViewer.java 2005-05-17 14:24:20.000000000 -0700 >+++ src/org/eclipse/gef/examples/text/GraphicalTextViewer.java 2005-07-29 08:22:38.000000000 -0700 >@@ -13,6 +13,8 @@ > > import java.util.List; > import java.util.Map; >+import java.beans.PropertyChangeListener; >+import java.beans.PropertyChangeEvent; > > import org.eclipse.swt.widgets.Canvas; > import org.eclipse.swt.widgets.Caret; >@@ -21,6 +23,8 @@ > > import org.eclipse.draw2d.UpdateListener; > import org.eclipse.draw2d.UpdateManager; >+import org.eclipse.draw2d.Viewport; >+import org.eclipse.draw2d.FigureCanvas; > import org.eclipse.draw2d.geometry.Rectangle; > import org.eclipse.draw2d.text.CaretInfo; > >@@ -40,10 +44,49 @@ > } > } > >+private class ViewportRefresh implements Runnable { >+ public void run() { >+ refreshViewport(); >+ viewportRefresh = null; >+ } >+} >+ >+private class CaretUpdater implements PropertyChangeListener >+{ >+ public void propertyChange(PropertyChangeEvent evt) { >+ if (GraphicalTextViewer.this.getSelectionRange() != null) { >+ GraphicalTextViewer.this.setSelectionRange(GraphicalTextViewer.this.getSelectionRange()); >+ } >+ } >+} >+ > private Caret caret; > private Runnable caretRefresh; > private SelectionRange selectionRange; > >+/** >+ * The caret updater that updates the caret. This object listens to the >+ * change in the scroll bars in the viewport. >+ */ >+private CaretUpdater caretUpdater = new CaretUpdater (); >+ >+/** The thread to refresh the viewport */ >+private Runnable viewportRefresh; >+ >+/** >+ * Configures this viewer. >+ * <p> >+ * This method must be called <b>AFTER</b> GraphicalTextViewer.createControl(Composite) >+ * is called. >+ */ >+public void configureViewer() { >+ // this method should be called after GraphicalTextViewer.createControl(Composite), or >+ // property change listeners would be registered to wrong range models! >+ Viewport viewport = ((FigureCanvas) getControl()).getViewport(); >+ viewport.getHorizontalRangeModel().addPropertyChangeListener(caretUpdater); >+ viewport.getVerticalRangeModel().addPropertyChangeListener(caretUpdater); >+} >+ > private Caret getCaret() { > if (caret == null && getControl() != null) > caret = new Caret((Canvas)getControl(), 0); >@@ -90,6 +133,13 @@ > queueCaretRefresh(); > } > }); >+ >+ getUpdateManager().addUpdateListener(new UpdateListener() { >+ public void notifyPainting(Rectangle damage, Map dirtyRegions) { } >+ public void notifyValidating() { >+ queueViewportRefresh(); >+ } >+ }); > } > > /** >@@ -121,6 +171,99 @@ > } > > /** >+ * Queues the viewport to refresh. >+ */ >+void queueViewportRefresh() { >+ if (viewportRefresh == null) { >+ viewportRefresh = new ViewportRefresh(); >+ getUpdateManager().runWithUpdate(viewportRefresh); >+ } >+} >+ >+/** >+ * Refreshes the viewport. >+ */ >+void refreshViewport() { >+ if (getCaretOwner() == null) >+ return; >+ CaretInfo newCaretInfo; >+ TextLocation location = getCaretLocation (); >+ if (getSelectionRange().isForward && location.offset > 0) >+ { >+ newCaretInfo = getCaretOwner().getCaretPlacement(location.offset - 1, true); >+ } >+ else >+ { >+ newCaretInfo = getCaretOwner().getCaretPlacement(location.offset, false); >+ } >+ refreshViewport(newCaretInfo); >+} >+ >+/** >+ * Scrolls the view if necessary to show the new caret location. >+ * >+ * @param newCaretInfo new caret info to show. >+ */ >+public void refreshViewport(CaretInfo newCaretInfo) >+{ >+ // update the viewport >+ boolean forward = getSelectionRange().isForward; >+ FigureCanvas figureCanvas = (FigureCanvas) getControl(); >+ Viewport viewport = figureCanvas.getViewport(); >+ int viewPortHeight = viewport.getBounds().height; >+ >+ int caretNewYEnd = newCaretInfo.getLineY() + newCaretInfo.getLineHeight(); >+ int currentViewportY = viewport.getViewLocation().y; >+ int dy = 0; >+ >+ if (forward) { >+ dy = caretNewYEnd - viewPortHeight; >+ } else { >+ int newCaretY = newCaretInfo.getLineY(); >+ if (newCaretY < 0) >+ dy = newCaretY; >+ } >+ >+ // take care of the x coordinate here >+ // newCaretInfo.getX () returns the caret location relative to the viewport. >+ int newX = newCaretInfo.getX(); >+ int currentViewportX = viewport.getViewLocation().x; >+ int viewportLength = viewport.getClientArea().width; >+ // this value is to display the caret in the 2/3 from right in the viewport. >+ int viewportOffsetLength = viewport.getClientArea().width / 3 * 2; >+ int locationX = currentViewportX; >+ if (forward) { >+ if (newX < 0) { >+ // this means the caret is going to the next line. >+ locationX = 0; >+ } >+ >+ if (newX > viewportLength) { >+ // caret went out of the viewport (to right) >+ locationX += newX - viewportOffsetLength; >+ // if (locationX + viewportLength > ) >+ } >+ } else { >+ >+ if (newX < 0) { >+ // caret went out of the view port (to left) >+ locationX += newX - viewportOffsetLength; >+ } >+ >+ if (newX > viewportLength) { >+ // this means it's wrapping back to the previous line. >+ locationX = newX; >+ } >+ } >+ >+ // scroll no matter what >+ figureCanvas.scrollToX(locationX); >+ >+ if (dy != 0) >+ figureCanvas.scrollToY(currentViewportY + dy); >+} >+ >+/** > * Sets the selection range to the given value. Updates any editparts which had or will > * have textual selection. Fires selection changed. Place the caret in the appropriate > * location. >diff -Naur /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/TextEditor.java src/org/eclipse/gef/examples/text/TextEditor.java >--- /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/TextEditor.java 2005-04-26 12:29:55.000000000 -0700 >+++ src/org/eclipse/gef/examples/text/TextEditor.java 2005-07-28 15:25:51.000000000 -0700 >@@ -222,6 +222,7 @@ > }); > > getGraphicalViewer().setContents(doc); >+ ((GraphicalTextViewer)getGraphicalViewer()).configureViewer(); > } > > /** >diff -Naur /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/tools/TextTool.java src/org/eclipse/gef/examples/text/tools/TextTool.java >--- /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/tools/TextTool.java 2005-05-09 13:26:56.000000000 -0700 >+++ src/org/eclipse/gef/examples/text/tools/TextTool.java 2005-07-28 15:08:50.000000000 -0700 >@@ -26,6 +26,7 @@ > import org.eclipse.jface.viewers.SelectionChangedEvent; > > import org.eclipse.draw2d.Cursors; >+import org.eclipse.draw2d.text.CaretInfo; > import org.eclipse.draw2d.geometry.Rectangle; > > import org.eclipse.gef.DragTracker; >@@ -340,6 +341,10 @@ > else > getTextualViewer().setSelectionRange(new SelectionRange(newCaretLocation, newCaretLocation, false)); > } >+ >+ // Scroll the view >+ CaretInfo newCaretInfo = newCaretLocation.part.getCaretPlacement(newCaretLocation.offset, false); >+ getTextualViewer().refreshViewport(newCaretInfo); > } > > /**
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 105384
: 25467