diff options
author | Markus Keller | 2013-02-15 14:47:06 +0000 |
---|---|---|
committer | Matthias Sohn | 2013-02-20 23:04:34 +0000 |
commit | 23251a552f7f01d2934d0c3b9e497a17f5a84a64 (patch) | |
tree | 4ac244fb7854b233e5dab278156b1806200dd642 | |
parent | 1295b048f7b196e6ef6b7ac69fcf09a1bda2f8a5 (diff) | |
download | egit-23251a552f7f01d2934d0c3b9e497a17f5a84a64.tar.gz egit-23251a552f7f01d2934d0c3b9e497a17f5a84a64.tar.xz egit-23251a552f7f01d2934d0c3b9e497a17f5a84a64.zip |
Workaround for bug in StyledText#addBidiSegmentListener(..)
Due to bug 400727, that listener is only called on Windows when an RTL
input language is installed. The fix is to detect this situation and
resort to a workaround: Restrict the maximum width of the message area
to MAX_LINE_WIDTH.
Bug: 400662
Change-Id: Ic05725cd37230b2ecdac769dfdadb03dacfe7276
Signed-off-by: Markus Keller <markus_keller@ch.ibm.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
-rw-r--r-- | org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/SpellcheckableMessageArea.java | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/SpellcheckableMessageArea.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/SpellcheckableMessageArea.java index 93de5997b7..bb0c5a4223 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/SpellcheckableMessageArea.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/SpellcheckableMessageArea.java @@ -77,9 +77,11 @@ import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Layout; import org.eclipse.ui.ActiveShellExpression; import org.eclipse.ui.IWorkbenchCommandConstants; import org.eclipse.ui.PlatformUI; @@ -212,6 +214,9 @@ public class SpellcheckableMessageArea extends Composite { private BidiSegmentListener hardWrapSegmentListener; + // XXX: workaround for https://bugs.eclipse.org/400727 + private int brokenBidiPlatformTextWidth; + private ActionHandler quickFixActionHandler; private ActionHandler contentAssistActionHandler; @@ -258,6 +263,8 @@ public class SpellcheckableMessageArea extends Composite { Point size = getTextWidget().computeSize(textWidth, textHeight); getTextWidget().setSize(size); + computeBrokenBidiPlatformTextWidth(size.x); + getTextWidget().setEditable(!readOnly); createMarginPainter(); @@ -269,6 +276,9 @@ public class SpellcheckableMessageArea extends Composite { getDisplay().asyncExec(new Runnable() { public void run() { configureHardWrap(); + if (brokenBidiPlatformTextWidth != -1) { + layout(); + } } }); } @@ -320,6 +330,24 @@ public class SpellcheckableMessageArea extends Composite { }); } + private void computeBrokenBidiPlatformTextWidth(int textWidth) { + class BidiSegmentListenerTester implements BidiSegmentListener { + boolean called; + + public void lineGetSegments(BidiSegmentEvent event) { + called = true; + } + } + BidiSegmentListenerTester tester = new BidiSegmentListenerTester(); + StyledText textWidget = getTextWidget(); + textWidget.addBidiSegmentListener(tester); + textWidget.setText(" "); //$NON-NLS-1$ + textWidget.computeSize(SWT.DEFAULT, SWT.DEFAULT); + textWidget.removeBidiSegmentListener(tester); + + brokenBidiPlatformTextWidth = tester.called ? -1 : textWidth; + } + private boolean isEditable(ISourceViewer viewer) { return viewer != null && viewer.getTextWidget().getEditable(); } @@ -327,7 +355,7 @@ public class SpellcheckableMessageArea extends Composite { private void configureHardWrap() { if (shouldHardWrap()) { if (hardWrapSegmentListener == null) { - StyledText textWidget = getTextWidget(); + final StyledText textWidget = getTextWidget(); hardWrapSegmentListener = new BidiSegmentListener() { public void lineGetSegments(BidiSegmentEvent e) { int[] segments = calculateWrapOffsets(e.lineText, MAX_LINE_WIDTH); @@ -341,12 +369,43 @@ public class SpellcheckableMessageArea extends Composite { }; textWidget.addBidiSegmentListener(hardWrapSegmentListener); textWidget.setText(textWidget.getText()); // XXX: workaround for https://bugs.eclipse.org/384886 + + if (brokenBidiPlatformTextWidth != -1) { + Layout restrictedWidthLayout = new Layout() { + @Override + protected Point computeSize(Composite composite, + int wHint, int hHint, boolean flushCache) { + Point size = SpellcheckableMessageArea.this + .getSize(); + Rectangle trim = SpellcheckableMessageArea.this + .computeTrim(0, 0, 0, 0); + size.x -= trim.width; + size.y -= trim.height; + if (size.x > brokenBidiPlatformTextWidth) + size.x = brokenBidiPlatformTextWidth; + return size; + } + + @Override + protected void layout(Composite composite, + boolean flushCache) { + Point size = computeSize(composite, SWT.DEFAULT, + SWT.DEFAULT, flushCache); + textWidget.setBounds(0, 0, size.x, size.y); + } + }; + setLayout(restrictedWidthLayout); + } } + } else if (hardWrapSegmentListener != null) { StyledText textWidget = getTextWidget(); textWidget.removeBidiSegmentListener(hardWrapSegmentListener); textWidget.setText(textWidget.getText()); // XXX: workaround for https://bugs.eclipse.org/384886 hardWrapSegmentListener = null; + + if (brokenBidiPlatformTextWidth != -1) + setLayout(new FillLayout()); } } |