From f664d297f7bb009784868bf3fcf0b3e3bb9a646b Mon Sep 17 00:00:00 2001 From: Felipe Heidrich Date: Tue, 30 Jun 2009 22:00:12 +0000 Subject: *** empty log message *** --- .../org/eclipse/swt/custom/AnimatedProgress.java | 221 - .../org/eclipse/swt/custom/BidiSegmentEvent.java | 86 - .../eclipse/swt/custom/BidiSegmentListener.java | 40 - .../common/org/eclipse/swt/custom/Bullet.java | 156 - .../org/eclipse/swt/custom/BusyIndicator.java | 82 - .../common/org/eclipse/swt/custom/CBanner.java | 558 -- .../org/eclipse/swt/custom/CBannerLayout.java | 188 - .../common/org/eclipse/swt/custom/CCombo.java | 1793 ---- .../common/org/eclipse/swt/custom/CLabel.java | 826 -- .../common/org/eclipse/swt/custom/CLayoutData.java | 45 - .../common/org/eclipse/swt/custom/CTabFolder.java | 4031 --------- .../org/eclipse/swt/custom/CTabFolder2Adapter.java | 83 - .../eclipse/swt/custom/CTabFolder2Listener.java | 112 - .../org/eclipse/swt/custom/CTabFolderAdapter.java | 24 - .../org/eclipse/swt/custom/CTabFolderEvent.java | 92 - .../org/eclipse/swt/custom/CTabFolderLayout.java | 82 - .../org/eclipse/swt/custom/CTabFolderListener.java | 41 - .../common/org/eclipse/swt/custom/CTabItem.java | 1053 --- .../common/org/eclipse/swt/custom/CaretEvent.java | 36 - .../org/eclipse/swt/custom/CaretListener.java | 39 - .../org/eclipse/swt/custom/ControlEditor.java | 255 - .../org/eclipse/swt/custom/DefaultContent.java | 881 -- .../eclipse/swt/custom/ExtendedModifyEvent.java | 42 - .../eclipse/swt/custom/ExtendedModifyListener.java | 40 - .../eclipse/swt/custom/LineBackgroundEvent.java | 54 - .../eclipse/swt/custom/LineBackgroundListener.java | 39 - .../org/eclipse/swt/custom/LineStyleEvent.java | 103 - .../org/eclipse/swt/custom/LineStyleListener.java | 39 - .../org/eclipse/swt/custom/MovementEvent.java | 74 - .../org/eclipse/swt/custom/MovementListener.java | 67 - .../org/eclipse/swt/custom/PaintObjectEvent.java | 84 - .../eclipse/swt/custom/PaintObjectListener.java | 40 - .../common/org/eclipse/swt/custom/PopupList.java | 274 - .../common/org/eclipse/swt/custom/ST.java | 140 - .../common/org/eclipse/swt/custom/SashForm.java | 446 - .../org/eclipse/swt/custom/SashFormData.java | 33 - .../org/eclipse/swt/custom/SashFormLayout.java | 192 - .../org/eclipse/swt/custom/ScrolledComposite.java | 700 -- .../swt/custom/ScrolledCompositeLayout.java | 112 - .../common/org/eclipse/swt/custom/StackLayout.java | 148 - .../common/org/eclipse/swt/custom/StyleRange.java | 213 - .../common/org/eclipse/swt/custom/StyledText.java | 9475 -------------------- .../org/eclipse/swt/custom/StyledTextContent.java | 207 - .../swt/custom/StyledTextDropTargetEffect.java | 242 - .../org/eclipse/swt/custom/StyledTextEvent.java | 50 - .../org/eclipse/swt/custom/StyledTextListener.java | 101 - .../eclipse/swt/custom/StyledTextPrintOptions.java | 104 - .../org/eclipse/swt/custom/StyledTextRenderer.java | 1568 ---- .../common/org/eclipse/swt/custom/TableCursor.java | 778 -- .../common/org/eclipse/swt/custom/TableEditor.java | 260 - .../common/org/eclipse/swt/custom/TableTree.java | 818 -- .../org/eclipse/swt/custom/TableTreeEditor.java | 259 - .../org/eclipse/swt/custom/TableTreeItem.java | 876 -- .../org/eclipse/swt/custom/TextChangeListener.java | 61 - .../org/eclipse/swt/custom/TextChangedEvent.java | 35 - .../org/eclipse/swt/custom/TextChangingEvent.java | 71 - .../common/org/eclipse/swt/custom/TreeEditor.java | 319 - .../org/eclipse/swt/custom/VerifyKeyListener.java | 36 - .../common/org/eclipse/swt/custom/ViewForm.java | 476 - .../org/eclipse/swt/custom/ViewFormLayout.java | 211 - .../common/org/eclipse/swt/custom/package.html | 15 - 61 files changed, 29526 deletions(-) delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/AnimatedProgress.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BidiSegmentEvent.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BidiSegmentListener.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/Bullet.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BusyIndicator.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CBanner.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CBannerLayout.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CCombo.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CLabel.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CLayoutData.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder2Adapter.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder2Listener.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderAdapter.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderEvent.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderLayout.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderListener.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabItem.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CaretEvent.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CaretListener.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ControlEditor.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/DefaultContent.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ExtendedModifyEvent.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ExtendedModifyListener.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineBackgroundEvent.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineBackgroundListener.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineStyleEvent.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineStyleListener.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/MovementEvent.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/MovementListener.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/PaintObjectEvent.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/PaintObjectListener.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/PopupList.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ST.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/SashForm.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/SashFormData.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/SashFormLayout.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ScrolledComposite.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ScrolledCompositeLayout.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StackLayout.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyleRange.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledText.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextContent.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextDropTargetEffect.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextEvent.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextListener.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextPrintOptions.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextRenderer.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableCursor.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableEditor.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableTree.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableTreeEditor.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableTreeItem.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TextChangeListener.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TextChangedEvent.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TextChangingEvent.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TreeEditor.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/VerifyKeyListener.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ViewForm.java delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ViewFormLayout.java delete mode 100755 bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/package.html (limited to 'bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom') diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/AnimatedProgress.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/AnimatedProgress.java deleted file mode 100755 index 41b34f7907..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/AnimatedProgress.java +++ /dev/null @@ -1,221 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.events.*; - -/** - * A control for showing progress feedback for a long running operation. - * - * @deprecated As of Eclipse 2.1, use ProgressBar with the style SWT.INDETERMINATE - * - *
- *
Styles:
VERTICAL, HORIZONTAL, BORDER - *
- * - * @see Sample code and further information - */ -public class AnimatedProgress extends Canvas { - - static final int SLEEP = 70; - static final int DEFAULT_WIDTH = 160; - static final int DEFAULT_HEIGHT = 18; - boolean active = false; - boolean showStripes = false; - int value; - int orientation = SWT.HORIZONTAL; - boolean showBorder = false; - -/** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - *

- * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

- * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException - * @exception SWTException - * - * @see SWT#VERTICAL - * @see SWT#HORIZONTAL - * @see SWT#BORDER - * @see #getStyle() - */ -public AnimatedProgress(Composite parent, int style) { - super(parent, checkStyle(style)); - - if ((style & SWT.VERTICAL) != 0) { - orientation = SWT.VERTICAL; - } - showBorder = (style & SWT.BORDER) != 0; - - addControlListener(new ControlAdapter() { - public void controlResized(ControlEvent e) { - redraw(); - } - }); - addPaintListener(new PaintListener() { - public void paintControl(PaintEvent e) { - paint(e); - } - }); - addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent e){ - stop(); - } - }); -} -private static int checkStyle (int style) { - int mask = SWT.NONE; - return style & mask; -} -/** - * Stop the animation if it is not already stopped and - * reset the presentation to a blank appearance. - * - * @exception SWTException - */ -public synchronized void clear(){ - checkWidget(); - if (active) stop(); - showStripes = false; - redraw(); -} -public Point computeSize(int wHint, int hHint, boolean changed) { - checkWidget(); - Point size = null; - if (orientation == SWT.HORIZONTAL) { - size = new Point(DEFAULT_WIDTH, DEFAULT_HEIGHT); - } else { - size = new Point(DEFAULT_HEIGHT, DEFAULT_WIDTH); - } - if (wHint != SWT.DEFAULT) size.x = wHint; - if (hHint != SWT.DEFAULT) size.y = hHint; - - return size; -} -private void drawBevelRect(GC gc, int x, int y, int w, int h, Color topleft, Color bottomright) { - gc.setForeground(topleft); - gc.drawLine(x, y, x+w-1, y); - gc.drawLine(x, y, x, y+h-1); - - gc.setForeground(bottomright); - gc.drawLine(x+w, y, x+w, y+h); - gc.drawLine(x, y+h, x+w, y+h); -} -void paint(PaintEvent event) { - GC gc = event.gc; - Display disp= getDisplay(); - - Rectangle rect= getClientArea(); - gc.fillRectangle(rect); - if (showBorder) { - drawBevelRect(gc, rect.x, rect.y, rect.width-1, rect.height-1, - disp.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW), - disp.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW)); - } - - paintStripes(gc); -} -void paintStripes(GC gc) { - - if (!showStripes) return; - - Rectangle rect= getClientArea(); - // Subtracted border painted by paint. - rect = new Rectangle(rect.x+2, rect.y+2, rect.width-4, rect.height-4); - - gc.setLineWidth(2); - gc.setClipping(rect); - Color color = getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION); - gc.setBackground(color); - gc.fillRectangle(rect); - gc.setForeground(this.getBackground()); - int step = 12; - int foregroundValue = value == 0 ? step - 2 : value - 2; - if (orientation == SWT.HORIZONTAL) { - int y = rect.y - 1; - int w = rect.width; - int h = rect.height + 2; - for (int i= 0; i < w; i+= step) { - int x = i + foregroundValue; - gc.drawLine(x, y, x, h); - } - } else { - int x = rect.x - 1; - int w = rect.width + 2; - int h = rect.height; - - for (int i= 0; i < h; i+= step) { - int y = i + foregroundValue; - gc.drawLine(x, y, w, y); - } - } - - if (active) { - value = (value + 2) % step; - } -} -/** -* Start the animation. -* -* @exception SWTException -*/ -public synchronized void start() { - checkWidget(); - if (active) return; - - active = true; - showStripes = true; - - final Display display = getDisplay(); - final Runnable [] timer = new Runnable [1]; - timer [0] = new Runnable () { - public void run () { - if (!active) return; - GC gc = new GC(AnimatedProgress.this); - paintStripes(gc); - gc.dispose(); - display.timerExec (SLEEP, timer [0]); - } - }; - display.timerExec (SLEEP, timer [0]); -} -/** -* Stop the animation. Freeze the presentation at its current appearance. -*/ -public synchronized void stop() { - //checkWidget(); - active = false; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BidiSegmentEvent.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BidiSegmentEvent.java deleted file mode 100644 index cafd31fcd6..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BidiSegmentEvent.java +++ /dev/null @@ -1,86 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -import org.eclipse.swt.events.*; - -/** - * This event is sent to BidiSegmentListeners when a line is to - * be measured or rendered in a bidi locale. The segments field is - * used to specify text ranges in the line that should be treated as - * separate segments for bidi reordering. Each segment will be reordered - * and rendered separately. - *

- * The elements in the segments field specify the start offset of - * a segment relative to the start of the line. They must follow - * the following rules: - *

- * In addition, the last element may be set to the end of the line - * but this is not required. - * - * The segments field may be left null if the entire line should - * be reordered as is. - *

- * A BidiSegmentListener may be used when adjacent segments of - * right-to-left text should not be reordered relative to each other. - * For example, within a Java editor, you may wish multiple - * right-to-left string literals to be reordered differently than the - * bidi algorithm specifies. - * - * Example: - *
- * 	stored line = "R1R2R3" + "R4R5R6"
- *		R1 to R6 are right-to-left characters. The quotation marks
- * 		are part of the line text. The line is 13 characters long.
- * 
- * 	segments = null: 
- * 		entire line will be reordered and thus the two R2L segments 
- * 		swapped (as per the bidi algorithm). 
- *		visual line (rendered on screen) = "R6R5R4" + "R3R2R1"
- * 
- * 	segments = [0, 5, 8]	
- * 		"R1R2R3" will be reordered, followed by [blank]+[blank] and 
- * 		"R4R5R6". 
- *		visual line = "R3R2R1" + "R6R5R4"
- * 
- * - * @see Sample code and further information - */ -public class BidiSegmentEvent extends TypedEvent { - - /** - * line start offset - */ - public int lineOffset; - - /** - * line text - */ - public String lineText; - - /** - * bidi segments, see above - */ - public int[] segments; - - static final long serialVersionUID = 3257846571587547957L; - -BidiSegmentEvent(StyledTextEvent e) { - super(e); - lineOffset = e.detail; - lineText = e.text; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BidiSegmentListener.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BidiSegmentListener.java deleted file mode 100644 index e1d9770623..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BidiSegmentListener.java +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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.swt.custom; - -import org.eclipse.swt.internal.SWTEventListener; - -/** - * This listener interface may be implemented in order to receive - * BidiSegmentEvents. - * @see BidiSegmentEvent - */ -public interface BidiSegmentListener extends SWTEventListener { - -/** - * This method is called when a line needs to be reordered for - * measuring or rendering in a bidi locale. - *

- * The following event fields are used:

- * - * @param event the given event - * separately. (output) - * @see BidiSegmentEvent - */ -public void lineGetSegments(BidiSegmentEvent event); - -} - diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/Bullet.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/Bullet.java deleted file mode 100644 index 69c4694d3f..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/Bullet.java +++ /dev/null @@ -1,156 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.*; - -/** - * Instances of this class represent bullets in the StyledText. - *

- * The hashCode() method in this class uses the values of the public - * fields to compute the hash value. When storing instances of the - * class in hashed collections, do not modify these fields after the - * object has been inserted. - *

- *

- * Application code does not need to explicitly release the - * resources managed by each instance when those instances are no longer - * required, and thus no dispose() method is provided. - *

- * - * @see StyledText#setLineBullet(int, int, Bullet) - * @see Sample code and further information - * - * @since 3.2 - */ -public class Bullet { - /** - * The bullet type. Possible values are: - * - */ - public int type; - - /** - * The bullet style. - */ - public StyleRange style; - - /** - * The bullet text. - */ - public String text; - - int[] linesIndices; - int count; - -/** - * Create a new bullet with the specified style, and type ST.BULLET_DOT. - * The style must have a glyph metrics set. - * - * @param style the style - * - * @exception IllegalArgumentException - */ -public Bullet(StyleRange style) { - this(ST.BULLET_DOT, style); -} -/** - * Create a new bullet the specified style and type. - * The style must have a glyph metrics set. - * - * @param type the bullet type - * @param style the style - * - * @exception IllegalArgumentException - */ -public Bullet(int type, StyleRange style) { - if (style == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (style.metrics == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - this.type = type; - this.style = style; -} -void addIndices (int startLine, int lineCount) { - if (linesIndices == null) { - linesIndices = new int[lineCount]; - count = lineCount; - for (int i = 0; i < lineCount; i++) linesIndices[i] = startLine + i; - } else { - int modifyStart = 0; - while (modifyStart < count) { - if (startLine <= linesIndices[modifyStart]) break; - modifyStart++; - } - int modifyEnd = modifyStart; - while (modifyEnd < count) { - if (startLine + lineCount <= linesIndices[modifyEnd]) break; - modifyEnd++; - } - int newSize = modifyStart + lineCount + count - modifyEnd; - if (newSize > linesIndices.length) { - int[] newLinesIndices = new int[newSize]; - System.arraycopy(linesIndices, 0, newLinesIndices, 0, count); - linesIndices = newLinesIndices; - } - System.arraycopy(linesIndices, modifyEnd, linesIndices, modifyStart + lineCount, count - modifyEnd); - for (int i = 0; i < lineCount; i++) linesIndices[modifyStart + i] = startLine + i; - count = newSize; - } -} -int indexOf (int lineIndex) { - for (int i = 0; i < count; i++) { - if (linesIndices[i] == lineIndex) return i; - } - return -1; -} -public int hashCode() { - return style.hashCode() ^ type; -} -int[] removeIndices (int startLine, int replaceLineCount, int newLineCount, boolean update) { - if (count == 0) return null; - if (startLine > linesIndices[count - 1]) return null; - int endLine = startLine + replaceLineCount; - int delta = newLineCount - replaceLineCount; - for (int i = 0; i < count; i++) { - int index = linesIndices[i]; - if (startLine <= index) { - int j = i; - while (j < count) { - if (linesIndices[j] >= endLine) break; - j++; - } - if (update) { - for (int k = j; k < count; k++) linesIndices[k] += delta; - } - int[] redrawLines = new int[count - j]; - System.arraycopy(linesIndices, j, redrawLines, 0, count - j); - System.arraycopy(linesIndices, j, linesIndices, i, count - j); - count -= (j - i); - return redrawLines; - } - } - for (int i = 0; i < count; i++) linesIndices[i] += delta; - return null; -} -int size() { - return count; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BusyIndicator.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BusyIndicator.java deleted file mode 100755 index 7f2f39deeb..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/BusyIndicator.java +++ /dev/null @@ -1,82 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * Support for showing a Busy Cursor during a long running process. - * - * @see BusyIndicator snippets - * @see Sample code and further information - */ -public class BusyIndicator { - - static int nextBusyId = 1; - static final String BUSYID_NAME = "SWT BusyIndicator"; //$NON-NLS-1$ - static final String BUSY_CURSOR = "SWT BusyIndicator Cursor"; //$NON-NLS-1$ - -/** - * Runs the given Runnable while providing - * busy feedback using this busy indicator. - * - * @param display the display on which the busy feedback should be - * displayed. If the display is null, the Display for the current - * thread will be used. If there is no Display for the current thread, - * the runnable code will be executed and no busy feedback will be displayed. - * @param runnable the runnable for which busy feedback is to be shown. - * Must not be null. - * -* @exception IllegalArgumentException - */ - -public static void showWhile(Display display, Runnable runnable) { - if (runnable == null) - SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (display == null) { - display = Display.getCurrent(); - if (display == null) { - runnable.run(); - return; - } - } - - Integer busyId = new Integer(nextBusyId); - nextBusyId++; - Cursor cursor = display.getSystemCursor(SWT.CURSOR_WAIT); - Shell[] shells = display.getShells(); - for (int i = 0; i < shells.length; i++) { - Integer id = (Integer)shells[i].getData(BUSYID_NAME); - if (id == null) { - shells[i].setCursor(cursor); - shells[i].setData(BUSYID_NAME, busyId); - } - } - - try { - runnable.run(); - } finally { - shells = display.getShells(); - for (int i = 0; i < shells.length; i++) { - Integer id = (Integer)shells[i].getData(BUSYID_NAME); - if (id == busyId) { - shells[i].setCursor(null); - shells[i].setData(BUSYID_NAME, null); - } - } - } -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CBanner.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CBanner.java deleted file mode 100644 index 0a20c6b2ee..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CBanner.java +++ /dev/null @@ -1,558 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 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.swt.custom; - - -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.*; - -/** - * Instances of this class implement a Composite that lays out its - * children and allows programmatic control of the layout. It draws - * a separator between the left and right children which can be dragged - * to resize the right control. - * CBanner is used in the workbench to layout the toolbar area and - * perspective switching toolbar. - *

- * Note that although this class is a subclass of Composite, - * it does not make sense to set a layout on it. - *

- *

- *
Styles:
- *
NONE
- *
Events:
- *
(None)
- *
- *

- * IMPORTANT: This class is not intended to be subclassed. - *

- * - * @see Sample code and further information - * - * @since 3.0 - * @noextend This class is not intended to be subclassed by clients. - */ - -public class CBanner extends Composite { - - Control left; - Control right; - Control bottom; - - boolean simple = true; - - int[] curve = new int[0]; - int curveStart = 0; - Rectangle curveRect = new Rectangle(0, 0, 0, 0); - int curve_width = 5; - int curve_indent = -2; - - int rightWidth = SWT.DEFAULT; - int rightMinWidth = 0; - int rightMinHeight = 0; - Cursor resizeCursor; - boolean dragging = false; - int rightDragDisplacement = 0; - Listener listener; - - static final int OFFSCREEN = -200; - static final int BORDER_BOTTOM = 2; - static final int BORDER_TOP = 3; - static final int BORDER_STRIPE = 1; - static final int CURVE_TAIL = 200; - static final int BEZIER_RIGHT = 30; - static final int BEZIER_LEFT = 30; - static final int MIN_LEFT = 10; - static int BORDER1 = SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW; - - -/** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - *

- * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

- * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException - * @exception SWTException - * - */ -public CBanner(Composite parent, int style) { - super(parent, checkStyle(style)); - super.setLayout(new CBannerLayout()); - resizeCursor = new Cursor(getDisplay(), SWT.CURSOR_SIZEWE); - - listener = new Listener() { - public void handleEvent(Event e) { - switch (e.type) { - case SWT.Dispose: - onDispose(e); break; - case SWT.MouseDown: - onMouseDown (e.x, e.y); break; - case SWT.MouseExit: - onMouseExit(); break; - case SWT.MouseMove: - onMouseMove(e.x, e.y); break; - case SWT.MouseUp: - onMouseUp(); break; - case SWT.Paint: - onPaint(e.gc); break; - case SWT.Resize: - onResize(); break; - } - } - }; - int[] events = new int[] {SWT.Dispose, SWT.MouseDown, SWT.MouseExit, SWT.MouseMove, SWT.MouseUp, SWT.Paint, SWT.Resize}; - for (int i = 0; i < events.length; i++) { - addListener(events[i], listener); - } -} -static int[] bezier(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3, int count) { - // The parametric equations for a Bezier curve for x[t] and y[t] where 0 <= t <=1 are: - // x[t] = x0+3(x1-x0)t+3(x0+x2-2x1)t^2+(x3-x0+3x1-3x2)t^3 - // y[t] = y0+3(y1-y0)t+3(y0+y2-2y1)t^2+(y3-y0+3y1-3y2)t^3 - double a0 = x0; - double a1 = 3*(x1 - x0); - double a2 = 3*(x0 + x2 - 2*x1); - double a3 = x3 - x0 + 3*x1 - 3*x2; - double b0 = y0; - double b1 = 3*(y1 - y0); - double b2 = 3*(y0 + y2 - 2*y1); - double b3 = y3 - y0 + 3*y1 - 3*y2; - - int[] polygon = new int[2*count + 2]; - for (int i = 0; i <= count; i++) { - double t = (double)i / (double)count; - polygon[2*i] = (int)(a0 + a1*t + a2*t*t + a3*t*t*t); - polygon[2*i + 1] = (int)(b0 + b1*t + b2*t*t + b3*t*t*t); - } - return polygon; -} -static int checkStyle (int style) { - return SWT.NONE; -} -/* -* This class was not intended to be subclassed but this restriction -* cannot be enforced without breaking backward compatibility. -*/ -//protected void checkSubclass () { -// String name = getClass ().getName (); -// int index = name.lastIndexOf ('.'); -// if (!name.substring (0, index + 1).equals ("org.eclipse.swt.custom.")) { -// SWT.error (SWT.ERROR_INVALID_SUBCLASS); -// } -//} -/** -* Returns the Control that appears on the bottom side of the banner. -* -* @return the control that appears on the bottom side of the banner or null -* -* @exception SWTException -* -* @since 3.0 -*/ -public Control getBottom() { - checkWidget(); - return bottom; -} -public Rectangle getClientArea() { - return new Rectangle(0, 0, 0, 0); -} - -/** -* Returns the Control that appears on the left side of the banner. -* -* @return the control that appears on the left side of the banner or null -* -* @exception SWTException -* -* @since 3.0 -*/ -public Control getLeft() { - checkWidget(); - return left; -} - -/** -* Returns the Control that appears on the right side of the banner. -* -* @return the control that appears on the right side of the banner or null -* -* @exception SWTException -* -* @since 3.0 -*/ -public Control getRight() { - checkWidget(); - return right; -} -/** - * Returns the minimum size of the control that appears on the right of the banner. - * - * @return the minimum size of the control that appears on the right of the banner - * - * @since 3.1 - */ -public Point getRightMinimumSize() { - checkWidget(); - return new Point(rightMinWidth, rightMinHeight); -} -/** - * Returns the width of the control that appears on the right of the banner. - * - * @return the width of the control that appears on the right of the banner - * - * @since 3.0 - */ -public int getRightWidth() { - checkWidget(); - if (right == null) return 0; - if (rightWidth == SWT.DEFAULT) { - Point size = right.computeSize(SWT.DEFAULT, SWT.DEFAULT, false); - return size.x; - } - return rightWidth; -} -/** - * Returns true if the CBanner is rendered - * with a simple, traditional shape. - * - * @return true if the CBanner is rendered with a simple shape - * - * @since 3.0 - */ -public boolean getSimple() { - checkWidget(); - return simple; -} -void onDispose(Event event) { - removeListener(SWT.Dispose, listener); - notifyListeners(SWT.Dispose, event); - event.type = SWT.None; - - if (resizeCursor != null) resizeCursor.dispose(); - resizeCursor = null; - left = null; - right = null; - bottom = null; -} -void onMouseDown (int x, int y) { - if (curveRect.contains(x, y)) { - dragging = true; - rightDragDisplacement = curveStart - x + curve_width - curve_indent; - } -} -void onMouseExit() { - if (!dragging) setCursor(null); -} -void onMouseMove(int x, int y) { - if (dragging) { - Point size = getSize(); - if (!(0 < x && x < size.x)) return; - rightWidth = Math.max(0, size.x - x - rightDragDisplacement); - if (rightMinWidth == SWT.DEFAULT) { - Point minSize = right.computeSize(rightMinWidth, rightMinHeight); - rightWidth = Math.max(minSize.x, rightWidth); - } else { - rightWidth = Math.max(rightMinWidth, rightWidth); - } - layout(false); - return; - } - if (curveRect.contains(x, y)) { - setCursor(resizeCursor); - } else { - setCursor(null); - } -} -void onMouseUp () { - dragging = false; -} -void onPaint(GC gc) { -// Useful for debugging paint problems -// { -// Point size = getSize(); -// gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_GREEN)); -// gc.fillRectangle(-10, -10, size.x+20, size.y+20); -// } - if (left == null && right == null) return; - Point size = getSize(); - Color border1 = getDisplay().getSystemColor(BORDER1); - if (bottom != null) { - int y = bottom.getBounds().y - BORDER_STRIPE - 1; - gc.setForeground(border1); - gc.drawLine(0, y, size.x, y); - } - if (left == null || right == null) return; - int[] line1 = new int[curve.length+6]; - int index = 0; - int x = curveStart; - line1[index++] = x + 1; - line1[index++] = size.y - BORDER_STRIPE; - for (int i = 0; i < curve.length/2; i++) { - line1[index++]=x+curve[2*i]; - line1[index++]=curve[2*i+1]; - } - line1[index++] = x + curve_width; - line1[index++] = 0; - line1[index++] = size.x; - line1[index++] = 0; - - Color background = getBackground(); - - if (getDisplay().getDepth() >= 15) { - // Anti- aliasing - int[] line2 = new int[line1.length]; - index = 0; - for (int i = 0; i < line1.length/2; i++) { - line2[index] = line1[index++] - 1; - line2[index] = line1[index++]; - } - int[] line3 = new int[line1.length]; - index = 0; - for (int i = 0; i < line1.length/2; i++) { - line3[index] = line1[index++] + 1; - line3[index] = line1[index++]; - } - RGB from = border1.getRGB(); - RGB to = background.getRGB(); - int red = from.red + 3*(to.red - from.red)/4; - int green = from.green + 3*(to.green - from.green)/4; - int blue = from.blue + 3*(to.blue - from.blue)/4; - Color color = new Color(getDisplay(), red, green, blue); - gc.setForeground(color); - gc.drawPolyline(line2); - gc.drawPolyline(line3); - color.dispose(); - - // draw tail fading to background - int x1 = Math.max(0, curveStart - CURVE_TAIL); - gc.setForeground(background); - gc.setBackground(border1); - gc.fillGradientRectangle(x1, size.y - BORDER_STRIPE, curveStart-x1+1, 1, false); - } else { - // draw solid tail - int x1 = Math.max(0, curveStart - CURVE_TAIL); - gc.setForeground(border1); - gc.drawLine(x1, size.y - BORDER_STRIPE, curveStart+1, size.y - BORDER_STRIPE); - } - - // draw border - gc.setForeground(border1); - gc.drawPolyline(line1); -} - -void onResize() { - updateCurve(getSize().y); -} -/** -* Set the control that appears on the bottom side of the banner. -* The bottom control is optional. Setting the bottom control to null will remove it from -* the banner - however, the creator of the control must dispose of the control. -* -* @param control the control to be displayed on the bottom or null -* -* @exception SWTException -* -* @since 3.0 -*/ -public void setBottom(Control control) { - checkWidget(); - if (control != null && control.getParent() != this) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (bottom != null && !bottom.isDisposed()) { - Point size = bottom.getSize(); - bottom.setLocation(OFFSCREEN - size.x, OFFSCREEN - size.y); - } - bottom = control; - layout(false); -} -/** - * Sets the layout which is associated with the receiver to be - * the argument which may be null. - *

- * Note: No Layout can be set on this Control because it already - * manages the size and position of its children. - *

- * - * @param layout the receiver's new layout or null - * - * @exception SWTException - */ -public void setLayout (Layout layout) { - checkWidget(); - return; -} - -/** -* Set the control that appears on the left side of the banner. -* The left control is optional. Setting the left control to null will remove it from -* the banner - however, the creator of the control must dispose of the control. -* -* @param control the control to be displayed on the left or null -* -* @exception SWTException -* -* @since 3.0 -*/ -public void setLeft(Control control) { - checkWidget(); - if (control != null && control.getParent() != this) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (left != null && !left.isDisposed()) { - Point size = left.getSize(); - left.setLocation(OFFSCREEN - size.x, OFFSCREEN - size.y); - } - left = control; - layout(false); -} -/** -* Set the control that appears on the right side of the banner. -* The right control is optional. Setting the right control to null will remove it from -* the banner - however, the creator of the control must dispose of the control. -* -* @param control the control to be displayed on the right or null -* -* @exception SWTException -* -* @since 3.0 -*/ -public void setRight(Control control) { - checkWidget(); - if (control != null && control.getParent() != this) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (right != null && !right.isDisposed()) { - Point size = right.getSize(); - right.setLocation(OFFSCREEN - size.x, OFFSCREEN - size.y); - } - right = control; - layout(false); -} -/** - * Set the minimum height of the control that appears on the right side of the banner. - * - * @param size the minimum size of the control on the right - * - * @exception SWTException - * - * @since 3.1 - */ -public void setRightMinimumSize(Point size) { - checkWidget(); - if (size == null || size.x < SWT.DEFAULT || size.y < SWT.DEFAULT) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - rightMinWidth = size.x; - rightMinHeight = size.y; - layout(false); -} -/** - * Set the width of the control that appears on the right side of the banner. - * - * @param width the width of the control on the right - * - * @exception SWTException - * - * @since 3.0 - */ -public void setRightWidth(int width) { - checkWidget(); - if (width < SWT.DEFAULT) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - rightWidth = width; - layout(false); -} -/** - * Sets the shape that the CBanner will use to render itself. - * - * @param simple true if the CBanner should render itself in a simple, traditional style - * - * @exception SWTException - * - * @since 3.0 - */ -public void setSimple(boolean simple) { - checkWidget(); - if (this.simple != simple) { - this.simple = simple; - if (simple) { - curve_width = 5; - curve_indent = -2; - } else { - curve_width = 50; - curve_indent = 5; - } - updateCurve(getSize().y); - layout(false); - redraw(); - } -} -void updateCurve(int height) { - int h = height - BORDER_STRIPE; - if (simple) { - curve = new int[] {0,h, 1,h, 2,h-1, 3,h-2, - 3,2, 4,1, 5,0,}; - } else { - curve = bezier(0, h+1, BEZIER_LEFT, h+1, - curve_width-BEZIER_RIGHT, 0, curve_width, 0, - curve_width); - } -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CBannerLayout.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CBannerLayout.java deleted file mode 100644 index 2b0b5f19af..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CBannerLayout.java +++ /dev/null @@ -1,188 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * This class provides the layout for CBanner - * - * @see CBanner - */ -class CBannerLayout extends Layout { - -protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { - CBanner banner = (CBanner)composite; - Control left = banner.left; - Control right = banner.right; - Control bottom = banner.bottom; - boolean showCurve = left != null && right != null; - int height = hHint; - int width = wHint; - - // Calculate component sizes - Point bottomSize = new Point(0, 0); - if (bottom != null) { - int trim = computeTrim(bottom); - int w = wHint == SWT.DEFAULT ? SWT.DEFAULT : Math.max(0, width - trim); - bottomSize = computeChildSize(bottom, w, SWT.DEFAULT, flushCache); - } - Point rightSize = new Point(0, 0); - if (right != null) { - int trim = computeTrim(right); - int w = SWT.DEFAULT; - if (banner.rightWidth != SWT.DEFAULT) { - w = banner.rightWidth - trim; - if (left != null) { - w = Math.min(w, width - banner.curve_width + 2* banner.curve_indent - CBanner.MIN_LEFT - trim); - } - w = Math.max(0, w); - } - rightSize = computeChildSize(right, w, SWT.DEFAULT, flushCache); - if (wHint != SWT.DEFAULT) { - width -= rightSize.x + banner.curve_width - 2* banner.curve_indent; - } - } - Point leftSize = new Point(0, 0); - if (left != null) { - int trim = computeTrim(left); - int w = wHint == SWT.DEFAULT ? SWT.DEFAULT : Math.max(0, width - trim); - leftSize = computeChildSize(left, w, SWT.DEFAULT, flushCache); - } - - // Add up sizes - width = leftSize.x + rightSize.x; - height = bottomSize.y; - if (bottom != null && (left != null || right != null)) { - height += CBanner.BORDER_STRIPE + 2; - } - if (left != null) { - if (right == null) { - height += leftSize.y; - } else { - height += Math.max(leftSize.y, banner.rightMinHeight == SWT.DEFAULT ? rightSize.y : banner.rightMinHeight); - } - } else { - height += rightSize.y; - } - if (showCurve) { - width += banner.curve_width - 2*banner.curve_indent; - height += CBanner.BORDER_TOP + CBanner.BORDER_BOTTOM + 2*CBanner.BORDER_STRIPE; - } - - if (wHint != SWT.DEFAULT) width = wHint; - if (hHint != SWT.DEFAULT) height = hHint; - - return new Point(width, height); -} -Point computeChildSize(Control control, int wHint, int hHint, boolean flushCache) { - Object data = control.getLayoutData(); - if (data == null || !(data instanceof CLayoutData)) { - data = new CLayoutData(); - control.setLayoutData(data); - } - return ((CLayoutData)data).computeSize(control, wHint, hHint, flushCache); -} -int computeTrim(Control c) { - if (c instanceof Scrollable) { - Rectangle rect = ((Scrollable) c).computeTrim (0, 0, 0, 0); - return rect.width; - } - return c.getBorderWidth () * 2; -} -protected boolean flushCache(Control control) { - Object data = control.getLayoutData(); - if (data != null && data instanceof CLayoutData) ((CLayoutData)data).flushCache(); - return true; -} -protected void layout(Composite composite, boolean flushCache) { - CBanner banner = (CBanner)composite; - Control left = banner.left; - Control right = banner.right; - Control bottom = banner.bottom; - - Point size = banner.getSize(); - boolean showCurve = left != null && right != null; - int width = size.x - 2*banner.getBorderWidth(); - int height = size.y - 2*banner.getBorderWidth(); - - Point bottomSize = new Point(0, 0); - if (bottom != null) { - int trim = computeTrim(bottom); - int w = Math.max(0, width - trim); - bottomSize = computeChildSize(bottom, w, SWT.DEFAULT, flushCache); - height -= bottomSize.y + CBanner.BORDER_STRIPE + 2; - } - if (showCurve) height -= CBanner.BORDER_TOP + CBanner.BORDER_BOTTOM + 2*CBanner.BORDER_STRIPE; - height = Math.max(0, height); - Point rightSize = new Point(0,0); - if (right != null) { - int trim = computeTrim(right); - int w = SWT.DEFAULT; - if (banner.rightWidth != SWT.DEFAULT) { - w = banner.rightWidth - trim; - if (left != null) { - w = Math.min(w, width - banner.curve_width + 2* banner.curve_indent - CBanner.MIN_LEFT - trim); - } - w = Math.max(0, w); - } - rightSize = computeChildSize(right, w, SWT.DEFAULT, flushCache); - width = width - (rightSize.x - banner.curve_indent + banner.curve_width - banner.curve_indent); - } - Point leftSize = new Point(0, 0); - if (left != null) { - int trim = computeTrim(left); - int w = Math.max(0, width - trim); - leftSize = computeChildSize(left, w, SWT.DEFAULT, flushCache); - } - - int x = 0; - int y = 0; - int oldStart = banner.curveStart; - Rectangle leftRect = null; - Rectangle rightRect = null; - Rectangle bottomRect = null; - if (bottom != null) { - bottomRect = new Rectangle(x, y+size.y-bottomSize.y, bottomSize.x, bottomSize.y); - } - if (showCurve) y += CBanner.BORDER_TOP + CBanner.BORDER_STRIPE; - if(left != null) { - leftRect = new Rectangle(x, y, leftSize.x, leftSize.y); - banner.curveStart = x + leftSize.x - banner.curve_indent; - x += leftSize.x - banner.curve_indent + banner.curve_width - banner.curve_indent; - } - if (right != null) { - if (left != null) { - rightSize.y = Math.max(leftSize.y, banner.rightMinHeight == SWT.DEFAULT ? rightSize.y : banner.rightMinHeight); - } - rightRect = new Rectangle(x, y, rightSize.x, rightSize.y); - } - if (banner.curveStart < oldStart) { - banner.redraw(banner.curveStart - CBanner.CURVE_TAIL, 0, oldStart + banner.curve_width - banner.curveStart + CBanner.CURVE_TAIL + 5, size.y, false); - } - if (banner.curveStart > oldStart) { - banner.redraw(oldStart - CBanner.CURVE_TAIL, 0, banner.curveStart + banner.curve_width - oldStart + CBanner.CURVE_TAIL + 5, size.y, false); - } - /* - * The paint events must be flushed in order to make the curve draw smoothly - * while the user drags the divider. - * On Windows, it is necessary to flush the paints before the children are - * resized because otherwise the children (particularly toolbars) will flash. - */ - banner.update(); - banner.curveRect = new Rectangle(banner.curveStart, 0, banner.curve_width, size.y); - if (bottomRect != null) bottom.setBounds(bottomRect); - if (rightRect != null) right.setBounds(rightRect); - if (leftRect != null) left.setBounds(leftRect); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CCombo.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CCombo.java deleted file mode 100755 index f07a52ab39..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CCombo.java +++ /dev/null @@ -1,1793 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.accessibility.*; - -/** - * The CCombo class represents a selectable user interface object - * that combines a text field and a list and issues notification - * when an item is selected from the list. - *

- * CCombo was written to work around certain limitations in the native - * combo box. Specifically, on win32, the height of a CCombo can be set; - * attempts to set the height of a Combo are ignored. CCombo can be used - * anywhere that having the increased flexibility is more important than - * getting native L&F, but the decision should not be taken lightly. - * There is no is no strict requirement that CCombo look or behave - * the same as the native combo box. - *

- *

- * Note that although this class is a subclass of Composite, - * it does not make sense to add children to it, or set a layout on it. - *

- *
- *
Styles: - *
BORDER, READ_ONLY, FLAT
- *
Events: - *
DefaultSelection, Modify, Selection, Verify
- *
- * - * @see CCombo snippets - * @see SWT Example: CustomControlExample - * @see Sample code and further information - */ -public class CCombo extends Composite { - - Text text; - List list; - int visibleItemCount = 5; - Shell popup; - Button arrow; - boolean hasFocus; - Listener listener, filter; - Color foreground, background; - Font font; - Shell _shell; - - static final String PACKAGE_PREFIX = "org.eclipse.swt.custom."; //$NON-NLS-1$ - -/** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - *

- * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

- * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException - * @exception SWTException - * - * @see SWT#BORDER - * @see SWT#READ_ONLY - * @see SWT#FLAT - * @see Widget#getStyle() - */ -public CCombo (Composite parent, int style) { - super (parent, style = checkStyle (style)); - _shell = super.getShell (); - - int textStyle = SWT.SINGLE; - if ((style & SWT.READ_ONLY) != 0) textStyle |= SWT.READ_ONLY; - if ((style & SWT.FLAT) != 0) textStyle |= SWT.FLAT; - text = new Text (this, textStyle); - int arrowStyle = SWT.ARROW | SWT.DOWN; - if ((style & SWT.FLAT) != 0) arrowStyle |= SWT.FLAT; - arrow = new Button (this, arrowStyle); - - listener = new Listener () { - public void handleEvent (Event event) { - if (isDisposed ()) return; - if (popup == event.widget) { - popupEvent (event); - return; - } - if (text == event.widget) { - textEvent (event); - return; - } - if (list == event.widget) { - listEvent (event); - return; - } - if (arrow == event.widget) { - arrowEvent (event); - return; - } - if (CCombo.this == event.widget) { - comboEvent (event); - return; - } - if (getShell () == event.widget) { - getDisplay().asyncExec(new Runnable() { - public void run() { - if (isDisposed ()) return; - handleFocus (SWT.FocusOut); - } - }); - } - } - }; - filter = new Listener() { - public void handleEvent(Event event) { - if (isDisposed ()) return; - Shell shell = ((Control)event.widget).getShell (); - if (shell == CCombo.this.getShell ()) { - handleFocus (SWT.FocusOut); - } - } - }; - - int [] comboEvents = {SWT.Dispose, SWT.FocusIn, SWT.Move, SWT.Resize}; - for (int i=0; i - *
  • ERROR_NULL_ARGUMENT - if the string is null
  • - * - * @exception SWTException - * - * @see #add(String,int) - */ -public void add (String string) { - checkWidget(); - if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - list.add (string); -} -/** - * Adds the argument to the receiver's list at the given - * zero-relative index. - *

    - * Note: To add an item at the end of the list, use the - * result of calling getItemCount() as the - * index or use add(String). - *

    - * - * @param string the new item - * @param index the index for the item - * - * @exception IllegalArgumentException - * @exception SWTException - * - * @see #add(String) - */ -public void add (String string, int index) { - checkWidget(); - if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - list.add (string, index); -} -/** - * Adds the listener to the collection of listeners who will - * be notified when the receiver's text is modified, by sending - * it one of the messages defined in the ModifyListener - * interface. - * - * @param listener the listener which should be notified - * - * @exception IllegalArgumentException - * @exception SWTException - * - * @see ModifyListener - * @see #removeModifyListener - */ -public void addModifyListener (ModifyListener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - TypedListener typedListener = new TypedListener (listener); - addListener (SWT.Modify, typedListener); -} -/** - * Adds the listener to the collection of listeners who will - * be notified when the user changes the receiver's selection, by sending - * it one of the messages defined in the SelectionListener - * interface. - *

    - * widgetSelected is called when the combo's list selection changes. - * widgetDefaultSelected is typically called when ENTER is pressed the combo's text area. - *

    - * - * @param listener the listener which should be notified when the user changes the receiver's selection - * - * @exception IllegalArgumentException - * @exception SWTException - * - * @see SelectionListener - * @see #removeSelectionListener - * @see SelectionEvent - */ -public void addSelectionListener(SelectionListener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - TypedListener typedListener = new TypedListener (listener); - addListener (SWT.Selection,typedListener); - addListener (SWT.DefaultSelection,typedListener); -} -/** - * Adds the listener to the collection of listeners who will - * be notified when the receiver's text is verified, by sending - * it one of the messages defined in the VerifyListener - * interface. - * - * @param listener the listener which should be notified - * - * @exception IllegalArgumentException - * @exception SWTException - * - * @see VerifyListener - * @see #removeVerifyListener - * - * @since 3.3 - */ -public void addVerifyListener (VerifyListener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - TypedListener typedListener = new TypedListener (listener); - addListener (SWT.Verify,typedListener); -} -void arrowEvent (Event event) { - switch (event.type) { - case SWT.FocusIn: { - handleFocus (SWT.FocusIn); - break; - } - case SWT.MouseDown: { - Event mouseEvent = new Event (); - mouseEvent.button = event.button; - mouseEvent.count = event.count; - mouseEvent.stateMask = event.stateMask; - mouseEvent.time = event.time; - mouseEvent.x = event.x; mouseEvent.y = event.y; - notifyListeners (SWT.MouseDown, mouseEvent); - event.doit = mouseEvent.doit; - break; - } - case SWT.MouseUp: { - Event mouseEvent = new Event (); - mouseEvent.button = event.button; - mouseEvent.count = event.count; - mouseEvent.stateMask = event.stateMask; - mouseEvent.time = event.time; - mouseEvent.x = event.x; mouseEvent.y = event.y; - notifyListeners (SWT.MouseUp, mouseEvent); - event.doit = mouseEvent.doit; - break; - } - case SWT.Selection: { - text.setFocus(); - dropDown (!isDropped ()); - break; - } - } -} -protected void checkSubclass () { - String name = getClass ().getName (); - int index = name.lastIndexOf ('.'); - if (!name.substring (0, index + 1).equals (PACKAGE_PREFIX)) { - SWT.error (SWT.ERROR_INVALID_SUBCLASS); - } -} -/** - * Sets the selection in the receiver's text field to an empty - * selection starting just before the first character. If the - * text field is editable, this has the effect of placing the - * i-beam at the start of the text. - *

    - * Note: To clear the selected items in the receiver's list, - * use deselectAll(). - *

    - * - * @exception SWTException - * - * @see #deselectAll - */ -public void clearSelection () { - checkWidget (); - text.clearSelection (); - list.deselectAll (); -} -void comboEvent (Event event) { - switch (event.type) { - case SWT.Dispose: - removeListener(SWT.Dispose, listener); - notifyListeners(SWT.Dispose, event); - event.type = SWT.None; - - if (popup != null && !popup.isDisposed ()) { - list.removeListener (SWT.Dispose, listener); - popup.dispose (); - } - Shell shell = getShell (); - shell.removeListener (SWT.Deactivate, listener); - Display display = getDisplay (); - display.removeFilter (SWT.FocusIn, filter); - popup = null; - text = null; - list = null; - arrow = null; - _shell = null; - break; - case SWT.FocusIn: - Control focusControl = getDisplay ().getFocusControl (); - if (focusControl == arrow || focusControl == list) return; - if (isDropped()) { - list.setFocus(); - } else { - text.setFocus(); - } - break; - case SWT.Move: - dropDown (false); - break; - case SWT.Resize: - internalLayout (false); - break; - } -} - -public Point computeSize (int wHint, int hHint, boolean changed) { - checkWidget (); - int width = 0, height = 0; - String[] items = list.getItems (); - GC gc = new GC (text); - int spacer = gc.stringExtent (" ").x; //$NON-NLS-1$ - int textWidth = gc.stringExtent (text.getText ()).x; - for (int i = 0; i < items.length; i++) { - textWidth = Math.max (gc.stringExtent (items[i]).x, textWidth); - } - gc.dispose (); - Point textSize = text.computeSize (SWT.DEFAULT, SWT.DEFAULT, changed); - Point arrowSize = arrow.computeSize (SWT.DEFAULT, SWT.DEFAULT, changed); - Point listSize = list.computeSize (SWT.DEFAULT, SWT.DEFAULT, changed); - int borderWidth = getBorderWidth (); - - height = Math.max (textSize.y, arrowSize.y); - width = Math.max (textWidth + 2*spacer + arrowSize.x + 2*borderWidth, listSize.x); - if (wHint != SWT.DEFAULT) width = wHint; - if (hHint != SWT.DEFAULT) height = hHint; - return new Point (width + 2*borderWidth, height + 2*borderWidth); -} -/** - * Copies the selected text. - *

    - * The current selection is copied to the clipboard. - *

    - * - * @exception SWTException - * - * @since 3.3 - */ -public void copy () { - checkWidget (); - text.copy (); -} -void createPopup(String[] items, int selectionIndex) { - // create shell and list - popup = new Shell (getShell (), SWT.NO_TRIM | SWT.ON_TOP); - int style = getStyle (); - int listStyle = SWT.SINGLE | SWT.V_SCROLL; - if ((style & SWT.FLAT) != 0) listStyle |= SWT.FLAT; - if ((style & SWT.RIGHT_TO_LEFT) != 0) listStyle |= SWT.RIGHT_TO_LEFT; - if ((style & SWT.LEFT_TO_RIGHT) != 0) listStyle |= SWT.LEFT_TO_RIGHT; - list = new List (popup, listStyle); - if (font != null) list.setFont (font); - if (foreground != null) list.setForeground (foreground); - if (background != null) list.setBackground (background); - - int [] popupEvents = {SWT.Close, SWT.Paint, SWT.Deactivate}; - for (int i=0; i - * The current selection is first copied to the - * clipboard and then deleted from the widget. - *

    - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.3 - */ -public void cut () { - checkWidget (); - text.cut (); -} -/** - * Deselects the item at the given zero-relative index in the receiver's - * list. If the item at the index was already deselected, it remains - * deselected. Indices that are out of range are ignored. - * - * @param index the index of the item to deselect - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void deselect (int index) { - checkWidget (); - if (0 <= index && index < list.getItemCount () && - index == list.getSelectionIndex() && - text.getText().equals(list.getItem(index))) { - text.setText(""); //$NON-NLS-1$ - list.deselect (index); - } -} -/** - * Deselects all selected items in the receiver's list. - *

    - * Note: To clear the selection in the receiver's text field, - * use clearSelection(). - *

    - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see #clearSelection - */ -public void deselectAll () { - checkWidget (); - text.setText(""); //$NON-NLS-1$ - list.deselectAll (); -} -void dropDown (boolean drop) { - if (drop == isDropped ()) return; - if (!drop) { - popup.setVisible (false); - if (!isDisposed () && isFocusControl()) { - text.setFocus(); - } - return; - } - if (!isVisible()) return; - if (getShell() != popup.getParent ()) { - String[] items = list.getItems (); - int selectionIndex = list.getSelectionIndex (); - list.removeListener (SWT.Dispose, listener); - popup.dispose(); - popup = null; - list = null; - createPopup (items, selectionIndex); - } - - Point size = getSize (); - int itemCount = list.getItemCount (); - itemCount = (itemCount == 0) ? visibleItemCount : Math.min(visibleItemCount, itemCount); - int itemHeight = list.getItemHeight () * itemCount; - Point listSize = list.computeSize (SWT.DEFAULT, itemHeight, false); - list.setBounds (1, 1, Math.max (size.x - 2, listSize.x), listSize.y); - - int index = list.getSelectionIndex (); - if (index != -1) list.setTopIndex (index); - Display display = getDisplay (); - Rectangle listRect = list.getBounds (); - Rectangle parentRect = display.map (getParent (), null, getBounds ()); - Point comboSize = getSize (); - Rectangle displayRect = getMonitor ().getClientArea (); - int width = Math.max (comboSize.x, listRect.width + 2); - int height = listRect.height + 2; - int x = parentRect.x; - int y = parentRect.y + comboSize.y; - if (y + height > displayRect.y + displayRect.height) y = parentRect.y - height; - if (x + width > displayRect.x + displayRect.width) x = displayRect.x + displayRect.width - listRect.width; - popup.setBounds (x, y, width, height); - popup.setVisible (true); - if (isFocusControl()) list.setFocus (); -} -/* - * Return the lowercase of the first non-'&' character following - * an '&' character in the given string. If there are no '&' - * characters in the given string, return '\0'. - */ -char _findMnemonic (String string) { - if (string == null) return '\0'; - int index = 0; - int length = string.length (); - do { - while (index < length && string.charAt (index) != '&') index++; - if (++index >= length) return '\0'; - if (string.charAt (index) != '&') return Character.toLowerCase (string.charAt (index)); - index++; - } while (index < length); - return '\0'; -} -/* - * Return the Label immediately preceding the receiver in the z-order, - * or null if none. - */ -Label getAssociatedLabel () { - Control[] siblings = getParent ().getChildren (); - for (int i = 0; i < siblings.length; i++) { - if (siblings [i] == this) { - if (i > 0 && siblings [i-1] instanceof Label) { - return (Label) siblings [i-1]; - } - } - } - return null; -} -public Control [] getChildren () { - checkWidget(); - return new Control [0]; -} -/** - * Gets the editable state. - * - * @return whether or not the receiver is editable - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public boolean getEditable () { - checkWidget (); - return text.getEditable(); -} -/** - * Returns the item at the given, zero-relative index in the - * receiver's list. Throws an exception if the index is out - * of range. - * - * @param index the index of the item to return - * @return the item at the given index - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list minus 1 (inclusive)
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public String getItem (int index) { - checkWidget(); - return list.getItem (index); -} -/** - * Returns the number of items contained in the receiver's list. - * - * @return the number of items - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getItemCount () { - checkWidget (); - return list.getItemCount (); -} -/** - * Returns the height of the area which would be used to - * display one of the items in the receiver's list. - * - * @return the height of one item - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getItemHeight () { - checkWidget (); - return list.getItemHeight (); -} -/** - * Returns an array of Strings which are the items - * in the receiver's list. - *

    - * Note: This is not the actual structure used by the receiver - * to maintain its list of items, so modifying the array will - * not affect the receiver. - *

    - * - * @return the items in the receiver's list - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public String [] getItems () { - checkWidget (); - return list.getItems (); -} -/** - * Returns true if the receiver's list is visible, - * and false otherwise. - *

    - * If one of the receiver's ancestors is not visible or some - * other condition makes the receiver not visible, this method - * may still indicate that it is considered visible even though - * it may not actually be showing. - *

    - * - * @return the receiver's list's visibility state - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.4 - */ -public boolean getListVisible () { - checkWidget (); - return isDropped(); -} -public Menu getMenu() { - return text.getMenu(); -} -/** - * Returns a Point whose x coordinate is the start - * of the selection in the receiver's text field, and whose y - * coordinate is the end of the selection. The returned values - * are zero-relative. An "empty" selection as indicated by - * the the x and y coordinates having the same value. - * - * @return a point representing the selection start and end - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public Point getSelection () { - checkWidget (); - return text.getSelection (); -} -/** - * Returns the zero-relative index of the item which is currently - * selected in the receiver's list, or -1 if no item is selected. - * - * @return the index of the selected item - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getSelectionIndex () { - checkWidget (); - return list.getSelectionIndex (); -} -public Shell getShell () { - checkWidget (); - Shell shell = super.getShell (); - if (shell != _shell) { - if (_shell != null && !_shell.isDisposed ()) { - _shell.removeListener (SWT.Deactivate, listener); - } - _shell = shell; - } - return _shell; -} -public int getStyle () { - int style = super.getStyle (); - style &= ~SWT.READ_ONLY; - if (!text.getEditable()) style |= SWT.READ_ONLY; - return style; -} -/** - * Returns a string containing a copy of the contents of the - * receiver's text field. - * - * @return the receiver's text - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public String getText () { - checkWidget (); - return text.getText (); -} -/** - * Returns the height of the receivers's text field. - * - * @return the text height - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getTextHeight () { - checkWidget (); - return text.getLineHeight (); -} -/** - * Returns the maximum number of characters that the receiver's - * text field is capable of holding. If this has not been changed - * by setTextLimit(), it will be the constant - * Combo.LIMIT. - * - * @return the text limit - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getTextLimit () { - checkWidget (); - return text.getTextLimit (); -} -/** - * Gets the number of items that are visible in the drop - * down portion of the receiver's list. - * - * @return the number of items that are visible - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public int getVisibleItemCount () { - checkWidget (); - return visibleItemCount; -} -void handleFocus (int type) { - switch (type) { - case SWT.FocusIn: { - if (hasFocus) return; - if (getEditable ()) text.selectAll (); - hasFocus = true; - Shell shell = getShell (); - shell.removeListener (SWT.Deactivate, listener); - shell.addListener (SWT.Deactivate, listener); - Display display = getDisplay (); - display.removeFilter (SWT.FocusIn, filter); - display.addFilter (SWT.FocusIn, filter); - Event e = new Event (); - notifyListeners (SWT.FocusIn, e); - break; - } - case SWT.FocusOut: { - if (!hasFocus) return; - Control focusControl = getDisplay ().getFocusControl (); - if (focusControl == arrow || focusControl == list || focusControl == text) return; - hasFocus = false; - Shell shell = getShell (); - shell.removeListener(SWT.Deactivate, listener); - Display display = getDisplay (); - display.removeFilter (SWT.FocusIn, filter); - Event e = new Event (); - notifyListeners (SWT.FocusOut, e); - break; - } - } -} -/** - * Searches the receiver's list starting at the first item - * (index 0) until an item is found that is equal to the - * argument, and returns the index of that item. If no item - * is found, returns -1. - * - * @param string the search item - * @return the index of the item - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the string is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int indexOf (String string) { - checkWidget (); - if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - return list.indexOf (string); -} -/** - * Searches the receiver's list starting at the given, - * zero-relative index until an item is found that is equal - * to the argument, and returns the index of that item. If - * no item is found or the starting index is out of range, - * returns -1. - * - * @param string the search item - * @param start the zero-relative index at which to begin the search - * @return the index of the item - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the string is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int indexOf (String string, int start) { - checkWidget (); - if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - return list.indexOf (string, start); -} - -void initAccessible() { - AccessibleAdapter accessibleAdapter = new AccessibleAdapter () { - public void getName (AccessibleEvent e) { - String name = null; - Label label = getAssociatedLabel (); - if (label != null) { - name = stripMnemonic (label.getText()); - } - e.result = name; - } - public void getKeyboardShortcut(AccessibleEvent e) { - String shortcut = null; - Label label = getAssociatedLabel (); - if (label != null) { - String text = label.getText (); - if (text != null) { - char mnemonic = _findMnemonic (text); - if (mnemonic != '\0') { - shortcut = "Alt+"+mnemonic; //$NON-NLS-1$ - } - } - } - e.result = shortcut; - } - public void getHelp (AccessibleEvent e) { - e.result = getToolTipText (); - } - }; - getAccessible ().addAccessibleListener (accessibleAdapter); - text.getAccessible ().addAccessibleListener (accessibleAdapter); - list.getAccessible ().addAccessibleListener (accessibleAdapter); - - arrow.getAccessible ().addAccessibleListener (new AccessibleAdapter() { - public void getName (AccessibleEvent e) { - e.result = isDropped () ? SWT.getMessage ("SWT_Close") : SWT.getMessage ("SWT_Open"); //$NON-NLS-1$ //$NON-NLS-2$ - } - public void getKeyboardShortcut (AccessibleEvent e) { - e.result = "Alt+Down Arrow"; //$NON-NLS-1$ - } - public void getHelp (AccessibleEvent e) { - e.result = getToolTipText (); - } - }); - - getAccessible().addAccessibleTextListener (new AccessibleTextAdapter() { - public void getCaretOffset (AccessibleTextEvent e) { - e.offset = text.getCaretPosition (); - } - public void getSelectionRange(AccessibleTextEvent e) { - Point sel = text.getSelection(); - e.offset = sel.x; - e.length = sel.y - sel.x; - } - }); - - getAccessible().addAccessibleControlListener (new AccessibleControlAdapter() { - public void getChildAtPoint (AccessibleControlEvent e) { - Point testPoint = toControl (e.x, e.y); - if (getBounds ().contains (testPoint)) { - e.childID = ACC.CHILDID_SELF; - } - } - - public void getLocation (AccessibleControlEvent e) { - Rectangle location = getBounds (); - Point pt = getParent().toDisplay (location.x, location.y); - e.x = pt.x; - e.y = pt.y; - e.width = location.width; - e.height = location.height; - } - - public void getChildCount (AccessibleControlEvent e) { - e.detail = 0; - } - - public void getRole (AccessibleControlEvent e) { - e.detail = ACC.ROLE_COMBOBOX; - } - - public void getState (AccessibleControlEvent e) { - e.detail = ACC.STATE_NORMAL; - } - - public void getValue (AccessibleControlEvent e) { - e.result = getText (); - } - }); - - text.getAccessible ().addAccessibleControlListener (new AccessibleControlAdapter () { - public void getRole (AccessibleControlEvent e) { - e.detail = text.getEditable () ? ACC.ROLE_TEXT : ACC.ROLE_LABEL; - } - }); - - arrow.getAccessible ().addAccessibleControlListener (new AccessibleControlAdapter() { - public void getDefaultAction (AccessibleControlEvent e) { - e.result = isDropped () ? SWT.getMessage ("SWT_Close") : SWT.getMessage ("SWT_Open"); //$NON-NLS-1$ //$NON-NLS-2$ - } - }); -} -boolean isDropped () { - return popup.getVisible (); -} -public boolean isFocusControl () { - checkWidget(); - if (text.isFocusControl () || arrow.isFocusControl () || list.isFocusControl () || popup.isFocusControl ()) { - return true; - } - return super.isFocusControl (); -} -void internalLayout (boolean changed) { - if (isDropped ()) dropDown (false); - Rectangle rect = getClientArea (); - int width = rect.width; - int height = rect.height; - Point arrowSize = arrow.computeSize (SWT.DEFAULT, height, changed); - text.setBounds (0, 0, width - arrowSize.x, height); - arrow.setBounds (width - arrowSize.x, 0, arrowSize.x, arrowSize.y); -} -void listEvent (Event event) { - switch (event.type) { - case SWT.Dispose: - if (getShell () != popup.getParent ()) { - String[] items = list.getItems (); - int selectionIndex = list.getSelectionIndex (); - popup = null; - list = null; - createPopup (items, selectionIndex); - } - break; - case SWT.FocusIn: { - handleFocus (SWT.FocusIn); - break; - } - case SWT.MouseUp: { - if (event.button != 1) return; - dropDown (false); - break; - } - case SWT.Selection: { - int index = list.getSelectionIndex (); - if (index == -1) return; - text.setText (list.getItem (index)); - text.selectAll (); - list.setSelection (index); - Event e = new Event (); - e.time = event.time; - e.stateMask = event.stateMask; - e.doit = event.doit; - notifyListeners (SWT.Selection, e); - event.doit = e.doit; - break; - } - case SWT.Traverse: { - switch (event.detail) { - case SWT.TRAVERSE_RETURN: - case SWT.TRAVERSE_ESCAPE: - case SWT.TRAVERSE_ARROW_PREVIOUS: - case SWT.TRAVERSE_ARROW_NEXT: - event.doit = false; - break; - case SWT.TRAVERSE_TAB_NEXT: - case SWT.TRAVERSE_TAB_PREVIOUS: - event.doit = text.traverse(event.detail); - event.detail = SWT.TRAVERSE_NONE; - if (event.doit) dropDown(false); - return; - } - Event e = new Event (); - e.time = event.time; - e.detail = event.detail; - e.doit = event.doit; - e.character = event.character; - e.keyCode = event.keyCode; - notifyListeners (SWT.Traverse, e); - event.doit = e.doit; - event.detail = e.detail; - break; - } - case SWT.KeyUp: { - Event e = new Event (); - e.time = event.time; - e.character = event.character; - e.keyCode = event.keyCode; - e.stateMask = event.stateMask; - notifyListeners (SWT.KeyUp, e); - break; - } - case SWT.KeyDown: { - if (event.character == SWT.ESC) { - // Escape key cancels popup list - dropDown (false); - } - if ((event.stateMask & SWT.ALT) != 0 && (event.keyCode == SWT.ARROW_UP || event.keyCode == SWT.ARROW_DOWN)) { - dropDown (false); - } - if (event.character == SWT.CR) { - // Enter causes default selection - dropDown (false); - Event e = new Event (); - e.time = event.time; - e.stateMask = event.stateMask; - notifyListeners (SWT.DefaultSelection, e); - } - // At this point the widget may have been disposed. - // If so, do not continue. - if (isDisposed ()) break; - Event e = new Event(); - e.time = event.time; - e.character = event.character; - e.keyCode = event.keyCode; - e.stateMask = event.stateMask; - notifyListeners(SWT.KeyDown, e); - break; - - } - } -} -/** - * Pastes text from clipboard. - *

    - * The selected text is deleted from the widget - * and new text inserted from the clipboard. - *

    - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.3 - */ -public void paste () { - checkWidget (); - text.paste (); -} -void popupEvent(Event event) { - switch (event.type) { - case SWT.Paint: - // draw black rectangle around list - Rectangle listRect = list.getBounds(); - Color black = getDisplay().getSystemColor(SWT.COLOR_BLACK); - event.gc.setForeground(black); - event.gc.drawRectangle(0, 0, listRect.width + 1, listRect.height + 1); - break; - case SWT.Close: - event.doit = false; - dropDown (false); - break; - case SWT.Deactivate: - /* - * Bug in GTK. When the arrow button is pressed the popup control receives a - * deactivate event and then the arrow button receives a selection event. If - * we hide the popup in the deactivate event, the selection event will show - * it again. To prevent the popup from showing again, we will let the selection - * event of the arrow button hide the popup. - * In Windows, hiding the popup during the deactivate causes the deactivate - * to be called twice and the selection event to be disappear. - */ - if (!"carbon".equals(SWT.getPlatform())) { - Point point = arrow.toControl(getDisplay().getCursorLocation()); - Point size = arrow.getSize(); - Rectangle rect = new Rectangle(0, 0, size.x, size.y); - if (!rect.contains(point)) dropDown (false); - } else { - dropDown(false); - } - break; - } -} -public void redraw () { - super.redraw(); - text.redraw(); - arrow.redraw(); - if (popup.isVisible()) list.redraw(); -} -public void redraw (int x, int y, int width, int height, boolean all) { - super.redraw(x, y, width, height, true); -} - -/** - * Removes the item from the receiver's list at the given - * zero-relative index. - * - * @param index the index for the item - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list minus 1 (inclusive)
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void remove (int index) { - checkWidget(); - list.remove (index); -} -/** - * Removes the items from the receiver's list which are - * between the given zero-relative start and end - * indices (inclusive). - * - * @param start the start of the range - * @param end the end of the range - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE - if either the start or end are not between 0 and the number of elements in the list minus 1 (inclusive)
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void remove (int start, int end) { - checkWidget(); - list.remove (start, end); -} -/** - * Searches the receiver's list starting at the first item - * until an item is found that is equal to the argument, - * and removes that item from the list. - * - * @param string the item to remove - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the string is null
    • - *
    • ERROR_INVALID_ARGUMENT - if the string is not found in the list
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void remove (String string) { - checkWidget(); - if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - list.remove (string); -} -/** - * Removes all of the items from the receiver's list and clear the - * contents of receiver's text field. - *

    - * @exception SWTException

      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void removeAll () { - checkWidget(); - text.setText (""); //$NON-NLS-1$ - list.removeAll (); -} -/** - * Removes the listener from the collection of listeners who will - * be notified when the receiver's text is modified. - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see ModifyListener - * @see #addModifyListener - */ -public void removeModifyListener (ModifyListener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - removeListener(SWT.Modify, listener); -} -/** - * Removes the listener from the collection of listeners who will - * be notified when the user changes the receiver's selection. - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see SelectionListener - * @see #addSelectionListener - */ -public void removeSelectionListener (SelectionListener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - removeListener(SWT.Selection, listener); - removeListener(SWT.DefaultSelection,listener); -} -/** - * Removes the listener from the collection of listeners who will - * be notified when the control is verified. - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see VerifyListener - * @see #addVerifyListener - * - * @since 3.3 - */ -public void removeVerifyListener (VerifyListener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - removeListener(SWT.Verify, listener); -} -/** - * Selects the item at the given zero-relative index in the receiver's - * list. If the item at the index was already selected, it remains - * selected. Indices that are out of range are ignored. - * - * @param index the index of the item to select - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void select (int index) { - checkWidget(); - if (index == -1) { - list.deselectAll (); - text.setText (""); //$NON-NLS-1$ - return; - } - if (0 <= index && index < list.getItemCount()) { - if (index != getSelectionIndex()) { - text.setText (list.getItem (index)); - text.selectAll (); - list.select (index); - list.showSelection (); - } - } -} -public void setBackground (Color color) { - super.setBackground(color); - background = color; - if (text != null) text.setBackground(color); - if (list != null) list.setBackground(color); - if (arrow != null) arrow.setBackground(color); -} -/** - * Sets the editable state. - * - * @param editable the new editable state - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public void setEditable (boolean editable) { - checkWidget (); - text.setEditable(editable); -} -public void setEnabled (boolean enabled) { - super.setEnabled(enabled); - if (popup != null) popup.setVisible (false); - if (text != null) text.setEnabled(enabled); - if (arrow != null) arrow.setEnabled(enabled); -} -public boolean setFocus () { - checkWidget(); - if (!isEnabled () || !isVisible ()) return false; - if (isFocusControl ()) return true; - return text.setFocus (); -} -public void setFont (Font font) { - super.setFont (font); - this.font = font; - text.setFont (font); - list.setFont (font); - internalLayout (true); -} -public void setForeground (Color color) { - super.setForeground(color); - foreground = color; - if (text != null) text.setForeground(color); - if (list != null) list.setForeground(color); - if (arrow != null) arrow.setForeground(color); -} -/** - * Sets the text of the item in the receiver's list at the given - * zero-relative index to the string argument. This is equivalent - * to remove'ing the old item at the index, and then - * add'ing the new item at that index. - * - * @param index the index for the item - * @param string the new text for the item - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list minus 1 (inclusive)
    • - *
    • ERROR_NULL_ARGUMENT - if the string is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setItem (int index, String string) { - checkWidget(); - list.setItem (index, string); -} -/** - * Sets the receiver's list to be the given array of items. - * - * @param items the array of items - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the items array is null
    • - *
    • ERROR_INVALID_ARGUMENT - if an item in the items array is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setItems (String [] items) { - checkWidget (); - list.setItems (items); - if (!text.getEditable ()) text.setText (""); //$NON-NLS-1$ -} -/** - * Sets the layout which is associated with the receiver to be - * the argument which may be null. - *

    - * Note: No Layout can be set on this Control because it already - * manages the size and position of its children. - *

    - * - * @param layout the receiver's new layout or null - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setLayout (Layout layout) { - checkWidget (); - return; -} -/** - * Marks the receiver's list as visible if the argument is true, - * and marks it invisible otherwise. - *

    - * If one of the receiver's ancestors is not visible or some - * other condition makes the receiver not visible, marking - * it visible may not actually cause it to be displayed. - *

    - * - * @param visible the new visibility state - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.4 - */ -public void setListVisible (boolean visible) { - checkWidget (); - dropDown(visible); -} -public void setMenu(Menu menu) { - text.setMenu(menu); -} -/** - * Sets the selection in the receiver's text field to the - * range specified by the argument whose x coordinate is the - * start of the selection and whose y coordinate is the end - * of the selection. - * - * @param selection a point representing the new selection start and end - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the point is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setSelection (Point selection) { - checkWidget(); - if (selection == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - text.setSelection (selection.x, selection.y); -} - -/** - * Sets the contents of the receiver's text field to the - * given string. - *

    - * Note: The text field in a Combo is typically - * only capable of displaying a single line of text. Thus, - * setting the text to a string containing line breaks or - * other special characters will probably cause it to - * display incorrectly. - *

    - * - * @param string the new text - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the string is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setText (String string) { - checkWidget(); - if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - int index = list.indexOf (string); - if (index == -1) { - list.deselectAll (); - text.setText (string); - return; - } - text.setText (string); - text.selectAll (); - list.setSelection (index); - list.showSelection (); -} -/** - * Sets the maximum number of characters that the receiver's - * text field is capable of holding to be the argument. - * - * @param limit new text limit - * - * @exception IllegalArgumentException
      - *
    • ERROR_CANNOT_BE_ZERO - if the limit is zero
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setTextLimit (int limit) { - checkWidget(); - text.setTextLimit (limit); -} - -public void setToolTipText (String string) { - checkWidget(); - super.setToolTipText(string); - arrow.setToolTipText (string); - text.setToolTipText (string); -} - -public void setVisible (boolean visible) { - super.setVisible(visible); - /* - * At this point the widget may have been disposed in a FocusOut event. - * If so then do not continue. - */ - if (isDisposed ()) return; - // TEMPORARY CODE - if (popup == null || popup.isDisposed ()) return; - if (!visible) popup.setVisible (false); -} -/** - * Sets the number of items that are visible in the drop - * down portion of the receiver's list. - * - * @param count the new number of items to be visible - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public void setVisibleItemCount (int count) { - checkWidget (); - if (count < 0) return; - visibleItemCount = count; -} -String stripMnemonic (String string) { - int index = 0; - int length = string.length (); - do { - while ((index < length) && (string.charAt (index) != '&')) index++; - if (++index >= length) return string; - if (string.charAt (index) != '&') { - return string.substring(0, index-1) + string.substring(index, length); - } - index++; - } while (index < length); - return string; -} -void textEvent (Event event) { - switch (event.type) { - case SWT.FocusIn: { - handleFocus (SWT.FocusIn); - break; - } - case SWT.DefaultSelection: { - dropDown (false); - Event e = new Event (); - e.time = event.time; - e.stateMask = event.stateMask; - notifyListeners (SWT.DefaultSelection, e); - break; - } - case SWT.KeyDown: { - Event keyEvent = new Event (); - keyEvent.time = event.time; - keyEvent.character = event.character; - keyEvent.keyCode = event.keyCode; - keyEvent.stateMask = event.stateMask; - notifyListeners (SWT.KeyDown, keyEvent); - if (isDisposed ()) break; - event.doit = keyEvent.doit; - if (!event.doit) break; - if (event.keyCode == SWT.ARROW_UP || event.keyCode == SWT.ARROW_DOWN) { - event.doit = false; - if ((event.stateMask & SWT.ALT) != 0) { - boolean dropped = isDropped (); - text.selectAll (); - if (!dropped) setFocus (); - dropDown (!dropped); - break; - } - - int oldIndex = getSelectionIndex (); - if (event.keyCode == SWT.ARROW_UP) { - select (Math.max (oldIndex - 1, 0)); - } else { - select (Math.min (oldIndex + 1, getItemCount () - 1)); - } - if (oldIndex != getSelectionIndex ()) { - Event e = new Event(); - e.time = event.time; - e.stateMask = event.stateMask; - notifyListeners (SWT.Selection, e); - } - if (isDisposed ()) break; - } - - // Further work : Need to add support for incremental search in - // pop up list as characters typed in text widget - break; - } - case SWT.KeyUp: { - Event e = new Event (); - e.time = event.time; - e.character = event.character; - e.keyCode = event.keyCode; - e.stateMask = event.stateMask; - notifyListeners (SWT.KeyUp, e); - event.doit = e.doit; - break; - } - case SWT.MenuDetect: { - Event e = new Event (); - e.time = event.time; - notifyListeners (SWT.MenuDetect, e); - break; - } - case SWT.Modify: { - list.deselectAll (); - Event e = new Event (); - e.time = event.time; - notifyListeners (SWT.Modify, e); - break; - } - case SWT.MouseDown: { - Event mouseEvent = new Event (); - mouseEvent.button = event.button; - mouseEvent.count = event.count; - mouseEvent.stateMask = event.stateMask; - mouseEvent.time = event.time; - mouseEvent.x = event.x; mouseEvent.y = event.y; - notifyListeners (SWT.MouseDown, mouseEvent); - if (isDisposed ()) break; - event.doit = mouseEvent.doit; - if (!event.doit) break; - if (event.button != 1) return; - if (text.getEditable ()) return; - boolean dropped = isDropped (); - text.selectAll (); - if (!dropped) setFocus (); - dropDown (!dropped); - break; - } - case SWT.MouseUp: { - Event mouseEvent = new Event (); - mouseEvent.button = event.button; - mouseEvent.count = event.count; - mouseEvent.stateMask = event.stateMask; - mouseEvent.time = event.time; - mouseEvent.x = event.x; mouseEvent.y = event.y; - notifyListeners (SWT.MouseUp, mouseEvent); - if (isDisposed ()) break; - event.doit = mouseEvent.doit; - if (!event.doit) break; - if (event.button != 1) return; - if (text.getEditable ()) return; - text.selectAll (); - break; - } - case SWT.MouseDoubleClick: { - Event mouseEvent = new Event (); - mouseEvent.button = event.button; - mouseEvent.count = event.count; - mouseEvent.stateMask = event.stateMask; - mouseEvent.time = event.time; - mouseEvent.x = event.x; mouseEvent.y = event.y; - notifyListeners (SWT.MouseDoubleClick, mouseEvent); - break; - } - case SWT.MouseWheel: { - Event keyEvent = new Event (); - keyEvent.time = event.time; - keyEvent.keyCode = event.count > 0 ? SWT.ARROW_UP : SWT.ARROW_DOWN; - keyEvent.stateMask = event.stateMask; - notifyListeners (SWT.KeyDown, keyEvent); - if (isDisposed ()) break; - event.doit = keyEvent.doit; - if (!event.doit) break; - if (event.count != 0) { - event.doit = false; - int oldIndex = getSelectionIndex (); - if (event.count > 0) { - select (Math.max (oldIndex - 1, 0)); - } else { - select (Math.min (oldIndex + 1, getItemCount () - 1)); - } - if (oldIndex != getSelectionIndex ()) { - Event e = new Event(); - e.time = event.time; - e.stateMask = event.stateMask; - notifyListeners (SWT.Selection, e); - } - if (isDisposed ()) break; - } - break; - } - case SWT.Traverse: { - switch (event.detail) { - case SWT.TRAVERSE_ARROW_PREVIOUS: - case SWT.TRAVERSE_ARROW_NEXT: - // The enter causes default selection and - // the arrow keys are used to manipulate the list contents so - // do not use them for traversal. - event.doit = false; - break; - case SWT.TRAVERSE_TAB_PREVIOUS: - event.doit = traverse(SWT.TRAVERSE_TAB_PREVIOUS); - event.detail = SWT.TRAVERSE_NONE; - return; - } - Event e = new Event (); - e.time = event.time; - e.detail = event.detail; - e.doit = event.doit; - e.character = event.character; - e.keyCode = event.keyCode; - notifyListeners (SWT.Traverse, e); - event.doit = e.doit; - event.detail = e.detail; - break; - } - case SWT.Verify: { - Event e = new Event (); - e.text = event.text; - e.start = event.start; - e.end = event.end; - e.character = event.character; - e.keyCode = event.keyCode; - e.stateMask = event.stateMask; - notifyListeners (SWT.Verify, e); - event.doit = e.doit; - break; - } - } -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CLabel.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CLabel.java deleted file mode 100755 index ddd3c6a529..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CLabel.java +++ /dev/null @@ -1,826 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.accessibility.*; - -/** - * A Label which supports aligned text and/or an image and different border styles. - *

    - * If there is not enough space a CLabel uses the following strategy to fit the - * information into the available space: - *

    - * 		ignores the indent in left align mode
    - * 		ignores the image and the gap
    - * 		shortens the text by replacing the center portion of the label with an ellipsis
    - * 		shortens the text by removing the center portion of the label
    - * 
    - *

    - *

    - *
    Styles: - *
    LEFT, RIGHT, CENTER, SHADOW_IN, SHADOW_OUT, SHADOW_NONE
    - *
    Events: - *
    - *
    - * - *

    - * IMPORTANT: This class is not intended to be subclassed. - *

    - * - * @see SWT Example: CustomControlExample - * @see Sample code and further information - * @noextend This class is not intended to be subclassed by clients. - */ -public class CLabel extends Canvas { - - /** Gap between icon and text */ - private static final int GAP = 5; - /** Left and right margins */ - private static final int INDENT = 3; - /** a string inserted in the middle of text that has been shortened */ - private static final String ELLIPSIS = "..."; //$NON-NLS-1$ // could use the ellipsis glyph on some platforms "\u2026" - /** the alignment. Either CENTER, RIGHT, LEFT. Default is LEFT*/ - private int align = SWT.LEFT; - private int hIndent = INDENT; - private int vIndent = INDENT; - /** the current text */ - private String text; - /** the current icon */ - private Image image; - // The tooltip is used for two purposes - the application can set - // a tooltip or the tooltip can be used to display the full text when the - // the text has been truncated due to the label being too short. - // The appToolTip stores the tooltip set by the application. Control.tooltiptext - // contains whatever tooltip is currently being displayed. - private String appToolTipText; - - private Image backgroundImage; - private Color[] gradientColors; - private int[] gradientPercents; - private boolean gradientVertical; - private Color background; - private Listener disposeListener; - - private static int DRAW_FLAGS = SWT.DRAW_MNEMONIC | SWT.DRAW_TAB | SWT.DRAW_TRANSPARENT | SWT.DRAW_DELIMITER; - -/** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    - * - * @see SWT#LEFT - * @see SWT#RIGHT - * @see SWT#CENTER - * @see SWT#SHADOW_IN - * @see SWT#SHADOW_OUT - * @see SWT#SHADOW_NONE - * @see #getStyle() - */ -public CLabel(Composite parent, int style) { - super(parent, checkStyle(style)); - if ((style & (SWT.CENTER | SWT.RIGHT)) == 0) style |= SWT.LEFT; - if ((style & SWT.CENTER) != 0) align = SWT.CENTER; - if ((style & SWT.RIGHT) != 0) align = SWT.RIGHT; - if ((style & SWT.LEFT) != 0) align = SWT.LEFT; - - addPaintListener(new PaintListener(){ - public void paintControl(PaintEvent event) { - onPaint(event); - } - }); - - addTraverseListener(new TraverseListener() { - public void keyTraversed(TraverseEvent event) { - if (event.detail == SWT.TRAVERSE_MNEMONIC) { - onMnemonic(event); - } - } - }); - - disposeListener = new Listener() { - public void handleEvent(Event event) { - onDispose(event); - } - }; - - initAccessible(); - -} -/** - * Check the style bits to ensure that no invalid styles are applied. - */ -private static int checkStyle (int style) { - if ((style & SWT.BORDER) != 0) style |= SWT.SHADOW_IN; - int mask = SWT.SHADOW_IN | SWT.SHADOW_OUT | SWT.SHADOW_NONE | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT; - style = style & mask; - return style |= SWT.NO_FOCUS | SWT.DOUBLE_BUFFERED; -} - -//protected void checkSubclass () { -// String name = getClass().getName (); -// String validName = CLabel.class.getName(); -// if (!validName.equals(name)) { -// SWT.error (SWT.ERROR_INVALID_SUBCLASS); -// } -//} - -public Point computeSize(int wHint, int hHint, boolean changed) { - checkWidget(); - Point e = getTotalSize(image, text); - if (wHint == SWT.DEFAULT){ - e.x += 2*hIndent; - } else { - e.x = wHint; - } - if (hHint == SWT.DEFAULT) { - e.y += 2*vIndent; - } else { - e.y = hHint; - } - return e; -} -/** - * Draw a rectangle in the given colors. - */ -private void drawBevelRect(GC gc, int x, int y, int w, int h, Color topleft, Color bottomright) { - gc.setForeground(bottomright); - gc.drawLine(x+w, y, x+w, y+h); - gc.drawLine(x, y+h, x+w, y+h); - - gc.setForeground(topleft); - gc.drawLine(x, y, x+w-1, y); - gc.drawLine(x, y, x, y+h-1); -} -/* - * Return the lowercase of the first non-'&' character following - * an '&' character in the given string. If there are no '&' - * characters in the given string, return '\0'. - */ -char _findMnemonic (String string) { - if (string == null) return '\0'; - int index = 0; - int length = string.length (); - do { - while (index < length && string.charAt (index) != '&') index++; - if (++index >= length) return '\0'; - if (string.charAt (index) != '&') return Character.toLowerCase (string.charAt (index)); - index++; - } while (index < length); - return '\0'; -} -/** - * Returns the alignment. - * The alignment style (LEFT, CENTER or RIGHT) is returned. - * - * @return SWT.LEFT, SWT.RIGHT or SWT.CENTER - */ -public int getAlignment() { - //checkWidget(); - return align; -} -/** - * Return the CLabel's image or null. - * - * @return the image of the label or null - */ -public Image getImage() { - //checkWidget(); - return image; -} -/** - * Compute the minimum size. - */ -private Point getTotalSize(Image image, String text) { - Point size = new Point(0, 0); - - if (image != null) { - Rectangle r = image.getBounds(); - size.x += r.width; - size.y += r.height; - } - - GC gc = new GC(this); - if (text != null && text.length() > 0) { - Point e = gc.textExtent(text, DRAW_FLAGS); - size.x += e.x; - size.y = Math.max(size.y, e.y); - if (image != null) size.x += GAP; - } else { - size.y = Math.max(size.y, gc.getFontMetrics().getHeight()); - } - gc.dispose(); - - return size; -} -public int getStyle () { - int style = super.getStyle(); - switch (align) { - case SWT.RIGHT: style |= SWT.RIGHT; break; - case SWT.CENTER: style |= SWT.CENTER; break; - case SWT.LEFT: style |= SWT.LEFT; break; - } - return style; -} - -/** - * Return the Label's text. - * - * @return the text of the label or null - */ -public String getText() { - //checkWidget(); - return text; -} -public String getToolTipText () { - checkWidget(); - return appToolTipText; -} -private void initAccessible() { - Accessible accessible = getAccessible(); - accessible.addAccessibleListener(new AccessibleAdapter() { - public void getName(AccessibleEvent e) { - e.result = getText(); - } - - public void getHelp(AccessibleEvent e) { - e.result = getToolTipText(); - } - - public void getKeyboardShortcut(AccessibleEvent e) { - char mnemonic = _findMnemonic(CLabel.this.text); - if (mnemonic != '\0') { - e.result = "Alt+"+mnemonic; //$NON-NLS-1$ - } - } - }); - - accessible.addAccessibleControlListener(new AccessibleControlAdapter() { - public void getChildAtPoint(AccessibleControlEvent e) { - e.childID = ACC.CHILDID_SELF; - } - - public void getLocation(AccessibleControlEvent e) { - Rectangle rect = getDisplay().map(getParent(), null, getBounds()); - e.x = rect.x; - e.y = rect.y; - e.width = rect.width; - e.height = rect.height; - } - - public void getChildCount(AccessibleControlEvent e) { - e.detail = 0; - } - - public void getRole(AccessibleControlEvent e) { - e.detail = ACC.ROLE_LABEL; - } - - public void getState(AccessibleControlEvent e) { - e.detail = ACC.STATE_READONLY; - } - }); -} -void onDispose(Event event) { - removeListener(SWT.Dispose, disposeListener); - notifyListeners(SWT.Dispose, event); - event.type = SWT.None; - - gradientColors = null; - gradientPercents = null; - backgroundImage = null; - text = null; - image = null; - appToolTipText = null; -} -void onMnemonic(TraverseEvent event) { - char mnemonic = _findMnemonic(text); - if (mnemonic == '\0') return; - if (Character.toLowerCase(event.character) != mnemonic) return; - Composite control = this.getParent(); - while (control != null) { - Control [] children = control.getChildren(); - int index = 0; - while (index < children.length) { - if (children [index] == this) break; - index++; - } - index++; - if (index < children.length) { - if (children [index].setFocus ()) { - event.doit = true; - event.detail = SWT.TRAVERSE_NONE; - } - } - control = control.getParent(); - } -} - -void onPaint(PaintEvent event) { - Rectangle rect = getClientArea(); - if (rect.width == 0 || rect.height == 0) return; - - boolean shortenText = false; - String t = text; - Image img = image; - int availableWidth = Math.max(0, rect.width - 2*hIndent); - Point extent = getTotalSize(img, t); - if (extent.x > availableWidth) { - img = null; - extent = getTotalSize(img, t); - if (extent.x > availableWidth) { - shortenText = true; - } - } - - GC gc = event.gc; - String[] lines = text == null ? null : splitString(text); - - // shorten the text - if (shortenText) { - extent.x = 0; - for(int i = 0; i < lines.length; i++) { - Point e = gc.textExtent(lines[i], DRAW_FLAGS); - if (e.x > availableWidth) { - lines[i] = shortenText(gc, lines[i], availableWidth); - extent.x = Math.max(extent.x, getTotalSize(null, lines[i]).x); - } else { - extent.x = Math.max(extent.x, e.x); - } - } - if (appToolTipText == null) { - super.setToolTipText(text); - } - } else { - super.setToolTipText(appToolTipText); - } - - // determine horizontal position - int x = rect.x + hIndent; - if (align == SWT.CENTER) { - x = (rect.width - extent.x)/2; - } - if (align == SWT.RIGHT) { - x = rect.width - hIndent - extent.x; - } - - // draw a background image behind the text - try { - if (backgroundImage != null) { - // draw a background image behind the text - Rectangle imageRect = backgroundImage.getBounds(); - // tile image to fill space - gc.setBackground(getBackground()); - gc.fillRectangle(rect); - int xPos = 0; - while (xPos < rect.width) { - int yPos = 0; - while (yPos < rect.height) { - gc.drawImage(backgroundImage, xPos, yPos); - yPos += imageRect.height; - } - xPos += imageRect.width; - } - } else if (gradientColors != null) { - // draw a gradient behind the text - final Color oldBackground = gc.getBackground(); - if (gradientColors.length == 1) { - if (gradientColors[0] != null) gc.setBackground(gradientColors[0]); - gc.fillRectangle(0, 0, rect.width, rect.height); - } else { - final Color oldForeground = gc.getForeground(); - Color lastColor = gradientColors[0]; - if (lastColor == null) lastColor = oldBackground; - int pos = 0; - for (int i = 0; i < gradientPercents.length; ++i) { - gc.setForeground(lastColor); - lastColor = gradientColors[i + 1]; - if (lastColor == null) lastColor = oldBackground; - gc.setBackground(lastColor); - if (gradientVertical) { - final int gradientHeight = (gradientPercents[i] * rect.height / 100) - pos; - gc.fillGradientRectangle(0, pos, rect.width, gradientHeight, true); - pos += gradientHeight; - } else { - final int gradientWidth = (gradientPercents[i] * rect.width / 100) - pos; - gc.fillGradientRectangle(pos, 0, gradientWidth, rect.height, false); - pos += gradientWidth; - } - } - if (gradientVertical && pos < rect.height) { - gc.setBackground(getBackground()); - gc.fillRectangle(0, pos, rect.width, rect.height - pos); - } - if (!gradientVertical && pos < rect.width) { - gc.setBackground(getBackground()); - gc.fillRectangle(pos, 0, rect.width - pos, rect.height); - } - gc.setForeground(oldForeground); - } - gc.setBackground(oldBackground); - } else { - if (background != null || (getStyle() & SWT.DOUBLE_BUFFERED) == 0) { - gc.setBackground(getBackground()); - gc.fillRectangle(rect); - } - } - } catch (SWTException e) { - if ((getStyle() & SWT.DOUBLE_BUFFERED) == 0) { - gc.setBackground(getBackground()); - gc.fillRectangle(rect); - } - } - - // draw border - int style = getStyle(); - if ((style & SWT.SHADOW_IN) != 0 || (style & SWT.SHADOW_OUT) != 0) { - paintBorder(gc, rect); - } - - // draw the image - if (img != null) { - Rectangle imageRect = img.getBounds(); - gc.drawImage(img, 0, 0, imageRect.width, imageRect.height, - x, (rect.height-imageRect.height)/2, imageRect.width, imageRect.height); - x += imageRect.width + GAP; - extent.x -= imageRect.width + GAP; - } - // draw the text - if (lines != null) { - int lineHeight = gc.getFontMetrics().getHeight(); - int textHeight = lines.length * lineHeight; - int lineY = Math.max(vIndent, rect.y + (rect.height - textHeight) / 2); - gc.setForeground(getForeground()); - for (int i = 0; i < lines.length; i++) { - int lineX = x; - if (lines.length > 1) { - if (align == SWT.CENTER) { - int lineWidth = gc.textExtent(lines[i], DRAW_FLAGS).x; - lineX = x + Math.max(0, (extent.x - lineWidth) / 2); - } - if (align == SWT.RIGHT) { - int lineWidth = gc.textExtent(lines[i], DRAW_FLAGS).x; - lineX = Math.max(x, rect.x + rect.width - hIndent - lineWidth); - } - } - gc.drawText(lines[i], lineX, lineY, DRAW_FLAGS); - lineY += lineHeight; - } - } -} -/** - * Paint the Label's border. - */ -private void paintBorder(GC gc, Rectangle r) { - Display disp= getDisplay(); - - Color c1 = null; - Color c2 = null; - - int style = getStyle(); - if ((style & SWT.SHADOW_IN) != 0) { - c1 = disp.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW); - c2 = disp.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW); - } - if ((style & SWT.SHADOW_OUT) != 0) { - c1 = disp.getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW); - c2 = disp.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW); - } - - if (c1 != null && c2 != null) { - gc.setLineWidth(1); - drawBevelRect(gc, r.x, r.y, r.width-1, r.height-1, c1, c2); - } -} -/** - * Set the alignment of the CLabel. - * Use the values LEFT, CENTER and RIGHT to align image and text within the available space. - * - * @param align the alignment style of LEFT, RIGHT or CENTER - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_INVALID_ARGUMENT - if the value of align is not one of SWT.LEFT, SWT.RIGHT or SWT.CENTER
    • - *
    - */ -public void setAlignment(int align) { - checkWidget(); - if (align != SWT.LEFT && align != SWT.RIGHT && align != SWT.CENTER) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (this.align != align) { - this.align = align; - redraw(); - } -} - -public void setBackground (Color color) { - super.setBackground (color); - // Are these settings the same as before? - if (backgroundImage == null && - gradientColors == null && - gradientPercents == null) { - if (color == null) { - if (background == null) return; - } else { - if (color.equals(background)) return; - } - } - background = color; - backgroundImage = null; - gradientColors = null; - gradientPercents = null; - redraw (); -} - -/** - * Specify a gradient of colours to be drawn in the background of the CLabel. - *

    For example, to draw a gradient that varies from dark blue to blue and then to - * white and stays white for the right half of the label, use the following call - * to setBackground:

    - *
    - *	clabel.setBackground(new Color[]{display.getSystemColor(SWT.COLOR_DARK_BLUE), 
    - *		                           display.getSystemColor(SWT.COLOR_BLUE),
    - *		                           display.getSystemColor(SWT.COLOR_WHITE), 
    - *		                           display.getSystemColor(SWT.COLOR_WHITE)},
    - *		               new int[] {25, 50, 100});
    - * 
    - * - * @param colors an array of Color that specifies the colors to appear in the gradient - * in order of appearance from left to right; The value null - * clears the background gradient; the value null can be used - * inside the array of Color to specify the background color. - * @param percents an array of integers between 0 and 100 specifying the percent of the width - * of the widget at which the color should change; the size of the percents - * array must be one less than the size of the colors array. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_INVALID_ARGUMENT - if the values of colors and percents are not consistent
    • - *
    - */ -public void setBackground(Color[] colors, int[] percents) { - setBackground(colors, percents, false); -} -/** - * Specify a gradient of colours to be drawn in the background of the CLabel. - *

    For example, to draw a gradient that varies from dark blue to white in the vertical, - * direction use the following call - * to setBackground:

    - *
    - *	clabel.setBackground(new Color[]{display.getSystemColor(SWT.COLOR_DARK_BLUE), 
    - *		                           display.getSystemColor(SWT.COLOR_WHITE)},
    - *		                 new int[] {100}, true);
    - * 
    - * - * @param colors an array of Color that specifies the colors to appear in the gradient - * in order of appearance from left/top to right/bottom; The value null - * clears the background gradient; the value null can be used - * inside the array of Color to specify the background color. - * @param percents an array of integers between 0 and 100 specifying the percent of the width/height - * of the widget at which the color should change; the size of the percents - * array must be one less than the size of the colors array. - * @param vertical indicate the direction of the gradient. True is vertical and false is horizontal. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_INVALID_ARGUMENT - if the values of colors and percents are not consistent
    • - *
    - * - * @since 3.0 - */ -public void setBackground(Color[] colors, int[] percents, boolean vertical) { - checkWidget(); - if (colors != null) { - if (percents == null || percents.length != colors.length - 1) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (getDisplay().getDepth() < 15) { - // Don't use gradients on low color displays - colors = new Color[] {colors[colors.length - 1]}; - percents = new int[] { }; - } - for (int i = 0; i < percents.length; i++) { - if (percents[i] < 0 || percents[i] > 100) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (i > 0 && percents[i] < percents[i-1]) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - } - } - - // Are these settings the same as before? - final Color background = getBackground(); - if (backgroundImage == null) { - if ((gradientColors != null) && (colors != null) && - (gradientColors.length == colors.length)) { - boolean same = false; - for (int i = 0; i < gradientColors.length; i++) { - same = (gradientColors[i] == colors[i]) || - ((gradientColors[i] == null) && (colors[i] == background)) || - ((gradientColors[i] == background) && (colors[i] == null)); - if (!same) break; - } - if (same) { - for (int i = 0; i < gradientPercents.length; i++) { - same = gradientPercents[i] == percents[i]; - if (!same) break; - } - } - if (same && this.gradientVertical == vertical) return; - } - } else { - backgroundImage = null; - } - // Store the new settings - if (colors == null) { - gradientColors = null; - gradientPercents = null; - gradientVertical = false; - } else { - gradientColors = new Color[colors.length]; - for (int i = 0; i < colors.length; ++i) - gradientColors[i] = (colors[i] != null) ? colors[i] : background; - gradientPercents = new int[percents.length]; - for (int i = 0; i < percents.length; ++i) - gradientPercents[i] = percents[i]; - gradientVertical = vertical; - } - // Refresh with the new settings - redraw(); -} -/** - * Set the image to be drawn in the background of the label. - * - * @param image the image to be drawn in the background - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setBackground(Image image) { - checkWidget(); - if (image == backgroundImage) return; - if (image != null) { - gradientColors = null; - gradientPercents = null; - } - backgroundImage = image; - redraw(); - -} -public void setFont(Font font) { - super.setFont(font); - redraw(); -} -/** - * Set the label's Image. - * The value null clears it. - * - * @param image the image to be displayed in the label or null - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setImage(Image image) { - checkWidget(); - if (image != this.image) { - this.image = image; - redraw(); - } -} -/** - * Set the label's text. - * The value null clears it. - *

    - * Mnemonics are indicated by an '&' that causes the next - * character to be the mnemonic. When the user presses a - * key sequence that matches the mnemonic, focus is assigned - * to the control that follows the label. On most platforms, - * the mnemonic appears underlined but may be emphasised in a - * platform specific manner. The mnemonic indicator character - * '&' can be escaped by doubling it in the string, causing - * a single '&' to be displayed. - *

    - * - * @param text the text to be displayed in the label or null - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setText(String text) { - checkWidget(); - if (text == null) text = ""; //$NON-NLS-1$ - if (! text.equals(this.text)) { - this.text = text; - redraw(); - } -} -public void setToolTipText (String string) { - super.setToolTipText (string); - appToolTipText = super.getToolTipText(); -} -/** - * Shorten the given text t so that its length doesn't exceed - * the given width. The default implementation replaces characters in the - * center of the original string with an ellipsis ("..."). - * Override if you need a different strategy. - * - * @param gc the gc to use for text measurement - * @param t the text to shorten - * @param width the width to shorten the text to, in pixels - * @return the shortened text - */ -protected String shortenText(GC gc, String t, int width) { - if (t == null) return null; - int w = gc.textExtent(ELLIPSIS, DRAW_FLAGS).x; - if (width<=w) return t; - int l = t.length(); - int max = l/2; - int min = 0; - int mid = (max+min)/2 - 1; - if (mid <= 0) return t; - TextLayout layout = new TextLayout (getDisplay()); - layout.setText(t); - mid = validateOffset(layout, mid); - while (min < mid && mid < max) { - String s1 = t.substring(0, mid); - String s2 = t.substring(validateOffset(layout, l-mid), l); - int l1 = gc.textExtent(s1, DRAW_FLAGS).x; - int l2 = gc.textExtent(s2, DRAW_FLAGS).x; - if (l1+w+l2 > width) { - max = mid; - mid = validateOffset(layout, (max+min)/2); - } else if (l1+w+l2 < width) { - min = mid; - mid = validateOffset(layout, (max+min)/2); - } else { - min = max; - } - } - String result = mid == 0 ? t : t.substring(0, mid) + ELLIPSIS + t.substring(validateOffset(layout, l-mid), l); - layout.dispose(); - return result; -} -int validateOffset(TextLayout layout, int offset) { - int nextOffset = layout.getNextOffset(offset, SWT.MOVEMENT_CLUSTER); - if (nextOffset != offset) return layout.getPreviousOffset(nextOffset, SWT.MOVEMENT_CLUSTER); - return offset; -} -private String[] splitString(String text) { - String[] lines = new String[1]; - int start = 0, pos; - do { - pos = text.indexOf('\n', start); - if (pos == -1) { - lines[lines.length - 1] = text.substring(start); - } else { - boolean crlf = (pos > 0) && (text.charAt(pos - 1) == '\r'); - lines[lines.length - 1] = text.substring(start, pos - (crlf ? 1 : 0)); - start = pos + 1; - String[] newLines = new String[lines.length+1]; - System.arraycopy(lines, 0, newLines, 0, lines.length); - lines = newLines; - } - } while (pos != -1); - return lines; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CLayoutData.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CLayoutData.java deleted file mode 100644 index 7af979e690..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CLayoutData.java +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -class CLayoutData { - - int defaultWidth = -1, defaultHeight = -1; - int currentWhint, currentHhint, currentWidth = -1, currentHeight = -1; - -Point computeSize (Control control, int wHint, int hHint, boolean flushCache) { - if (flushCache) flushCache(); - if (wHint == SWT.DEFAULT && hHint == SWT.DEFAULT) { - if (defaultWidth == -1 || defaultHeight == -1) { - Point size = control.computeSize (wHint, hHint, flushCache); - defaultWidth = size.x; - defaultHeight = size.y; - } - return new Point(defaultWidth, defaultHeight); - } - if (currentWidth == -1 || currentHeight == -1 || wHint != currentWhint || hHint != currentHhint) { - Point size = control.computeSize (wHint, hHint, flushCache); - currentWhint = wHint; - currentHhint = hHint; - currentWidth = size.x; - currentHeight = size.y; - } - return new Point(currentWidth, currentHeight); -} -void flushCache () { - defaultWidth = defaultHeight = -1; - currentWidth = currentHeight = -1; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java deleted file mode 100755 index 9d26184c96..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java +++ /dev/null @@ -1,4031 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.accessibility.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * - * Instances of this class implement the notebook user interface - * metaphor. It allows the user to select a notebook page from - * set of pages. - *

    - * The item children that may be added to instances of this class - * must be of type CTabItem. - * Control children are created and then set into a - * tab item using CTabItem#setControl. - *

    - * Note that although this class is a subclass of Composite, - * it does not make sense to set a layout on it. - *

    - *

    - *
    Styles:
    - *
    CLOSE, TOP, BOTTOM, FLAT, BORDER, SINGLE, MULTI
    - *
    Events:
    - *
    Selection
    - *
    "CTabFolder2"
    - *
    - *

    - * Note: Only one of the styles TOP and BOTTOM - * may be specified. - *

    - * IMPORTANT: This class is not intended to be subclassed. - *

    - * - * @see CTabFolder, CTabItem snippets - * @see SWT Example: CustomControlExample - * @see Sample code and further information - * @noextend This class is not intended to be subclassed by clients. - */ - -public class CTabFolder extends Composite { - - /** - * marginWidth specifies the number of pixels of horizontal margin - * that will be placed along the left and right edges of the form. - * - * The default value is 0. - */ - public int marginWidth = 0; - /** - * marginHeight specifies the number of pixels of vertical margin - * that will be placed along the top and bottom edges of the form. - * - * The default value is 0. - */ - public int marginHeight = 0; - - /** - * A multiple of the tab height that specifies the minimum width to which a tab - * will be compressed before scrolling arrows are used to navigate the tabs. - * - * NOTE This field is badly named and can not be fixed for backwards compatibility. - * It should not be capitalized. - * - * @deprecated This field is no longer used. See setMinimumCharacters(int) - */ - public int MIN_TAB_WIDTH = 4; - - /** - * Color of innermost line of drop shadow border. - * - * NOTE This field is badly named and can not be fixed for backwards compatibility. - * It should be capitalized. - * - * @deprecated drop shadow border is no longer drawn in 3.0 - */ - public static RGB borderInsideRGB = new RGB (132, 130, 132); - /** - * Color of middle line of drop shadow border. - * - * NOTE This field is badly named and can not be fixed for backwards compatibility. - * It should be capitalized. - * - * @deprecated drop shadow border is no longer drawn in 3.0 - */ - public static RGB borderMiddleRGB = new RGB (143, 141, 138); - /** - * Color of outermost line of drop shadow border. - * - * NOTE This field is badly named and can not be fixed for backwards compatibility. - * It should be capitalized. - * - * @deprecated drop shadow border is no longer drawn in 3.0 - */ - public static RGB borderOutsideRGB = new RGB (171, 168, 165); - - /* sizing, positioning */ - int xClient, yClient; - boolean onBottom = false; - boolean single = false; - boolean simple = true; - int fixedTabHeight = SWT.DEFAULT; - int tabHeight; - int minChars = 20; - - /* item management */ - CTabItem items[] = new CTabItem[0]; - int firstIndex = -1; // index of the left most visible tab. - int selectedIndex = -1; - int[] priority = new int[0]; - boolean mru = false; - Listener listener; - boolean ignoreTraverse; - - /* External Listener management */ - CTabFolder2Listener[] folderListeners = new CTabFolder2Listener[0]; - // support for deprecated listener mechanism - CTabFolderListener[] tabListeners = new CTabFolderListener[0]; - - /* Selected item appearance */ - Image selectionBgImage; - Color[] selectionGradientColors; - int[] selectionGradientPercents; - boolean selectionGradientVertical; - Color selectionForeground; - Color selectionBackground; //selection fade end - Color selectionFadeStart; - - Color selectionHighlightGradientBegin = null; //null == no highlight - //Although we are given new colours all the time to show different states (active, etc), - //some of which may have a highlight and some not, we'd like to retain the highlight colours - //as a cache so that we can reuse them if we're again told to show the highlight. - //We are relying on the fact that only one tab state usually gets a highlight, so only - //a single cache is required. If that happens to not be true, cache simply becomes less effective, - //but we don't leak colours. - Color[] selectionHighlightGradientColorsCache = null; //null is a legal value, check on access - - /* Unselected item appearance */ - Color[] gradientColors; - int[] gradientPercents; - boolean gradientVertical; - boolean showUnselectedImage = true; - - // close, min/max and chevron buttons - Color fillColor; - boolean showClose = false; - boolean showUnselectedClose = true; - - Rectangle chevronRect = new Rectangle(0, 0, 0, 0); - int chevronImageState = NORMAL; - boolean showChevron = false; - Menu showMenu; - - boolean showMin = false; - Rectangle minRect = new Rectangle(0, 0, 0, 0); - boolean minimized = false; - int minImageState = NORMAL; - - boolean showMax = false; - Rectangle maxRect = new Rectangle(0, 0, 0, 0); - boolean maximized = false; - int maxImageState = NORMAL; - - Control topRight; - Rectangle topRightRect = new Rectangle(0, 0, 0, 0); - int topRightAlignment = SWT.RIGHT; - - // borders and shapes - int borderLeft = 0; - int borderRight = 0; - int borderTop = 0; - int borderBottom = 0; - - int highlight_margin = 0; - int highlight_header = 0; - - int[] curve; - int[] topCurveHighlightStart; - int[] topCurveHighlightEnd; - int curveWidth = 0; - int curveIndent = 0; - - // when disposing CTabFolder, don't try to layout the items or - // change the selection as each child is destroyed. - boolean inDispose = false; - - // keep track of size changes in order to redraw only affected area - // on Resize - Point oldSize; - Font oldFont; - - // internal constants - static final int DEFAULT_WIDTH = 64; - static final int DEFAULT_HEIGHT = 64; - static final int BUTTON_SIZE = 18; - - static final int[] TOP_LEFT_CORNER = new int[] {0,6, 1,5, 1,4, 4,1, 5,1, 6,0}; - - //TOP_LEFT_CORNER_HILITE is laid out in reverse (ie. top to bottom) - //so can fade in same direction as right swoop curve - static final int[] TOP_LEFT_CORNER_HILITE = new int[] {5,2, 4,2, 3,3, 2,4, 2,5, 1,6}; - - static final int[] TOP_RIGHT_CORNER = new int[] {-6,0, -5,1, -4,1, -1,4, -1,5, 0,6}; - static final int[] BOTTOM_LEFT_CORNER = new int[] {0,-6, 1,-5, 1,-4, 4,-1, 5,-1, 6,0}; - static final int[] BOTTOM_RIGHT_CORNER = new int[] {-6,0, -5,-1, -4,-1, -1,-4, -1,-5, 0,-6}; - - static final int[] SIMPLE_TOP_LEFT_CORNER = new int[] {0,2, 1,1, 2,0}; - static final int[] SIMPLE_TOP_RIGHT_CORNER = new int[] {-2,0, -1,1, 0,2}; - static final int[] SIMPLE_BOTTOM_LEFT_CORNER = new int[] {0,-2, 1,-1, 2,0}; - static final int[] SIMPLE_BOTTOM_RIGHT_CORNER = new int[] {-2,0, -1,-1, 0,-2}; - static final int[] SIMPLE_UNSELECTED_INNER_CORNER = new int[] {0,0}; - - static final int[] TOP_LEFT_CORNER_BORDERLESS = new int[] {0,6, 1,5, 1,4, 4,1, 5,1, 6,0}; - static final int[] TOP_RIGHT_CORNER_BORDERLESS = new int[] {-7,0, -6,1, -5,1, -2,4, -2,5, -1,6}; - static final int[] BOTTOM_LEFT_CORNER_BORDERLESS = new int[] {0,-6, 1,-6, 1,-5, 2,-4, 4,-2, 5,-1, 6,-1, 6,0}; - static final int[] BOTTOM_RIGHT_CORNER_BORDERLESS = new int[] {-7,0, -7,-1, -6,-1, -5,-2, -3,-4, -2,-5, -2,-6, -1,-6}; - - static final int[] SIMPLE_TOP_LEFT_CORNER_BORDERLESS = new int[] {0,2, 1,1, 2,0}; - static final int[] SIMPLE_TOP_RIGHT_CORNER_BORDERLESS= new int[] {-3,0, -2,1, -1,2}; - static final int[] SIMPLE_BOTTOM_LEFT_CORNER_BORDERLESS = new int[] {0,-3, 1,-2, 2,-1, 3,0}; - static final int[] SIMPLE_BOTTOM_RIGHT_CORNER_BORDERLESS = new int[] {-4,0, -3,-1, -2,-2, -1,-3}; - - static final int SELECTION_FOREGROUND = SWT.COLOR_LIST_FOREGROUND; - static final int SELECTION_BACKGROUND = SWT.COLOR_LIST_BACKGROUND; - static final int BORDER1_COLOR = SWT.COLOR_WIDGET_NORMAL_SHADOW; - static final int FOREGROUND = SWT.COLOR_WIDGET_FOREGROUND; - static final int BACKGROUND = SWT.COLOR_WIDGET_BACKGROUND; - static final int BUTTON_BORDER = SWT.COLOR_WIDGET_DARK_SHADOW; - static final int BUTTON_FILL = SWT.COLOR_LIST_BACKGROUND; - - static final int NONE = 0; - static final int NORMAL = 1; - static final int HOT = 2; - static final int SELECTED = 3; - static final RGB CLOSE_FILL = new RGB(252, 160, 160); - - static final int CHEVRON_CHILD_ID = 0; - static final int MINIMIZE_CHILD_ID = 1; - static final int MAXIMIZE_CHILD_ID = 2; - static final int EXTRA_CHILD_ID_COUNT = 3; - - -/** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    - * - * @see SWT#TOP - * @see SWT#BOTTOM - * @see SWT#FLAT - * @see SWT#BORDER - * @see SWT#SINGLE - * @see SWT#MULTI - * @see #getStyle() - */ -public CTabFolder(Composite parent, int style) { - super(parent, checkStyle (parent, style)); - init(style); -} - -void init(int style) { - super.setLayout(new CTabFolderLayout()); - int style2 = super.getStyle(); - oldFont = getFont(); - onBottom = (style2 & SWT.BOTTOM) != 0; - showClose = (style2 & SWT.CLOSE) != 0; -// showMin = (style2 & SWT.MIN) != 0; - conflicts with SWT.TOP -// showMax = (style2 & SWT.MAX) != 0; - conflicts with SWT.BOTTOM - single = (style2 & SWT.SINGLE) != 0; - borderLeft = borderRight = (style & SWT.BORDER) != 0 ? 1 : 0; - borderTop = onBottom ? borderLeft : 0; - borderBottom = onBottom ? 0 : borderLeft; - highlight_header = (style & SWT.FLAT) != 0 ? 1 : 3; - highlight_margin = (style & SWT.FLAT) != 0 ? 0 : 2; - //set up default colors - Display display = getDisplay(); - selectionForeground = display.getSystemColor(SELECTION_FOREGROUND); - selectionBackground = display.getSystemColor(SELECTION_BACKGROUND); - updateTabHeight(false); - - initAccessible(); - - // Add all listeners - listener = new Listener() { - public void handleEvent(Event event) { - switch (event.type) { - case SWT.Dispose: onDispose(event); break; - case SWT.DragDetect: onDragDetect(event); break; - case SWT.FocusIn: onFocus(event); break; - case SWT.FocusOut: onFocus(event); break; - case SWT.KeyDown: onKeyDown(event); break; - case SWT.MouseDoubleClick: onMouseDoubleClick(event); break; - case SWT.MouseDown: onMouse(event); break; - case SWT.MouseEnter: onMouse(event); break; - case SWT.MouseExit: onMouse(event); break; - case SWT.MouseMove: onMouse(event); break; - case SWT.MouseUp: onMouse(event); break; - case SWT.Paint: onPaint(event); break; - case SWT.Resize: onResize(); break; - case SWT.Traverse: onTraverse(event); break; - } - } - }; - - int[] folderEvents = new int[]{ - SWT.Dispose, - SWT.DragDetect, - SWT.FocusIn, - SWT.FocusOut, - SWT.KeyDown, - SWT.MouseDoubleClick, - SWT.MouseDown, - SWT.MouseEnter, - SWT.MouseExit, - SWT.MouseMove, - SWT.MouseUp, - SWT.Paint, - SWT.Resize, - SWT.Traverse, - }; - for (int i = 0; i < folderEvents.length; i++) { - addListener(folderEvents[i], listener); - } -} -static int checkStyle (Composite parent, int style) { - int mask = SWT.CLOSE | SWT.TOP | SWT.BOTTOM | SWT.FLAT | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT | SWT.SINGLE | SWT.MULTI; - style = style & mask; - // TOP and BOTTOM are mutually exclusive. - // TOP is the default - if ((style & SWT.TOP) != 0) style = style & ~SWT.BOTTOM; - // SINGLE and MULTI are mutually exclusive. - // MULTI is the default - if ((style & SWT.MULTI) != 0) style = style & ~SWT.SINGLE; - // reduce the flash by not redrawing the entire area on a Resize event - style |= SWT.NO_REDRAW_RESIZE; - //TEMPORARY CODE - /* - * The default background on carbon and some GTK themes is not a solid color - * but a texture. To show the correct default background, we must allow - * the operating system to draw it and therefore, we can not use the - * NO_BACKGROUND style. The NO_BACKGROUND style is not required on platforms - * that use double buffering which is true in both of these cases. - */ - String platform = SWT.getPlatform(); - if ("cocoa".equals(platform) || "carbon".equals(platform) || "gtk".equals(platform)) return style; //$NON-NLS-1$ //$NON-NLS-2$ - - //TEMPORARY CODE - /* - * In Right To Left orientation on Windows, all GC calls that use a brush are drawing - * offset by one pixel. This results in some parts of the CTabFolder not drawing correctly. - * To alleviate some of the appearance problems, allow the OS to draw the background. - * This does not draw correctly but the result is less obviously wrong. - */ - if ((style & SWT.RIGHT_TO_LEFT) != 0) return style; - if ((parent.getStyle() & SWT.MIRRORED) != 0 && (style & SWT.LEFT_TO_RIGHT) == 0) return style; - - return style | SWT.NO_BACKGROUND; -} -static void fillRegion(GC gc, Region region) { - // NOTE: region passed in to this function will be modified - Region clipping = new Region(); - gc.getClipping(clipping); - region.intersect(clipping); - gc.setClipping(region); - gc.fillRectangle(region.getBounds()); - gc.setClipping(clipping); - clipping.dispose(); -} -/** - * - * Adds the listener to the collection of listeners who will - * be notified when a tab item is closed, minimized, maximized, - * restored, or to show the list of items that are not - * currently visible. - * - * @param listener the listener which should be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - * - * @see CTabFolder2Listener - * @see #removeCTabFolder2Listener(CTabFolder2Listener) - * - * @since 3.0 - */ -public void addCTabFolder2Listener(CTabFolder2Listener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - // add to array - CTabFolder2Listener[] newListeners = new CTabFolder2Listener[folderListeners.length + 1]; - System.arraycopy(folderListeners, 0, newListeners, 0, folderListeners.length); - folderListeners = newListeners; - folderListeners[folderListeners.length - 1] = listener; -} -/** - * Adds the listener to the collection of listeners who will - * be notified when a tab item is closed. - * - * @param listener the listener which should be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - * - * @see CTabFolderListener - * @see #removeCTabFolderListener(CTabFolderListener) - * - * @deprecated use addCTabFolder2Listener(CTabFolder2Listener) - */ -public void addCTabFolderListener(CTabFolderListener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - // add to array - CTabFolderListener[] newTabListeners = new CTabFolderListener[tabListeners.length + 1]; - System.arraycopy(tabListeners, 0, newTabListeners, 0, tabListeners.length); - tabListeners = newTabListeners; - tabListeners[tabListeners.length - 1] = listener; - // display close button to be backwards compatible - if (!showClose) { - showClose = true; - updateItems(); - redraw(); - } -} -/** - * Adds the listener to the collection of listeners who will - * be notified when the user changes the receiver's selection, by sending - * it one of the messages defined in the SelectionListener - * interface. - *

    - * widgetSelected is called when the user changes the selected tab. - * widgetDefaultSelected is not called. - *

    - * - * @param listener the listener which should be notified when the user changes the receiver's selection - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see SelectionListener - * @see #removeSelectionListener - * @see SelectionEvent - */ -public void addSelectionListener(SelectionListener listener) { - checkWidget(); - if (listener == null) { - SWT.error(SWT.ERROR_NULL_ARGUMENT); - } - TypedListener typedListener = new TypedListener(listener); - addListener(SWT.Selection, typedListener); - addListener(SWT.DefaultSelection, typedListener); -} -void antialias (int[] shape, RGB lineRGB, RGB innerRGB, RGB outerRGB, GC gc){ - // Don't perform anti-aliasing on Mac and WPF because the platform - // already does it. The simple style also does not require anti-aliasing. - if (simple) return; - String platform = SWT.getPlatform(); - if ("cocoa".equals(platform)) return; //$NON-NLS-1$ - if ("carbon".equals(platform)) return; //$NON-NLS-1$ - if ("wpf".equals(platform)) return; //$NON-NLS-1$ - // Don't perform anti-aliasing on low resolution displays - if (getDisplay().getDepth() < 15) return; - if (outerRGB != null) { - int index = 0; - boolean left = true; - int oldY = onBottom ? 0 : getSize().y; - int[] outer = new int[shape.length]; - for (int i = 0; i < shape.length/2; i++) { - if (left && (index + 3 < shape.length)) { - left = onBottom ? oldY <= shape[index+3] : oldY >= shape[index+3]; - oldY = shape[index+1]; - } - outer[index] = shape[index++] + (left ? -1 : +1); - outer[index] = shape[index++]; - } - RGB from = lineRGB; - RGB to = outerRGB; - int red = from.red + 2*(to.red - from.red)/3; - int green = from.green + 2*(to.green - from.green)/3; - int blue = from.blue + 2*(to.blue - from.blue)/3; - Color color = new Color(getDisplay(), red, green, blue); - gc.setForeground(color); - gc.drawPolyline(outer); - color.dispose(); - } - if (innerRGB != null) { - int[] inner = new int[shape.length]; - int index = 0; - boolean left = true; - int oldY = onBottom ? 0 : getSize().y; - for (int i = 0; i < shape.length/2; i++) { - if (left && (index + 3 < shape.length)) { - left = onBottom ? oldY <= shape[index+3] : oldY >= shape[index+3]; - oldY = shape[index+1]; - } - inner[index] = shape[index++] + (left ? +1 : -1); - inner[index] = shape[index++]; - } - RGB from = lineRGB; - RGB to = innerRGB; - int red = from.red + 2*(to.red - from.red)/3; - int green = from.green + 2*(to.green - from.green)/3; - int blue = from.blue + 2*(to.blue - from.blue)/3; - Color color = new Color(getDisplay(), red, green, blue); - gc.setForeground(color); - gc.drawPolyline(inner); - color.dispose(); - } -} -/* -* This class was not intended to be subclassed but this restriction -* cannot be enforced without breaking backward compatibility. -*/ -//protected void checkSubclass () { -// String name = getClass ().getName (); -// int index = name.lastIndexOf ('.'); -// if (!name.substring (0, index + 1).equals ("org.eclipse.swt.custom.")) { -// SWT.error (SWT.ERROR_INVALID_SUBCLASS); -// } -//} -public Rectangle computeTrim (int x, int y, int width, int height) { - checkWidget(); - int trimX = x - marginWidth - highlight_margin - borderLeft; - int trimWidth = width + borderLeft + borderRight + 2*marginWidth + 2*highlight_margin; - if (minimized) { - int trimY = onBottom ? y - borderTop : y - highlight_header - tabHeight - borderTop; - int trimHeight = borderTop + borderBottom + tabHeight + highlight_header; - return new Rectangle (trimX, trimY, trimWidth, trimHeight); - } else { - int trimY = onBottom ? y - marginHeight - highlight_margin - borderTop: y - marginHeight - highlight_header - tabHeight - borderTop; - int trimHeight = height + borderTop + borderBottom + 2*marginHeight + tabHeight + highlight_header + highlight_margin; - return new Rectangle (trimX, trimY, trimWidth, trimHeight); - } -} -void createItem (CTabItem item, int index) { - if (0 > index || index > getItemCount ())SWT.error (SWT.ERROR_INVALID_RANGE); - item.parent = this; - CTabItem[] newItems = new CTabItem [items.length + 1]; - System.arraycopy(items, 0, newItems, 0, index); - newItems[index] = item; - System.arraycopy(items, index, newItems, index + 1, items.length - index); - items = newItems; - if (selectedIndex >= index) selectedIndex ++; - int[] newPriority = new int[priority.length + 1]; - int next = 0, priorityIndex = priority.length; - for (int i = 0; i < priority.length; i++) { - if (!mru && priority[i] == index) { - priorityIndex = next++; - } - newPriority[next++] = priority[i] >= index ? priority[i] + 1 : priority[i]; - } - newPriority[priorityIndex] = index; - priority = newPriority; - - if (items.length == 1) { - if (!updateTabHeight(false)) updateItems(); - redraw(); - } else { - updateItems(); - redrawTabs(); - } -} -void destroyItem (CTabItem item) { - if (inDispose) return; - int index = indexOf(item); - if (index == -1) return; - - if (items.length == 1) { - items = new CTabItem[0]; - priority = new int[0]; - firstIndex = -1; - selectedIndex = -1; - - Control control = item.getControl(); - if (control != null && !control.isDisposed()) { - control.setVisible(false); - } - setToolTipText(null); - setButtonBounds(); - redraw(); - return; - } - - CTabItem[] newItems = new CTabItem [items.length - 1]; - System.arraycopy(items, 0, newItems, 0, index); - System.arraycopy(items, index + 1, newItems, index, items.length - index - 1); - items = newItems; - - int[] newPriority = new int[priority.length - 1]; - int next = 0; - for (int i = 0; i < priority.length; i++) { - if (priority [i] == index) continue; - newPriority[next++] = priority[i] > index ? priority[i] - 1 : priority [i]; - } - priority = newPriority; - - // move the selection if this item is selected - if (selectedIndex == index) { - Control control = item.getControl(); - selectedIndex = -1; - int nextSelection = mru ? priority[0] : Math.max(0, index - 1); - setSelection(nextSelection, true); - if (control != null && !control.isDisposed()) { - control.setVisible(false); - } - } else if (selectedIndex > index) { - selectedIndex --; - } - - updateItems(); - redrawTabs(); -} -void drawBackground(GC gc, int[] shape, boolean selected) { - Color defaultBackground = selected ? selectionBackground : getBackground(); - Image image = selected ? selectionBgImage : null; - Color[] colors = selected ? selectionGradientColors : gradientColors; - int[] percents = selected ? selectionGradientPercents : gradientPercents; - boolean vertical = selected ? selectionGradientVertical : gradientVertical; - Point size = getSize(); - int width = size.x; - int height = tabHeight + highlight_header; - int x = 0; - if (borderLeft > 0) { - x += 1; width -= 2; - } - int y = onBottom ? size.y - borderBottom - height : borderTop; - drawBackground(gc, shape, x, y, width, height, defaultBackground, image, colors, percents, vertical); -} -void drawBackground(GC gc, int[] shape, int x, int y, int width, int height, Color defaultBackground, Image image, Color[] colors, int[] percents, boolean vertical) { - Region clipping = new Region(); - gc.getClipping(clipping); - Region region = new Region(); - region.add(shape); - region.intersect(clipping); - gc.setClipping(region); - - if (image != null) { - // draw the background image in shape - gc.setBackground(defaultBackground); - gc.fillRectangle(x, y, width, height); - Rectangle imageRect = image.getBounds(); - gc.drawImage(image, imageRect.x, imageRect.y, imageRect.width, imageRect.height, x, y, width, height); - } else if (colors != null) { - // draw gradient - if (colors.length == 1) { - Color background = colors[0] != null ? colors[0] : defaultBackground; - gc.setBackground(background); - gc.fillRectangle(x, y, width, height); - } else { - if (vertical) { - if (onBottom) { - int pos = 0; - if (percents[percents.length - 1] < 100) { - pos = (100 - percents[percents.length - 1]) * height / 100; - gc.setBackground(defaultBackground); - gc.fillRectangle(x, y, width, pos); - } - Color lastColor = colors[colors.length-1]; - if (lastColor == null) lastColor = defaultBackground; - for (int i = percents.length-1; i >= 0; i--) { - gc.setForeground(lastColor); - lastColor = colors[i]; - if (lastColor == null) lastColor = defaultBackground; - gc.setBackground(lastColor); - int percentage = i > 0 ? percents[i] - percents[i-1] : percents[i]; - int gradientHeight = percentage * height / 100; - gc.fillGradientRectangle(x, y+pos, width, gradientHeight, true); - pos += gradientHeight; - } - } else { - Color lastColor = colors[0]; - if (lastColor == null) lastColor = defaultBackground; - int pos = 0; - for (int i = 0; i < percents.length; i++) { - gc.setForeground(lastColor); - lastColor = colors[i + 1]; - if (lastColor == null) lastColor = defaultBackground; - gc.setBackground(lastColor); - int percentage = i > 0 ? percents[i] - percents[i-1] : percents[i]; - int gradientHeight = percentage * height / 100; - gc.fillGradientRectangle(x, y+pos, width, gradientHeight, true); - pos += gradientHeight; - } - if (pos < height) { - gc.setBackground(defaultBackground); - gc.fillRectangle(x, pos, width, height-pos+1); - } - } - } else { //horizontal gradient - y = 0; - height = getSize().y; - Color lastColor = colors[0]; - if (lastColor == null) lastColor = defaultBackground; - int pos = 0; - for (int i = 0; i < percents.length; ++i) { - gc.setForeground(lastColor); - lastColor = colors[i + 1]; - if (lastColor == null) lastColor = defaultBackground; - gc.setBackground(lastColor); - int gradientWidth = (percents[i] * width / 100) - pos; - gc.fillGradientRectangle(x+pos, y, gradientWidth, height, false); - pos += gradientWidth; - } - if (pos < width) { - gc.setBackground(defaultBackground); - gc.fillRectangle(x+pos, y, width-pos, height); - } - } - } - } else { - // draw a solid background using default background in shape - if ((getStyle() & SWT.NO_BACKGROUND) != 0 || !defaultBackground.equals(getBackground())) { - gc.setBackground(defaultBackground); - gc.fillRectangle(x, y, width, height); - } - } - gc.setClipping(clipping); - clipping.dispose(); - region.dispose(); -} -void drawBody(Event event) { - GC gc = event.gc; - Point size = getSize(); - - // fill in body - if (!minimized){ - int width = size.x - borderLeft - borderRight - 2*highlight_margin; - int height = size.y - borderTop - borderBottom - tabHeight - highlight_header - highlight_margin; - // Draw highlight margin - if (highlight_margin > 0) { - int[] shape = null; - if (onBottom) { - int x1 = borderLeft; - int y1 = borderTop; - int x2 = size.x - borderRight; - int y2 = size.y - borderBottom - tabHeight - highlight_header; - shape = new int[] {x1,y1, x2,y1, x2,y2, x2-highlight_margin,y2, - x2-highlight_margin, y1+highlight_margin, x1+highlight_margin,y1+highlight_margin, - x1+highlight_margin,y2, x1,y2}; - } else { - int x1 = borderLeft; - int y1 = borderTop + tabHeight + highlight_header; - int x2 = size.x - borderRight; - int y2 = size.y - borderBottom; - shape = new int[] {x1,y1, x1+highlight_margin,y1, x1+highlight_margin,y2-highlight_margin, - x2-highlight_margin,y2-highlight_margin, x2-highlight_margin,y1, - x2,y1, x2,y2, x1,y2}; - } - // If horizontal gradient, show gradient across the whole area - if (selectedIndex != -1 && selectionGradientColors != null && selectionGradientColors.length > 1 && !selectionGradientVertical) { - drawBackground(gc, shape, true); - } else if (selectedIndex == -1 && gradientColors != null && gradientColors.length > 1 && !gradientVertical) { - drawBackground(gc, shape, false); - } else { - gc.setBackground(selectedIndex == -1 ? getBackground() : selectionBackground); - gc.fillPolygon(shape); - } - } - //Draw client area - if ((getStyle() & SWT.NO_BACKGROUND) != 0) { - gc.setBackground(getBackground()); - gc.fillRectangle(xClient - marginWidth, yClient - marginHeight, width, height); - } - } else { - if ((getStyle() & SWT.NO_BACKGROUND) != 0) { - int height = borderTop + tabHeight + highlight_header + borderBottom; - if (size.y > height) { - gc.setBackground(getParent().getBackground()); - gc.fillRectangle(0, height, size.x, size.y - height); - } - } - } - - //draw 1 pixel border around outside - if (borderLeft > 0) { - gc.setForeground(getDisplay().getSystemColor(BORDER1_COLOR)); - int x1 = borderLeft - 1; - int x2 = size.x - borderRight; - int y1 = onBottom ? borderTop - 1 : borderTop + tabHeight; - int y2 = onBottom ? size.y - tabHeight - borderBottom - 1 : size.y - borderBottom; - gc.drawLine(x1, y1, x1, y2); // left - gc.drawLine(x2, y1, x2, y2); // right - if (onBottom) { - gc.drawLine(x1, y1, x2, y1); // top - } else { - gc.drawLine(x1, y2, x2, y2); // bottom - } - } -} - -void drawChevron(GC gc) { - if (chevronRect.width == 0 || chevronRect.height == 0) return; - // draw chevron (10x7) - Display display = getDisplay(); - Point dpi = display.getDPI(); - int fontHeight = 72 * 10 / dpi.y; - FontData fd = getFont().getFontData()[0]; - fd.setHeight(fontHeight); - Font f = new Font(display, fd); - int fHeight = f.getFontData()[0].getHeight() * dpi.y / 72; - int indent = Math.max(2, (chevronRect.height - fHeight - 4) /2); - int x = chevronRect.x + 2; - int y = chevronRect.y + indent; - int count; - if (single) { - count = selectedIndex == -1 ? items.length : items.length - 1; - } else { - int showCount = 0; - while (showCount < priority.length && items[priority[showCount]].showing) { - showCount++; - } - count = items.length - showCount; - } - String chevronString = count > 99 ? "99+" : String.valueOf(count); //$NON-NLS-1$ - switch (chevronImageState) { - case NORMAL: { - Color chevronBorder = single ? getSelectionForeground() : getForeground(); - gc.setForeground(chevronBorder); - gc.setFont(f); - gc.drawLine(x,y, x+2,y+2); - gc.drawLine(x+2,y+2, x,y+4); - gc.drawLine(x+1,y, x+3,y+2); - gc.drawLine(x+3,y+2, x+1,y+4); - gc.drawLine(x+4,y, x+6,y+2); - gc.drawLine(x+6,y+2, x+5,y+4); - gc.drawLine(x+5,y, x+7,y+2); - gc.drawLine(x+7,y+2, x+4,y+4); - gc.drawString(chevronString, x+7, y+3, true); - break; - } - case HOT: { - gc.setForeground(display.getSystemColor(BUTTON_BORDER)); - gc.setBackground(display.getSystemColor(BUTTON_FILL)); - gc.setFont(f); - gc.fillRoundRectangle(chevronRect.x, chevronRect.y, chevronRect.width, chevronRect.height, 6, 6); - gc.drawRoundRectangle(chevronRect.x, chevronRect.y, chevronRect.width - 1, chevronRect.height - 1, 6, 6); - gc.drawLine(x,y, x+2,y+2); - gc.drawLine(x+2,y+2, x,y+4); - gc.drawLine(x+1,y, x+3,y+2); - gc.drawLine(x+3,y+2, x+1,y+4); - gc.drawLine(x+4,y, x+6,y+2); - gc.drawLine(x+6,y+2, x+5,y+4); - gc.drawLine(x+5,y, x+7,y+2); - gc.drawLine(x+7,y+2, x+4,y+4); - gc.drawString(chevronString, x+7, y+3, true); - break; - } - case SELECTED: { - gc.setForeground(display.getSystemColor(BUTTON_BORDER)); - gc.setBackground(display.getSystemColor(BUTTON_FILL)); - gc.setFont(f); - gc.fillRoundRectangle(chevronRect.x, chevronRect.y, chevronRect.width, chevronRect.height, 6, 6); - gc.drawRoundRectangle(chevronRect.x, chevronRect.y, chevronRect.width - 1, chevronRect.height - 1, 6, 6); - gc.drawLine(x+1,y+1, x+3,y+3); - gc.drawLine(x+3,y+3, x+1,y+5); - gc.drawLine(x+2,y+1, x+4,y+3); - gc.drawLine(x+4,y+3, x+2,y+5); - gc.drawLine(x+5,y+1, x+7,y+3); - gc.drawLine(x+7,y+3, x+6,y+5); - gc.drawLine(x+6,y+1, x+8,y+3); - gc.drawLine(x+8,y+3, x+5,y+5); - gc.drawString(chevronString, x+8, y+4, true); - break; - } - } - f.dispose(); -} -void drawMaximize(GC gc) { - if (maxRect.width == 0 || maxRect.height == 0) return; - Display display = getDisplay(); - // 5x4 or 7x9 - int x = maxRect.x + (CTabFolder.BUTTON_SIZE - 10)/2; - int y = maxRect.y + 3; - - gc.setForeground(display.getSystemColor(BUTTON_BORDER)); - gc.setBackground(display.getSystemColor(BUTTON_FILL)); - - switch (maxImageState) { - case NORMAL: { - if (!maximized) { - gc.fillRectangle(x, y, 9, 9); - gc.drawRectangle(x, y, 9, 9); - gc.drawLine(x+1, y+2, x+8, y+2); - } else { - gc.fillRectangle(x, y+3, 5, 4); - gc.fillRectangle(x+2, y, 5, 4); - gc.drawRectangle(x, y+3, 5, 4); - gc.drawRectangle(x+2, y, 5, 4); - gc.drawLine(x+3, y+1, x+6, y+1); - gc.drawLine(x+1, y+4, x+4, y+4); - } - break; - } - case HOT: { - gc.fillRoundRectangle(maxRect.x, maxRect.y, maxRect.width, maxRect.height, 6, 6); - gc.drawRoundRectangle(maxRect.x, maxRect.y, maxRect.width - 1, maxRect.height - 1, 6, 6); - if (!maximized) { - gc.fillRectangle(x, y, 9, 9); - gc.drawRectangle(x, y, 9, 9); - gc.drawLine(x+1, y+2, x+8, y+2); - } else { - gc.fillRectangle(x, y+3, 5, 4); - gc.fillRectangle(x+2, y, 5, 4); - gc.drawRectangle(x, y+3, 5, 4); - gc.drawRectangle(x+2, y, 5, 4); - gc.drawLine(x+3, y+1, x+6, y+1); - gc.drawLine(x+1, y+4, x+4, y+4); - } - break; - } - case SELECTED: { - gc.fillRoundRectangle(maxRect.x, maxRect.y, maxRect.width, maxRect.height, 6, 6); - gc.drawRoundRectangle(maxRect.x, maxRect.y, maxRect.width - 1, maxRect.height - 1, 6, 6); - if (!maximized) { - gc.fillRectangle(x+1, y+1, 9, 9); - gc.drawRectangle(x+1, y+1, 9, 9); - gc.drawLine(x+2, y+3, x+9, y+3); - } else { - gc.fillRectangle(x+1, y+4, 5, 4); - gc.fillRectangle(x+3, y+1, 5, 4); - gc.drawRectangle(x+1, y+4, 5, 4); - gc.drawRectangle(x+3, y+1, 5, 4); - gc.drawLine(x+4, y+2, x+7, y+2); - gc.drawLine(x+2, y+5, x+5, y+5); - } - break; - } - } -} -void drawMinimize(GC gc) { - if (minRect.width == 0 || minRect.height == 0) return; - Display display = getDisplay(); - // 5x4 or 9x3 - int x = minRect.x + (BUTTON_SIZE - 10)/2; - int y = minRect.y + 3; - - gc.setForeground(display.getSystemColor(BUTTON_BORDER)); - gc.setBackground(display.getSystemColor(BUTTON_FILL)); - - switch (minImageState) { - case NORMAL: { - if (!minimized) { - gc.fillRectangle(x, y, 9, 3); - gc.drawRectangle(x, y, 9, 3); - } else { - gc.fillRectangle(x, y+3, 5, 4); - gc.fillRectangle(x+2, y, 5, 4); - gc.drawRectangle(x, y+3, 5, 4); - gc.drawRectangle(x+2, y, 5, 4); - gc.drawLine(x+3, y+1, x+6, y+1); - gc.drawLine(x+1, y+4, x+4, y+4); - } - break; - } - case HOT: { - gc.fillRoundRectangle(minRect.x, minRect.y, minRect.width, minRect.height, 6, 6); - gc.drawRoundRectangle(minRect.x, minRect.y, minRect.width - 1, minRect.height - 1, 6, 6); - if (!minimized) { - gc.fillRectangle(x, y, 9, 3); - gc.drawRectangle(x, y, 9, 3); - } else { - gc.fillRectangle(x, y+3, 5, 4); - gc.fillRectangle(x+2, y, 5, 4); - gc.drawRectangle(x, y+3, 5, 4); - gc.drawRectangle(x+2, y, 5, 4); - gc.drawLine(x+3, y+1, x+6, y+1); - gc.drawLine(x+1, y+4, x+4, y+4); - } - break; - } - case SELECTED: { - gc.fillRoundRectangle(minRect.x, minRect.y, minRect.width, minRect.height, 6, 6); - gc.drawRoundRectangle(minRect.x, minRect.y, minRect.width - 1, minRect.height - 1, 6, 6); - if (!minimized) { - gc.fillRectangle(x+1, y+1, 9, 3); - gc.drawRectangle(x+1, y+1, 9, 3); - } else { - gc.fillRectangle(x+1, y+4, 5, 4); - gc.fillRectangle(x+3, y+1, 5, 4); - gc.drawRectangle(x+1, y+4, 5, 4); - gc.drawRectangle(x+3, y+1, 5, 4); - gc.drawLine(x+4, y+2, x+7, y+2); - gc.drawLine(x+2, y+5, x+5, y+5); - } - break; - } - } -} -void drawTabArea(Event event) { - GC gc = event.gc; - Point size = getSize(); - int[] shape = null; - Color borderColor = getDisplay().getSystemColor(BORDER1_COLOR); - - if (tabHeight == 0) { - int style = getStyle(); - if ((style & SWT.FLAT) != 0 && (style & SWT.BORDER) == 0) return; - int x1 = borderLeft - 1; - int x2 = size.x - borderRight; - int y1 = onBottom ? size.y - borderBottom - highlight_header - 1 : borderTop + highlight_header; - int y2 = onBottom ? size.y - borderBottom : borderTop; - if (borderLeft > 0 && onBottom) y2 -= 1; - - shape = new int[] {x1, y1, x1,y2, x2,y2, x2,y1}; - - // If horizontal gradient, show gradient across the whole area - if (selectedIndex != -1 && selectionGradientColors != null && selectionGradientColors.length > 1 && !selectionGradientVertical) { - drawBackground(gc, shape, true); - } else if (selectedIndex == -1 && gradientColors != null && gradientColors.length > 1 && !gradientVertical) { - drawBackground(gc, shape, false); - } else { - gc.setBackground(selectedIndex == -1 ? getBackground() : selectionBackground); - gc.fillPolygon(shape); - } - - //draw 1 pixel border - if (borderLeft > 0) { - gc.setForeground(borderColor); - gc.drawPolyline(shape); - } - return; - } - - int x = Math.max(0, borderLeft - 1); - int y = onBottom ? size.y - borderBottom - tabHeight : borderTop; - int width = size.x - borderLeft - borderRight + 1; - int height = tabHeight - 1; - - // Draw Tab Header - if (onBottom) { - int[] left, right; - if ((getStyle() & SWT.BORDER) != 0) { - left = simple ? SIMPLE_BOTTOM_LEFT_CORNER : BOTTOM_LEFT_CORNER; - right = simple ? SIMPLE_BOTTOM_RIGHT_CORNER : BOTTOM_RIGHT_CORNER; - } else { - left = simple ? SIMPLE_BOTTOM_LEFT_CORNER_BORDERLESS : BOTTOM_LEFT_CORNER_BORDERLESS; - right = simple ? SIMPLE_BOTTOM_RIGHT_CORNER_BORDERLESS : BOTTOM_RIGHT_CORNER_BORDERLESS; - } - shape = new int[left.length + right.length + 4]; - int index = 0; - shape[index++] = x; - shape[index++] = y-highlight_header; - for (int i = 0; i < left.length/2; i++) { - shape[index++] = x+left[2*i]; - shape[index++] = y+height+left[2*i+1]; - if (borderLeft == 0) shape[index-1] += 1; - } - for (int i = 0; i < right.length/2; i++) { - shape[index++] = x+width+right[2*i]; - shape[index++] = y+height+right[2*i+1]; - if (borderLeft == 0) shape[index-1] += 1; - } - shape[index++] = x+width; - shape[index++] = y-highlight_header; - } else { - int[] left, right; - if ((getStyle() & SWT.BORDER) != 0) { - left = simple ? SIMPLE_TOP_LEFT_CORNER : TOP_LEFT_CORNER; - right = simple ? SIMPLE_TOP_RIGHT_CORNER : TOP_RIGHT_CORNER; - } else { - left = simple ? SIMPLE_TOP_LEFT_CORNER_BORDERLESS : TOP_LEFT_CORNER_BORDERLESS; - right = simple ? SIMPLE_TOP_RIGHT_CORNER_BORDERLESS : TOP_RIGHT_CORNER_BORDERLESS; - } - shape = new int[left.length + right.length + 4]; - int index = 0; - shape[index++] = x; - shape[index++] = y+height+highlight_header + 1; - for (int i = 0; i < left.length/2; i++) { - shape[index++] = x+left[2*i]; - shape[index++] = y+left[2*i+1]; - } - for (int i = 0; i < right.length/2; i++) { - shape[index++] = x+width+right[2*i]; - shape[index++] = y+right[2*i+1]; - } - shape[index++] = x+width; - shape[index++] = y+height+highlight_header + 1; - } - // Fill in background - boolean bkSelected = single && selectedIndex != -1; - drawBackground(gc, shape, bkSelected); - // Fill in parent background for non-rectangular shape - Region r = new Region(); - r.add(new Rectangle(x, y, width + 1, height + 1)); - r.subtract(shape); - gc.setBackground(getParent().getBackground()); - fillRegion(gc, r); - r.dispose(); - - // Draw the unselected tabs. - if (!single) { - for (int i=0; i < items.length; i++) { - if (i != selectedIndex && event.getBounds().intersects(items[i].getBounds())) { - items[i].onPaint(gc, false); - } - } - } - - // Draw selected tab - if (selectedIndex != -1) { - CTabItem item = items[selectedIndex]; - item.onPaint(gc, true); - } else { - // if no selected tab - draw line across bottom of all tabs - int x1 = borderLeft; - int y1 = (onBottom) ? size.y - borderBottom - tabHeight - 1 : borderTop + tabHeight; - int x2 = size.x - borderRight; - gc.setForeground(borderColor); - gc.drawLine(x1, y1, x2, y1); - } - - // Draw Buttons - drawChevron(gc); - drawMinimize(gc); - drawMaximize(gc); - - // Draw border line - if (borderLeft > 0) { - RGB outside = getParent().getBackground().getRGB(); - antialias(shape, borderColor.getRGB(), null, outside, gc); - gc.setForeground(borderColor); - gc.drawPolyline(shape); - } -} -/** - * Returns true if the receiver's border is visible. - * - * @return the receiver's border visibility state - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public boolean getBorderVisible() { - checkWidget(); - return borderLeft == 1; -} -public Rectangle getClientArea() { - checkWidget(); - if (minimized) return new Rectangle(xClient, yClient, 0, 0); - Point size = getSize(); - int width = size.x - borderLeft - borderRight - 2*marginWidth - 2*highlight_margin; - int height = size.y - borderTop - borderBottom - 2*marginHeight - highlight_margin - highlight_header; - height -= tabHeight; - return new Rectangle(xClient, yClient, width, height); -} -Color getFillColor() { - if (fillColor == null) { - fillColor = new Color(getDisplay(), CTabFolder.CLOSE_FILL); - } - return fillColor; -} -/** - * Return the tab that is located at the specified index. - * - * @param index the index of the tab item - * @return the item at the specified index - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE - if the index is out of range
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public CTabItem getItem (int index) { - //checkWidget(); - if (index < 0 || index >= items.length) - SWT.error(SWT.ERROR_INVALID_RANGE); - return items [index]; -} -/** - * Gets the item at a point in the widget. - * - * @param pt the point in coordinates relative to the CTabFolder - * @return the item at a point or null - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public CTabItem getItem (Point pt) { - //checkWidget(); - if (items.length == 0) return null; - Point size = getSize(); - if (size.x <= borderLeft + borderRight) return null; - if (showChevron && chevronRect.contains(pt)) return null; - for (int i = 0; i < priority.length; i++) { - CTabItem item = items[priority[i]]; - Rectangle rect = item.getBounds(); - if (rect.contains(pt)) return item; - } - return null; -} -/** - * Return the number of tabs in the folder. - * - * @return the number of tabs in the folder - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public int getItemCount(){ - //checkWidget(); - return items.length; -} -/** - * Return the tab items. - * - * @return the tab items - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public CTabItem [] getItems() { - //checkWidget(); - CTabItem[] tabItems = new CTabItem [items.length]; - System.arraycopy(items, 0, tabItems, 0, items.length); - return tabItems; -} -/* - * Return the lowercase of the first non-'&' character following - * an '&' character in the given string. If there are no '&' - * characters in the given string, return '\0'. - */ -char _findMnemonic (String string) { - if (string == null) return '\0'; - int index = 0; - int length = string.length (); - do { - while (index < length && string.charAt (index) != '&') index++; - if (++index >= length) return '\0'; - if (string.charAt (index) != '&') return Character.toLowerCase (string.charAt (index)); - index++; - } while (index < length); - return '\0'; -} -String stripMnemonic (String string) { - int index = 0; - int length = string.length (); - do { - while ((index < length) && (string.charAt (index) != '&')) index++; - if (++index >= length) return string; - if (string.charAt (index) != '&') { - return string.substring(0, index-1) + string.substring(index, length); - } - index++; - } while (index < length); - return string; -} -/** - * Returns true if the receiver is minimized. - * - * @return the receiver's minimized state - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public boolean getMinimized() { - checkWidget(); - return minimized; -} -/** - * Returns true if the minimize button - * is visible. - * - * @return the visibility of the minimized button - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public boolean getMinimizeVisible() { - checkWidget(); - return showMin; -} -/** - * Returns the number of characters that will - * appear in a fully compressed tab. - * - * @return number of characters that will appear in a fully compressed tab - * - * @since 3.0 - */ -public int getMinimumCharacters() { - checkWidget(); - return minChars; -} -/** - * Returns true if the receiver is maximized. - *

    - * - * @return the receiver's maximized state - * - * @exception SWTException

      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public boolean getMaximized() { - checkWidget(); - return maximized; -} -/** - * Returns true if the maximize button - * is visible. - * - * @return the visibility of the maximized button - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public boolean getMaximizeVisible() { - checkWidget(); - return showMax; -} -/** - * Returns true if the receiver displays most - * recently used tabs and false otherwise. - *

    - * When there is not enough horizontal space to show all the tabs, - * by default, tabs are shown sequentially from left to right in - * order of their index. When the MRU visibility is turned on, - * the tabs that are visible will be the tabs most recently selected. - * Tabs will still maintain their left to right order based on index - * but only the most recently selected tabs are visible. - *

    - * For example, consider a CTabFolder that contains "Tab 1", "Tab 2", - * "Tab 3" and "Tab 4" (in order by index). The user selects - * "Tab 1" and then "Tab 3". If the CTabFolder is now - * compressed so that only two tabs are visible, by default, - * "Tab 2" and "Tab 3" will be shown ("Tab 3" since it is currently - * selected and "Tab 2" because it is the previous item in index order). - * If MRU visibility is enabled, the two visible tabs will be "Tab 1" - * and "Tab 3" (in that order from left to right).

    - * - * @return the receiver's header's visibility state - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.1 - */ -public boolean getMRUVisible() { - checkWidget(); - return mru; -} -int getRightItemEdge (){ - int x = getSize().x - borderRight - 3; - if (showMin) x -= BUTTON_SIZE; - if (showMax) x -= BUTTON_SIZE; - if (showChevron) x -= 3*BUTTON_SIZE/2; - if (topRight != null && topRightAlignment != SWT.FILL) { - Point rightSize = topRight.computeSize(SWT.DEFAULT, SWT.DEFAULT); - x -= rightSize.x + 3; - } - return Math.max(0, x); -} -/** - * Return the selected tab item, or null if there is no selection. - * - * @return the selected tab item, or null if none has been selected - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public CTabItem getSelection() { - //checkWidget(); - if (selectedIndex == -1) return null; - return items[selectedIndex]; -} -/** - * Returns the receiver's selection background color. - * - * @return the selection background color of the receiver - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public Color getSelectionBackground() { - checkWidget(); - return selectionBackground; -} -/** - * Returns the receiver's selection foreground color. - * - * @return the selection foreground color of the receiver - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public Color getSelectionForeground() { - checkWidget(); - return selectionForeground; -} -/** - * Return the index of the selected tab item, or -1 if there - * is no selection. - * - * @return the index of the selected tab item or -1 - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public int getSelectionIndex() { - //checkWidget(); - return selectedIndex; -} -/** - * Returns true if the CTabFolder is rendered - * with a simple, traditional shape. - * - * @return true if the CTabFolder is rendered with a simple shape - * - * @since 3.0 - */ -public boolean getSimple() { - checkWidget(); - return simple; -} -/** - * Returns true if the CTabFolder only displays the selected tab - * and false if the CTabFolder displays multiple tabs. - * - * @return true if the CTabFolder only displays the selected tab and false if the CTabFolder displays multiple tabs - * - * @since 3.0 - */ -public boolean getSingle() { - checkWidget(); - return single; -} - -public int getStyle() { - int style = super.getStyle(); - style &= ~(SWT.TOP | SWT.BOTTOM); - style |= onBottom ? SWT.BOTTOM : SWT.TOP; - style &= ~(SWT.SINGLE | SWT.MULTI); - style |= single ? SWT.SINGLE : SWT.MULTI; - if (borderLeft != 0) style |= SWT.BORDER; - style &= ~SWT.CLOSE; - if (showClose) style |= SWT.CLOSE; - return style; -} -/** - * Returns the height of the tab - * - * @return the height of the tab - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public int getTabHeight(){ - checkWidget(); - if (fixedTabHeight != SWT.DEFAULT) return fixedTabHeight; - return tabHeight - 1; // -1 for line drawn across top of tab -} -/** - * Returns the position of the tab. Possible values are SWT.TOP or SWT.BOTTOM. - * - * @return the position of the tab - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public int getTabPosition(){ - checkWidget(); - return onBottom ? SWT.BOTTOM : SWT.TOP; -} -/** - * Returns the control in the top right corner of the tab folder. - * Typically this is a close button or a composite with a menu and close button. - * - * @return the control in the top right corner of the tab folder or null - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - * - * @since 2.1 - */ -public Control getTopRight() { - checkWidget(); - return topRight; -} -/** - * Returns true if the close button appears - * when the user hovers over an unselected tabs. - * - * @return true if the close button appears on unselected tabs - * - * @since 3.0 - */ -public boolean getUnselectedCloseVisible() { - checkWidget(); - return showUnselectedClose; -} -/** - * Returns true if an image appears - * in unselected tabs. - * - * @return true if an image appears in unselected tabs - * - * @since 3.0 - */ -public boolean getUnselectedImageVisible() { - checkWidget(); - return showUnselectedImage; -} -/** - * Return the index of the specified tab or -1 if the tab is not - * in the receiver. - * - * @param item the tab item for which the index is required - * - * @return the index of the specified tab item or -1 - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public int indexOf(CTabItem item) { - checkWidget(); - if (item == null) { - SWT.error(SWT.ERROR_NULL_ARGUMENT); - } - for (int i = 0; i < items.length; i++) { - if (items[i] == item) return i; - } - return -1; -} -void initAccessible() { - final Accessible accessible = getAccessible(); - accessible.addAccessibleListener(new AccessibleAdapter() { - public void getName(AccessibleEvent e) { - String name = null; - int childID = e.childID; - if (childID >= 0 && childID < items.length) { - name = stripMnemonic(items[childID].getText()); - } else if (childID == items.length + CHEVRON_CHILD_ID) { - name = SWT.getMessage("SWT_ShowList"); //$NON-NLS-1$ - } else if (childID == items.length + MINIMIZE_CHILD_ID) { - name = minimized ? SWT.getMessage("SWT_Restore") : SWT.getMessage("SWT_Minimize"); //$NON-NLS-1$ //$NON-NLS-2$ - } else if (childID == items.length + MAXIMIZE_CHILD_ID) { - name = maximized ? SWT.getMessage("SWT_Restore") : SWT.getMessage("SWT_Maximize"); //$NON-NLS-1$ //$NON-NLS-2$ - } - e.result = name; - } - - public void getHelp(AccessibleEvent e) { - String help = null; - int childID = e.childID; - if (childID == ACC.CHILDID_SELF) { - help = getToolTipText(); - } else if (childID >= 0 && childID < items.length) { - help = items[childID].getToolTipText(); - } - e.result = help; - } - - public void getKeyboardShortcut(AccessibleEvent e) { - String shortcut = null; - int childID = e.childID; - if (childID >= 0 && childID < items.length) { - String text = items[childID].getText(); - if (text != null) { - char mnemonic = _findMnemonic(text); - if (mnemonic != '\0') { - shortcut = "Alt+"+mnemonic; //$NON-NLS-1$ - } - } - } - e.result = shortcut; - } - }); - - accessible.addAccessibleControlListener(new AccessibleControlAdapter() { - public void getChildAtPoint(AccessibleControlEvent e) { - Point testPoint = toControl(e.x, e.y); - int childID = ACC.CHILDID_NONE; - for (int i = 0; i < items.length; i++) { - if (items[i].getBounds().contains(testPoint)) { - childID = i; - break; - } - } - if (childID == ACC.CHILDID_NONE) { - if (showChevron && chevronRect.contains(testPoint)) { - childID = items.length + CHEVRON_CHILD_ID; - } else if (showMin && minRect.contains(testPoint)) { - childID = items.length + MINIMIZE_CHILD_ID; - } else if (showMax && maxRect.contains(testPoint)) { - childID = items.length + MAXIMIZE_CHILD_ID; - } else { - Rectangle location = getBounds(); - location.height = location.height - getClientArea().height; - if (location.contains(testPoint)) { - childID = ACC.CHILDID_SELF; - } - } - } - e.childID = childID; - } - - public void getLocation(AccessibleControlEvent e) { - Rectangle location = null; - Point pt = null; - int childID = e.childID; - if (childID == ACC.CHILDID_SELF) { - location = getBounds(); - pt = getParent().toDisplay(location.x, location.y); - } else { - if (childID >= 0 && childID < items.length && items[childID].isShowing()) { - location = items[childID].getBounds(); - } else if (showChevron && childID == items.length + CHEVRON_CHILD_ID) { - location = chevronRect; - } else if (showMin && childID == items.length + MINIMIZE_CHILD_ID) { - location = minRect; - } else if (showMax && childID == items.length + MAXIMIZE_CHILD_ID) { - location = maxRect; - } - if (location != null) { - pt = toDisplay(location.x, location.y); - } - } - if (location != null && pt != null) { - e.x = pt.x; - e.y = pt.y; - e.width = location.width; - e.height = location.height; - } - } - - public void getChildCount(AccessibleControlEvent e) { - e.detail = items.length + EXTRA_CHILD_ID_COUNT; - } - - public void getDefaultAction(AccessibleControlEvent e) { - String action = null; - int childID = e.childID; - if (childID >= 0 && childID < items.length) { - action = SWT.getMessage ("SWT_Switch"); //$NON-NLS-1$ - } - if (childID >= items.length && childID < items.length + EXTRA_CHILD_ID_COUNT) { - action = SWT.getMessage ("SWT_Press"); //$NON-NLS-1$ - } - e.result = action; - } - - public void getFocus(AccessibleControlEvent e) { - int childID = ACC.CHILDID_NONE; - if (isFocusControl()) { - if (selectedIndex == -1) { - childID = ACC.CHILDID_SELF; - } else { - childID = selectedIndex; - } - } - e.childID = childID; - } - - public void getRole(AccessibleControlEvent e) { - int role = 0; - int childID = e.childID; - if (childID == ACC.CHILDID_SELF) { - role = ACC.ROLE_TABFOLDER; - } else if (childID >= 0 && childID < items.length) { - role = ACC.ROLE_TABITEM; - } else if (childID >= items.length && childID < items.length + EXTRA_CHILD_ID_COUNT) { - role = ACC.ROLE_PUSHBUTTON; - } - e.detail = role; - } - - public void getSelection(AccessibleControlEvent e) { - e.childID = (selectedIndex == -1) ? ACC.CHILDID_NONE : selectedIndex; - } - - public void getState(AccessibleControlEvent e) { - int state = 0; - int childID = e.childID; - if (childID == ACC.CHILDID_SELF) { - state = ACC.STATE_NORMAL; - } else if (childID >= 0 && childID < items.length) { - state = ACC.STATE_SELECTABLE; - if (isFocusControl()) { - state |= ACC.STATE_FOCUSABLE; - } - if (selectedIndex == childID) { - state |= ACC.STATE_SELECTED; - if (isFocusControl()) { - state |= ACC.STATE_FOCUSED; - } - } - } else if (childID == items.length + CHEVRON_CHILD_ID) { - state = showChevron ? ACC.STATE_NORMAL : ACC.STATE_INVISIBLE; - } else if (childID == items.length + MINIMIZE_CHILD_ID) { - state = showMin ? ACC.STATE_NORMAL : ACC.STATE_INVISIBLE; - } else if (childID == items.length + MAXIMIZE_CHILD_ID) { - state = showMax ? ACC.STATE_NORMAL : ACC.STATE_INVISIBLE; - } - e.detail = state; - } - - public void getChildren(AccessibleControlEvent e) { - int childIdCount = items.length + EXTRA_CHILD_ID_COUNT; - Object[] children = new Object[childIdCount]; - for (int i = 0; i < childIdCount; i++) { - children[i] = new Integer(i); - } - e.children = children; - } - }); - - addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - if (isFocusControl()) { - if (selectedIndex == -1) { - accessible.setFocus(ACC.CHILDID_SELF); - } else { - accessible.setFocus(selectedIndex); - } - } - } - }); - - addListener(SWT.FocusIn, new Listener() { - public void handleEvent(Event event) { - if (selectedIndex == -1) { - accessible.setFocus(ACC.CHILDID_SELF); - } else { - accessible.setFocus(selectedIndex); - } - } - }); -} -void onKeyDown (Event event) { - switch (event.keyCode) { - case SWT.ARROW_LEFT: - case SWT.ARROW_RIGHT: - int count = items.length; - if (count == 0) return; - if (selectedIndex == -1) return; - int leadKey = (getStyle() & SWT.RIGHT_TO_LEFT) != 0 ? SWT.ARROW_RIGHT : SWT.ARROW_LEFT; - int offset = event.keyCode == leadKey ? -1 : 1; - int index; - if (!mru) { - index = selectedIndex + offset; - } else { - int[] visible = new int[items.length]; - int idx = 0; - int current = -1; - for (int i = 0; i < items.length; i++) { - if (items[i].showing) { - if (i == selectedIndex) current = idx; - visible [idx++] = i; - } - } - if (current + offset >= 0 && current + offset < idx){ - index = visible [current + offset]; - } else { - if (showChevron) { - CTabFolderEvent e = new CTabFolderEvent(this); - e.widget = this; - e.time = event.time; - e.x = chevronRect.x; - e.y = chevronRect.y; - e.width = chevronRect.width; - e.height = chevronRect.height; - e.doit = true; - for (int i = 0; i < folderListeners.length; i++) { - folderListeners[i].showList(e); - } - if (e.doit && !isDisposed()) { - showList(chevronRect); - } - } - return; - } - } - if (index < 0 || index >= count) return; - setSelection (index, true); - forceFocus(); - } -} -void onDispose(Event event) { - removeListener(SWT.Dispose, listener); - notifyListeners(SWT.Dispose, event); - event.type = SWT.None; - /* - * Usually when an item is disposed, destroyItem will change the size of the items array, - * reset the bounds of all the tabs and manage the widget associated with the tab. - * Since the whole folder is being disposed, this is not necessary. For speed - * the inDispose flag is used to skip over this part of the item dispose. - */ - inDispose = true; - - if (showMenu != null && !showMenu.isDisposed()) { - showMenu.dispose(); - showMenu = null; - } - int length = items.length; - for (int i = 0; i < length; i++) { - if (items[i] != null) { - items[i].dispose(); - } - } - if (fillColor != null) { - fillColor.dispose(); - fillColor = null; - } - - selectionGradientColors = null; - selectionGradientPercents = null; - selectionBgImage = null; - - selectionBackground = null; - selectionForeground = null; - disposeSelectionHighlightGradientColors(); -} -void onDragDetect(Event event) { - boolean consume = false; - if (chevronRect.contains(event.x, event.y) || - minRect.contains(event.x, event.y) || - maxRect.contains(event.x, event.y)){ - consume = true; - } else { - for (int i = 0; i < items.length; i++) { - if (items[i].closeRect.contains(event.x, event.y)) { - consume = true; - break; - } - } - } - if (consume) { - event.type = SWT.None; - } -} -void onFocus(Event event) { - checkWidget(); - if (selectedIndex >= 0) { - redraw(); - } else { - setSelection(0, true); - } -} -boolean onMnemonic (Event event, boolean doit) { - char key = event.character; - for (int i = 0; i < items.length; i++) { - if (items[i] != null) { - char mnemonic = _findMnemonic (items[i].getText ()); - if (mnemonic != '\0') { - if (Character.toLowerCase (key) == mnemonic) { - if (doit) setSelection(i, true); - return true; - } - } - } - } - return false; -} -void onMouseDoubleClick(Event event) { - if (event.button != 1 || - (event.stateMask & SWT.BUTTON2) != 0 || - (event.stateMask & SWT.BUTTON3) != 0) return; - Event e = new Event(); - e.item = getItem(new Point(event.x, event.y)); - if (e.item != null) { - notifyListeners(SWT.DefaultSelection, e); - } -} -void onMouse(Event event) { - int x = event.x, y = event.y; - switch (event.type) { - case SWT.MouseEnter: { - setToolTipText(null); - break; - } - case SWT.MouseExit: { - if (minImageState != NORMAL) { - minImageState = NORMAL; - redraw(minRect.x, minRect.y, minRect.width, minRect.height, false); - } - if (maxImageState != NORMAL) { - maxImageState = NORMAL; - redraw(maxRect.x, maxRect.y, maxRect.width, maxRect.height, false); - } - if (chevronImageState != NORMAL) { - chevronImageState = NORMAL; - redraw(chevronRect.x, chevronRect.y, chevronRect.width, chevronRect.height, false); - } - for (int i=0; i= 0 && current + offset < idx){ - index = visible [current + offset]; - } else { - if (showChevron) { - CTabFolderEvent e = new CTabFolderEvent(this); - e.widget = this; - e.time = event.time; - e.x = chevronRect.x; - e.y = chevronRect.y; - e.width = chevronRect.width; - e.height = chevronRect.height; - e.doit = true; - for (int i = 0; i < folderListeners.length; i++) { - folderListeners[i].showList(e); - } - if (e.doit && !isDisposed()) { - showList(chevronRect); - } - } - } - } - } - setSelection (index, true); -} -void onPaint(Event event) { - if (inDispose) return; - Font font = getFont(); - if (oldFont == null || !oldFont.equals(font)) { - // handle case where default font changes - oldFont = font; - if (!updateTabHeight(false)) { - updateItems(); - redraw(); - return; - } - } - - GC gc = event.gc; - Font gcFont = gc.getFont(); - Color gcBackground = gc.getBackground(); - Color gcForeground = gc.getForeground(); - -// Useful for debugging paint problems -//{ -//Point size = getSize(); -//gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_GREEN)); -//gc.fillRectangle(-10, -10, size.x + 20, size.y+20); -//} - - drawBody(event); - - gc.setFont(gcFont); - gc.setForeground(gcForeground); - gc.setBackground(gcBackground); - - drawTabArea(event); - - gc.setFont(gcFont); - gc.setForeground(gcForeground); - gc.setBackground(gcBackground); -} - -void onResize() { - if (updateItems()) redrawTabs(); - - Point size = getSize(); - if (oldSize == null) { - redraw(); - } else { - if (onBottom && size.y != oldSize.y) { - redraw(); - } else { - int x1 = Math.min(size.x, oldSize.x); - if (size.x != oldSize.x) x1 -= borderRight + highlight_margin + 2; - if (!simple) x1 -= 5; // rounded top right corner - int y1 = Math.min(size.y, oldSize.y); - if (size.y != oldSize.y) y1 -= borderBottom + highlight_margin; - int x2 = Math.max(size.x, oldSize.x); - int y2 = Math.max(size.y, oldSize.y); - redraw(0, y1, x2, y2 - y1, false); - redraw(x1, 0, x2 - x1, y2, false); - } - } - oldSize = size; -} -void onTraverse (Event event) { - if (ignoreTraverse) return; - switch (event.detail) { - case SWT.TRAVERSE_ESCAPE: - case SWT.TRAVERSE_RETURN: - case SWT.TRAVERSE_TAB_NEXT: - case SWT.TRAVERSE_TAB_PREVIOUS: - Control focusControl = getDisplay().getFocusControl(); - if (focusControl == this) event.doit = true; - break; - case SWT.TRAVERSE_MNEMONIC: - event.doit = onMnemonic(event, false); - break; - case SWT.TRAVERSE_PAGE_NEXT: - case SWT.TRAVERSE_PAGE_PREVIOUS: - event.doit = items.length > 0; - break; - } - ignoreTraverse = true; - notifyListeners(SWT.Traverse, event); - ignoreTraverse = false; - event.type = SWT.None; - if (isDisposed()) return; - if (!event.doit) return; - switch (event.detail) { - case SWT.TRAVERSE_MNEMONIC: - onMnemonic(event, true); - event.detail = SWT.TRAVERSE_NONE; - break; - case SWT.TRAVERSE_PAGE_NEXT: - case SWT.TRAVERSE_PAGE_PREVIOUS: - onPageTraversal(event); - event.detail = SWT.TRAVERSE_NONE; - break; - } -} -void redrawTabs() { - Point size = getSize(); - if (onBottom) { - redraw(0, size.y - borderBottom - tabHeight - highlight_header - 1, size.x, borderBottom + tabHeight + highlight_header + 1, false); - } else { - redraw(0, 0, size.x, borderTop + tabHeight + highlight_header + 1, false); - } -} -/** - * Removes the listener. - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - * - * @see #addCTabFolder2Listener(CTabFolder2Listener) - * - * @since 3.0 - */ -public void removeCTabFolder2Listener(CTabFolder2Listener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - if (folderListeners.length == 0) return; - int index = -1; - for (int i = 0; i < folderListeners.length; i++) { - if (listener == folderListeners[i]){ - index = i; - break; - } - } - if (index == -1) return; - if (folderListeners.length == 1) { - folderListeners = new CTabFolder2Listener[0]; - return; - } - CTabFolder2Listener[] newTabListeners = new CTabFolder2Listener[folderListeners.length - 1]; - System.arraycopy(folderListeners, 0, newTabListeners, 0, index); - System.arraycopy(folderListeners, index + 1, newTabListeners, index, folderListeners.length - index - 1); - folderListeners = newTabListeners; -} -/** - * Removes the listener. - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - * - * @deprecated see removeCTabFolderCloseListener(CTabFolderListener) - */ -public void removeCTabFolderListener(CTabFolderListener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - if (tabListeners.length == 0) return; - int index = -1; - for (int i = 0; i < tabListeners.length; i++) { - if (listener == tabListeners[i]){ - index = i; - break; - } - } - if (index == -1) return; - if (tabListeners.length == 1) { - tabListeners = new CTabFolderListener[0]; - return; - } - CTabFolderListener[] newTabListeners = new CTabFolderListener[tabListeners.length - 1]; - System.arraycopy(tabListeners, 0, newTabListeners, 0, index); - System.arraycopy(tabListeners, index + 1, newTabListeners, index, tabListeners.length - index - 1); - tabListeners = newTabListeners; -} -/** - * Removes the listener from the collection of listeners who will - * be notified when the user changes the receiver's selection. - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see SelectionListener - * @see #addSelectionListener - */ -public void removeSelectionListener(SelectionListener listener) { - checkWidget(); - if (listener == null) { - SWT.error(SWT.ERROR_NULL_ARGUMENT); - } - removeListener(SWT.Selection, listener); - removeListener(SWT.DefaultSelection, listener); -} -public void setBackground (Color color) { - super.setBackground(color); - redraw(); -} -/** - * Specify a gradient of colours to be drawn in the background of the unselected tabs. - * For example to draw a gradient that varies from dark blue to blue and then to - * white, use the following call to setBackground: - *
    - *	cfolder.setBackground(new Color[]{display.getSystemColor(SWT.COLOR_DARK_BLUE), 
    - *		                           display.getSystemColor(SWT.COLOR_BLUE),
    - *		                           display.getSystemColor(SWT.COLOR_WHITE), 
    - *		                           display.getSystemColor(SWT.COLOR_WHITE)},
    - *		               new int[] {25, 50, 100});
    - * 
    - * - * @param colors an array of Color that specifies the colors to appear in the gradient - * in order of appearance left to right. The value null clears the - * background gradient. The value null can be used inside the array of - * Color to specify the background color. - * @param percents an array of integers between 0 and 100 specifying the percent of the width - * of the widget at which the color should change. The size of the percents array must be one - * less than the size of the colors array. - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - * - * @since 3.0 - */ -void setBackground(Color[] colors, int[] percents) { - setBackground(colors, percents, false); -} -/** - * Specify a gradient of colours to be drawn in the background of the unselected tab. - * For example to draw a vertical gradient that varies from dark blue to blue and then to - * white, use the following call to setBackground: - *
    - *	cfolder.setBackground(new Color[]{display.getSystemColor(SWT.COLOR_DARK_BLUE), 
    - *		                           display.getSystemColor(SWT.COLOR_BLUE),
    - *		                           display.getSystemColor(SWT.COLOR_WHITE), 
    - *		                           display.getSystemColor(SWT.COLOR_WHITE)},
    - *		                  new int[] {25, 50, 100}, true);
    - * 
    - * - * @param colors an array of Color that specifies the colors to appear in the gradient - * in order of appearance left to right. The value null clears the - * background gradient. The value null can be used inside the array of - * Color to specify the background color. - * @param percents an array of integers between 0 and 100 specifying the percent of the width - * of the widget at which the color should change. The size of the percents array must be one - * less than the size of the colors array. - * - * @param vertical indicate the direction of the gradient. True is vertical and false is horizontal. - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - * - * @since 3.0 - */ -void setBackground(Color[] colors, int[] percents, boolean vertical) { - checkWidget(); - if (colors != null) { - if (percents == null || percents.length != colors.length - 1) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - for (int i = 0; i < percents.length; i++) { - if (percents[i] < 0 || percents[i] > 100) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (i > 0 && percents[i] < percents[i-1]) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - } - if (getDisplay().getDepth() < 15) { - // Don't use gradients on low color displays - colors = new Color[] {colors[colors.length - 1]}; - percents = new int[] {}; - } - } - - // Are these settings the same as before? - if ((gradientColors != null) && (colors != null) && - (gradientColors.length == colors.length)) { - boolean same = false; - for (int i = 0; i < gradientColors.length; i++) { - if (gradientColors[i] == null) { - same = colors[i] == null; - } else { - same = gradientColors[i].equals(colors[i]); - } - if (!same) break; - } - if (same) { - for (int i = 0; i < gradientPercents.length; i++) { - same = gradientPercents[i] == percents[i]; - if (!same) break; - } - } - if (same && this.gradientVertical == vertical) return; - } - // Store the new settings - if (colors == null) { - gradientColors = null; - gradientPercents = null; - gradientVertical = false; - setBackground((Color)null); - } else { - gradientColors = new Color[colors.length]; - for (int i = 0; i < colors.length; ++i) { - gradientColors[i] = colors[i]; - } - gradientPercents = new int[percents.length]; - for (int i = 0; i < percents.length; ++i) { - gradientPercents[i] = percents[i]; - } - gradientVertical = vertical; - setBackground(gradientColors[gradientColors.length-1]); - } - - // Refresh with the new settings - redraw(); -} -/** - * Toggle the visibility of the border - * - * @param show true if the border should be displayed - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setBorderVisible(boolean show) { - checkWidget(); - if ((borderLeft == 1) == show) return; - borderLeft = borderRight = show ? 1 : 0; - borderTop = onBottom ? borderLeft : 0; - borderBottom = onBottom ? 0 : borderLeft; - Rectangle rectBefore = getClientArea(); - updateItems(); - Rectangle rectAfter = getClientArea(); - if (!rectBefore.equals(rectAfter)) { - notifyListeners(SWT.Resize, new Event()); - } - redraw(); -} -void setButtonBounds() { - Point size = getSize(); - int oldX, oldY, oldWidth, oldHeight; - // max button - oldX = maxRect.x; - oldY = maxRect.y; - oldWidth = maxRect.width; - oldHeight = maxRect.height; - maxRect.x = maxRect.y = maxRect.width = maxRect.height = 0; - if (showMax) { - maxRect.x = size.x - borderRight - BUTTON_SIZE - 3; - if (borderRight > 0) maxRect.x += 1; - maxRect.y = onBottom ? size.y - borderBottom - tabHeight + (tabHeight - BUTTON_SIZE)/2: borderTop + (tabHeight - BUTTON_SIZE)/2; - maxRect.width = BUTTON_SIZE; - maxRect.height = BUTTON_SIZE; - } - if (oldX != maxRect.x || oldWidth != maxRect.width || - oldY != maxRect.y || oldHeight != maxRect.height) { - int left = Math.min(oldX, maxRect.x); - int right = Math.max(oldX + oldWidth, maxRect.x + maxRect.width); - int top = onBottom ? size.y - borderBottom - tabHeight: borderTop + 1; - redraw(left, top, right - left, tabHeight, false); - } - - // min button - oldX = minRect.x; - oldY = minRect.y; - oldWidth = minRect.width; - oldHeight = minRect.height; - minRect.x = minRect.y = minRect.width = minRect.height = 0; - if (showMin) { - minRect.x = size.x - borderRight - maxRect.width - BUTTON_SIZE - 3; - if (borderRight > 0) minRect.x += 1; - minRect.y = onBottom ? size.y - borderBottom - tabHeight + (tabHeight - BUTTON_SIZE)/2: borderTop + (tabHeight - BUTTON_SIZE)/2; - minRect.width = BUTTON_SIZE; - minRect.height = BUTTON_SIZE; - } - if (oldX != minRect.x || oldWidth != minRect.width || - oldY != minRect.y || oldHeight != minRect.height) { - int left = Math.min(oldX, minRect.x); - int right = Math.max(oldX + oldWidth, minRect.x + minRect.width); - int top = onBottom ? size.y - borderBottom - tabHeight: borderTop + 1; - redraw(left, top, right - left, tabHeight, false); - } - - // top right control - oldX = topRightRect.x; - oldY = topRightRect.y; - oldWidth = topRightRect.width; - oldHeight = topRightRect.height; - topRightRect.x = topRightRect.y = topRightRect.width = topRightRect.height = 0; - if (topRight != null) { - switch (topRightAlignment) { - case SWT.FILL: { - int rightEdge = size.x - borderRight - 3 - maxRect.width - minRect.width; - if (!simple && borderRight > 0 && !showMax && !showMin) rightEdge -= 2; - if (single) { - if (items.length == 0 || selectedIndex == -1) { - topRightRect.x = borderLeft + 3; - topRightRect.width = rightEdge - topRightRect.x; - } else { - // fill size is 0 if item compressed - CTabItem item = items[selectedIndex]; - if (item.x + item.width + 7 + 3*BUTTON_SIZE/2 >= rightEdge) break; - topRightRect.x = item.x + item.width + 7 + 3*BUTTON_SIZE/2; - topRightRect.width = rightEdge - topRightRect.x; - } - } else { - // fill size is 0 if chevron showing - if (showChevron) break; - if (items.length == 0) { - topRightRect.x = borderLeft + 3; - } else { - CTabItem item = items[items.length - 1]; - topRightRect.x = item.x + item.width; - if (!simple && items.length - 1 == selectedIndex) topRightRect.x += curveWidth - curveIndent; - } - topRightRect.width = Math.max(0, rightEdge - topRightRect.x); - } - topRightRect.y = onBottom ? size.y - borderBottom - tabHeight: borderTop + 1; - topRightRect.height = tabHeight - 1; - break; - } - case SWT.RIGHT: { - Point topRightSize = topRight.computeSize(SWT.DEFAULT, tabHeight, false); - int rightEdge = size.x - borderRight - 3 - maxRect.width - minRect.width; - if (!simple && borderRight > 0 && !showMax && !showMin) rightEdge -= 2; - topRightRect.x = rightEdge - topRightSize.x; - topRightRect.width = topRightSize.x; - topRightRect.y = onBottom ? size.y - borderBottom - tabHeight: borderTop + 1; - topRightRect.height = tabHeight - 1; - } - } - topRight.setBounds(topRightRect); - } - if (oldX != topRightRect.x || oldWidth != topRightRect.width || - oldY != topRightRect.y || oldHeight != topRightRect.height) { - int left = Math.min(oldX, topRightRect.x); - int right = Math.max(oldX + oldWidth, topRightRect.x + topRightRect.width); - int top = onBottom ? size.y - borderBottom - tabHeight : borderTop + 1; - redraw(left, top, right - left, tabHeight, false); - } - - // chevron button - oldX = chevronRect.x; - oldY = chevronRect.y; - oldWidth = chevronRect.width; - oldHeight = chevronRect.height; - chevronRect.x = chevronRect.y = chevronRect.height = chevronRect.width = 0; - if (single) { - if (selectedIndex == -1 || items.length > 1) { - chevronRect.width = 3*BUTTON_SIZE/2; - chevronRect.height = BUTTON_SIZE; - chevronRect.y = onBottom ? size.y - borderBottom - tabHeight + (tabHeight - chevronRect.height)/2 : borderTop + (tabHeight - chevronRect.height)/2; - if (selectedIndex == -1) { - chevronRect.x = size.x - borderRight - 3 - minRect.width - maxRect.width - topRightRect.width - chevronRect.width; - } else { - CTabItem item = items[selectedIndex]; - int w = size.x - borderRight - 3 - minRect.width - maxRect.width - chevronRect.width; - if (topRightRect.width > 0) w -= topRightRect.width + 3; - chevronRect.x = Math.min(item.x + item.width + 3, w); - } - if (borderRight > 0) chevronRect.x += 1; - } - } else { - if (showChevron) { - chevronRect.width = 3*BUTTON_SIZE/2; - chevronRect.height = BUTTON_SIZE; - int i = 0, lastIndex = -1; - while (i < priority.length && items[priority[i]].showing) { - lastIndex = Math.max(lastIndex, priority[i++]); - } - if (lastIndex == -1) lastIndex = firstIndex; - CTabItem lastItem = items[lastIndex]; - int w = lastItem.x + lastItem.width + 3; - if (!simple && lastIndex == selectedIndex) w += curveWidth - 2*curveIndent; - chevronRect.x = Math.min(w, getRightItemEdge()); - chevronRect.y = onBottom ? size.y - borderBottom - tabHeight + (tabHeight - chevronRect.height)/2 : borderTop + (tabHeight - chevronRect.height)/2; - } - } - if (oldX != chevronRect.x || oldWidth != chevronRect.width || - oldY != chevronRect.y || oldHeight != chevronRect.height) { - int left = Math.min(oldX, chevronRect.x); - int right = Math.max(oldX + oldWidth, chevronRect.x + chevronRect.width); - int top = onBottom ? size.y - borderBottom - tabHeight: borderTop + 1; - redraw(left, top, right - left, tabHeight, false); - } -} -public void setFont(Font font) { - checkWidget(); - if (font != null && font.equals(getFont())) return; - super.setFont(font); - oldFont = getFont(); - if (!updateTabHeight(false)) { - updateItems(); - redraw(); - } -} -public void setForeground (Color color) { - super.setForeground(color); - redraw(); -} -/** - * Display an insert marker before or after the specified tab item. - * - * A value of null will clear the mark. - * - * @param item the item with which the mark is associated or null - * - * @param after true if the mark should be displayed after the specified item - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setInsertMark(CTabItem item, boolean after) { - checkWidget(); -} -/** - * Display an insert marker before or after the specified tab item. - * - * A value of -1 will clear the mark. - * - * @param index the index of the item with which the mark is associated or null - * - * @param after true if the mark should be displayed after the specified item - * - * @exception IllegalArgumentException
      - *
    - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setInsertMark(int index, boolean after) { - checkWidget(); - if (index < -1 || index >= getItemCount()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } -} -boolean setItemLocation() { - boolean changed = false; - if (items.length == 0) return false; - Point size = getSize(); - int y = onBottom ? Math.max(borderBottom, size.y - borderBottom - tabHeight) : borderTop; - if (single) { - int defaultX = getDisplay().getBounds().width + 10; // off screen - for (int i = 0; i < items.length; i++) { - CTabItem item = items[i]; - if (i == selectedIndex) { - firstIndex = selectedIndex; - int oldX = item.x, oldY = item.y; - item.x = borderLeft; - item.y = y; - item.showing = true; - if (showClose || item.showClose) { - item.closeRect.x = borderLeft + CTabItem.LEFT_MARGIN; - item.closeRect.y = onBottom ? size.y - borderBottom - tabHeight + (tabHeight - BUTTON_SIZE)/2: borderTop + (tabHeight - BUTTON_SIZE)/2; - } - if (item.x != oldX || item.y != oldY) changed = true; - } else { - item.x = defaultX; - item.showing = false; - } - } - } else { - int rightItemEdge = getRightItemEdge(); - int maxWidth = rightItemEdge - borderLeft; - int width = 0; - for (int i = 0; i < priority.length; i++) { - CTabItem item = items[priority[i]]; - width += item.width; - item.showing = i == 0 ? true : item.width > 0 && width <= maxWidth; - if (!simple && priority[i] == selectedIndex) width += curveWidth - 2*curveIndent; - } - int x = 0; - int defaultX = getDisplay().getBounds().width + 10; // off screen - firstIndex = items.length - 1; - for (int i = 0; i < items.length; i++) { - CTabItem item = items[i]; - if (!item.showing) { - if (item.x != defaultX) changed = true; - item.x = defaultX; - } else { - firstIndex = Math.min(firstIndex, i); - if (item.x != x || item.y != y) changed = true; - item.x = x; - item.y = y; - if (i == selectedIndex) { - int edge = Math.min(item.x + item.width, rightItemEdge); - item.closeRect.x = edge - CTabItem.RIGHT_MARGIN - BUTTON_SIZE; - } else { - item.closeRect.x = item.x + item.width - CTabItem.RIGHT_MARGIN - BUTTON_SIZE; - } - item.closeRect.y = onBottom ? size.y - borderBottom - tabHeight + (tabHeight - BUTTON_SIZE)/2: borderTop + (tabHeight - BUTTON_SIZE)/2; - x = x + item.width; - if (!simple && i == selectedIndex) x += curveWidth - 2*curveIndent; - } - } - } - return changed; -} -boolean setItemSize() { - boolean changed = false; - if (isDisposed()) return changed; - Point size = getSize(); - if (size.x <= 0 || size.y <= 0) return changed; - xClient = borderLeft + marginWidth + highlight_margin; - if (onBottom) { - yClient = borderTop + highlight_margin + marginHeight; - } else { - yClient = borderTop + tabHeight + highlight_header + marginHeight; - } - showChevron = false; - if (single) { - showChevron = true; - if (selectedIndex != -1) { - CTabItem tab = items[selectedIndex]; - GC gc = new GC(this); - int width = tab.preferredWidth(gc, true, false); - gc.dispose(); - width = Math.min(width, getRightItemEdge() - borderLeft); - if (tab.height != tabHeight || tab.width != width) { - changed = true; - tab.shortenedText = null; - tab.shortenedTextWidth = 0; - tab.height = tabHeight; - tab.width = width; - tab.closeRect.width = tab.closeRect.height = 0; - if (showClose || tab.showClose) { - tab.closeRect.width = BUTTON_SIZE; - tab.closeRect.height = BUTTON_SIZE; - } - } - } - return changed; - } - - if (items.length == 0) return changed; - - int[] widths; - GC gc = new GC(this); - int tabAreaWidth = size.x - borderLeft - borderRight - 3; - if (showMin) tabAreaWidth -= BUTTON_SIZE; - if (showMax) tabAreaWidth -= BUTTON_SIZE; - if (topRightAlignment == SWT.RIGHT && topRight != null) { - Point rightSize = topRight.computeSize(SWT.DEFAULT, SWT.DEFAULT, false); - tabAreaWidth -= rightSize.x + 3; - } - if (!simple) tabAreaWidth -= curveWidth - 2*curveIndent; - tabAreaWidth = Math.max(0, tabAreaWidth); - - // First, try the minimum tab size at full compression. - int minWidth = 0; - int[] minWidths = new int[items.length]; - for (int i = 0; i < priority.length; i++) { - int index = priority[i]; - minWidths[index] = items[index].preferredWidth(gc, index == selectedIndex, true); - minWidth += minWidths[index]; - if (minWidth > tabAreaWidth) break; - } - if (minWidth > tabAreaWidth) { - // full compression required and a chevron - showChevron = items.length > 1; - if (showChevron) tabAreaWidth -= 3*BUTTON_SIZE/2; - widths = minWidths; - int index = selectedIndex != -1 ? selectedIndex : 0; - if (tabAreaWidth < widths[index]) { - widths[index] = Math.max(0, tabAreaWidth); - } - } else { - int maxWidth = 0; - int[] maxWidths = new int[items.length]; - for (int i = 0; i < items.length; i++) { - maxWidths[i] = items[i].preferredWidth(gc, i == selectedIndex, false); - maxWidth += maxWidths[i]; - } - if (maxWidth <= tabAreaWidth) { - // no compression required - widths = maxWidths; - } else { - // determine compression for each item - int extra = (tabAreaWidth - minWidth) / items.length; - while (true) { - int large = 0, totalWidth = 0; - for (int i = 0 ; i < items.length; i++) { - if (maxWidths[i] > minWidths[i] + extra) { - totalWidth += minWidths[i] + extra; - large++; - } else { - totalWidth += maxWidths[i]; - } - } - if (totalWidth >= tabAreaWidth) { - extra--; - break; - } - if (large == 0 || tabAreaWidth - totalWidth < large) break; - extra++; - } - widths = new int[items.length]; - for (int i = 0; i < items.length; i++) { - widths[i] = Math.min(maxWidths[i], minWidths[i] + extra); - } - } - } - gc.dispose(); - - for (int i = 0; i < items.length; i++) { - CTabItem tab = items[i]; - int width = widths[i]; - if (tab.height != tabHeight || tab.width != width) { - changed = true; - tab.shortenedText = null; - tab.shortenedTextWidth = 0; - tab.height = tabHeight; - tab.width = width; - tab.closeRect.width = tab.closeRect.height = 0; - if (showClose || tab.showClose) { - if (i == selectedIndex || showUnselectedClose) { - tab.closeRect.width = BUTTON_SIZE; - tab.closeRect.height = BUTTON_SIZE; - } - } - } - } - return changed; -} -/** - * Marks the receiver's maximize button as visible if the argument is true, - * and marks it invisible otherwise. - * - * @param visible the new visibility state - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public void setMaximizeVisible(boolean visible) { - checkWidget(); - if (showMax == visible) return; - // display maximize button - showMax = visible; - updateItems(); - redraw(); -} -/** - * Sets the layout which is associated with the receiver to be - * the argument which may be null. - *

    - * Note: No Layout can be set on this Control because it already - * manages the size and position of its children. - *

    - * - * @param layout the receiver's new layout or null - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setLayout (Layout layout) { - checkWidget(); - return; -} -/** - * Sets the maximized state of the receiver. - * - * @param maximize the new maximized state - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public void setMaximized(boolean maximize) { - checkWidget (); - if (this.maximized == maximize) return; - if (maximize && this.minimized) setMinimized(false); - this.maximized = maximize; - redraw(maxRect.x, maxRect.y, maxRect.width, maxRect.height, false); -} -/** - * Marks the receiver's minimize button as visible if the argument is true, - * and marks it invisible otherwise. - * - * @param visible the new visibility state - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public void setMinimizeVisible(boolean visible) { - checkWidget(); - if (showMin == visible) return; - // display minimize button - showMin = visible; - updateItems(); - redraw(); -} -/** - * Sets the minimized state of the receiver. - * - * @param minimize the new minimized state - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public void setMinimized(boolean minimize) { - checkWidget (); - if (this.minimized == minimize) return; - if (minimize && this.maximized) setMaximized(false); - this.minimized = minimize; - redraw(minRect.x, minRect.y, minRect.width, minRect.height, false); -} - -/** - * Sets the minimum number of characters that will - * be displayed in a fully compressed tab. - * - * @param count the minimum number of characters that will be displayed in a fully compressed tab - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_INVALID_RANGE - if the count is less than zero
    • - *
    - * - * @since 3.0 - */ -public void setMinimumCharacters(int count) { - checkWidget (); - if (count < 0) SWT.error(SWT.ERROR_INVALID_RANGE); - if (minChars == count) return; - minChars = count; - if (updateItems()) redrawTabs(); -} - -/** - * When there is not enough horizontal space to show all the tabs, - * by default, tabs are shown sequentially from left to right in - * order of their index. When the MRU visibility is turned on, - * the tabs that are visible will be the tabs most recently selected. - * Tabs will still maintain their left to right order based on index - * but only the most recently selected tabs are visible. - *

    - * For example, consider a CTabFolder that contains "Tab 1", "Tab 2", - * "Tab 3" and "Tab 4" (in order by index). The user selects - * "Tab 1" and then "Tab 3". If the CTabFolder is now - * compressed so that only two tabs are visible, by default, - * "Tab 2" and "Tab 3" will be shown ("Tab 3" since it is currently - * selected and "Tab 2" because it is the previous item in index order). - * If MRU visibility is enabled, the two visible tabs will be "Tab 1" - * and "Tab 3" (in that order from left to right).

    - * - * @param show the new visibility state - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.1 - */ -public void setMRUVisible(boolean show) { - checkWidget(); - if (mru == show) return; - mru = show; - if (!mru) { - int idx = firstIndex; - int next = 0; - for (int i = firstIndex; i < items.length; i++) { - priority[next++] = i; - } - for (int i = 0; i < idx; i++) { - priority[next++] = i; - } - if (updateItems()) redrawTabs(); - } -} -/** - * Set the selection to the tab at the specified item. - * - * @param item the tab item to be selected - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the item is null
    • - *
    - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public void setSelection(CTabItem item) { - checkWidget(); - if (item == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - int index = indexOf(item); - setSelection(index); -} -/** - * Set the selection to the tab at the specified index. - * - * @param index the index of the tab item to be selected - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setSelection(int index) { - checkWidget(); - if (index < 0 || index >= items.length) return; - CTabItem selection = items[index]; - if (selectedIndex == index) { - showItem(selection); - return; - } - - int oldIndex = selectedIndex; - selectedIndex = index; - if (oldIndex != -1) { - items[oldIndex].closeImageState = NONE; - } - selection.closeImageState = NORMAL; - selection.showing = false; - - Control newControl = selection.control; - Control oldControl = null; - if (oldIndex != -1) { - oldControl = items[oldIndex].control; - } - - if (newControl != oldControl) { - if (newControl != null && !newControl.isDisposed()) { - newControl.setBounds(getClientArea()); - newControl.setVisible(true); - } - if (oldControl != null && !oldControl.isDisposed()) { - oldControl.setVisible(false); - } - } - showItem(selection); - redraw(); -} -void setSelection(int index, boolean notify) { - int oldSelectedIndex = selectedIndex; - setSelection(index); - if (notify && selectedIndex != oldSelectedIndex && selectedIndex != -1) { - Event event = new Event(); - event.item = getItem(selectedIndex); - notifyListeners(SWT.Selection, event); - } -} -/** - * Sets the receiver's selection background color to the color specified - * by the argument, or to the default system color for the control - * if the argument is null. - * - * @param color the new color (or null) - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT - if the argument has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public void setSelectionBackground (Color color) { - checkWidget(); - setSelectionHighlightGradientColor(null); - if (selectionBackground == color) return; - if (color == null) color = getDisplay().getSystemColor(SELECTION_BACKGROUND); - selectionBackground = color; - if (selectedIndex > -1) redraw(); -} -/** - * Specify a gradient of colours to be draw in the background of the selected tab. - * For example to draw a gradient that varies from dark blue to blue and then to - * white, use the following call to setBackground: - *
    - *	cfolder.setBackground(new Color[]{display.getSystemColor(SWT.COLOR_DARK_BLUE), 
    - *		                           display.getSystemColor(SWT.COLOR_BLUE),
    - *		                           display.getSystemColor(SWT.COLOR_WHITE), 
    - *		                           display.getSystemColor(SWT.COLOR_WHITE)},
    - *		               new int[] {25, 50, 100});
    - * 
    - * - * @param colors an array of Color that specifies the colors to appear in the gradient - * in order of appearance left to right. The value null clears the - * background gradient. The value null can be used inside the array of - * Color to specify the background color. - * @param percents an array of integers between 0 and 100 specifying the percent of the width - * of the widget at which the color should change. The size of the percents array must be one - * less than the size of the colors array. - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public void setSelectionBackground(Color[] colors, int[] percents) { - setSelectionBackground(colors, percents, false); -} -/** - * Specify a gradient of colours to be draw in the background of the selected tab. - * For example to draw a vertical gradient that varies from dark blue to blue and then to - * white, use the following call to setBackground: - *
    - *	cfolder.setBackground(new Color[]{display.getSystemColor(SWT.COLOR_DARK_BLUE), 
    - *		                           display.getSystemColor(SWT.COLOR_BLUE),
    - *		                           display.getSystemColor(SWT.COLOR_WHITE), 
    - *		                           display.getSystemColor(SWT.COLOR_WHITE)},
    - *		                  new int[] {25, 50, 100}, true);
    - * 
    - * - * @param colors an array of Color that specifies the colors to appear in the gradient - * in order of appearance left to right. The value null clears the - * background gradient. The value null can be used inside the array of - * Color to specify the background color. - * @param percents an array of integers between 0 and 100 specifying the percent of the width - * of the widget at which the color should change. The size of the percents array must be one - * less than the size of the colors array. - * - * @param vertical indicate the direction of the gradient. True is vertical and false is horizontal. - * - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - * - * @since 3.0 - */ -public void setSelectionBackground(Color[] colors, int[] percents, boolean vertical) { - checkWidget(); - int colorsLength; - Color highlightBeginColor = null; //null == no highlight - - if (colors != null) { - //The colors array can optionally have an extra entry which describes the highlight top color - //Thus its either one or two larger than the percents array - if (percents == null || - ! ((percents.length == colors.length - 1) || (percents.length == colors.length - 2))){ - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - for (int i = 0; i < percents.length; i++) { - if (percents[i] < 0 || percents[i] > 100) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (i > 0 && percents[i] < percents[i-1]) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - } - //If the colors is exactly two more than percents then last is highlight - //Keep track of *real* colorsLength (minus the highlight) - if(percents.length == colors.length - 2) { - highlightBeginColor = colors[colors.length - 1]; - colorsLength = colors.length - 1; - } else { - colorsLength = colors.length; - } - if (getDisplay().getDepth() < 15) { - // Don't use gradients on low color displays - colors = new Color[] {colors[colorsLength - 1]}; - colorsLength = colors.length; - percents = new int[] {}; - } - } else { - colorsLength = 0; - } - - // Are these settings the same as before? - if (selectionBgImage == null) { - if ((selectionGradientColors != null) && (colors != null) && - (selectionGradientColors.length == colorsLength)) { - boolean same = false; - for (int i = 0; i < selectionGradientColors.length; i++) { - if (selectionGradientColors[i] == null) { - same = colors[i] == null; - } else { - same = selectionGradientColors[i].equals(colors[i]); - } - if (!same) break; - } - if (same) { - for (int i = 0; i < selectionGradientPercents.length; i++) { - same = selectionGradientPercents[i] == percents[i]; - if (!same) break; - } - } - if (same && this.selectionGradientVertical == vertical) return; - } - } else { - selectionBgImage = null; - } - // Store the new settings - if (colors == null) { - selectionGradientColors = null; - selectionGradientPercents = null; - selectionGradientVertical = false; - setSelectionBackground((Color)null); - setSelectionHighlightGradientColor(null); - } else { - selectionGradientColors = new Color[colorsLength]; - for (int i = 0; i < colorsLength; ++i) { - selectionGradientColors[i] = colors[i]; - } - selectionGradientPercents = new int[percents.length]; - for (int i = 0; i < percents.length; ++i) { - selectionGradientPercents[i] = percents[i]; - } - selectionGradientVertical = vertical; - setSelectionBackground(selectionGradientColors[selectionGradientColors.length-1]); - setSelectionHighlightGradientColor(highlightBeginColor); - } - - // Refresh with the new settings - if (selectedIndex > -1) redraw(); -} - -/* - * Set the color for the highlight start for selected tabs. - * Update the cache of highlight gradient colors if required. - */ - -void setSelectionHighlightGradientColor(Color start) { - //Set to null to match all the early return cases. - //For early returns, don't realloc the cache, we may get a cache hit next time we're given the highlight - selectionHighlightGradientBegin = null; - - if(start == null) - return; - - //don't bother on low colour - if (getDisplay().getDepth() < 15) - return; - - //don't bother if we don't have a background gradient - if(selectionGradientColors.length < 2) - return; - - //OK we know its a valid gradient now - selectionHighlightGradientBegin = start; - - if(! isSelectionHighlightColorsCacheHit(start)) - createSelectionHighlightGradientColors(start); //if no cache hit then compute new ones -} - -/* - * Return true if given start color, the cache of highlight colors we have - * would match the highlight colors we'd compute. - */ -boolean isSelectionHighlightColorsCacheHit(Color start) { - - if(selectionHighlightGradientColorsCache == null) - return false; - - //this case should never happen but check to be safe before accessing array indexes - if(selectionHighlightGradientColorsCache.length < 2) - return false; - - Color highlightBegin = selectionHighlightGradientColorsCache[0]; - Color highlightEnd = selectionHighlightGradientColorsCache[selectionHighlightGradientColorsCache.length - 1]; - - if(! highlightBegin.equals(start)) - return false; - - //Compare number of colours we have vs. we'd compute - if(selectionHighlightGradientColorsCache.length != tabHeight) - return false; - - //Compare existing highlight end to what it would be (selectionBackground) - if(! highlightEnd.equals(selectionBackground)) - return false; - - return true; -} - -/** - * Set the image to be drawn in the background of the selected tab. Image - * is stretched or compressed to cover entire selection tab area. - * - * @param image the image to be drawn in the background - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setSelectionBackground(Image image) { - checkWidget(); - setSelectionHighlightGradientColor(null); - if (image == selectionBgImage) return; - if (image != null) { - selectionGradientColors = null; - selectionGradientPercents = null; - disposeSelectionHighlightGradientColors(); - } - selectionBgImage = image; - if (selectedIndex > -1) redraw(); -} -/** - * Set the foreground color of the selected tab. - * - * @param color the color of the text displayed in the selected tab - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setSelectionForeground (Color color) { - checkWidget(); - if (selectionForeground == color) return; - if (color == null) color = getDisplay().getSystemColor(SELECTION_FOREGROUND); - selectionForeground = color; - if (selectedIndex > -1) redraw(); -} - -/* - * Allocate colors for the highlight line. - * Colours will be a gradual blend ranging from to. - * Blend length will be tab height. - * Recompute this if tab height changes. - * Could remain null if there'd be no gradient (start=end or low colour display) - */ -void createSelectionHighlightGradientColors(Color start) { - disposeSelectionHighlightGradientColors(); //dispose if existing - - if(start == null) //shouldn't happen but just to be safe - return; - - //alloc colours for entire height to ensure it matches wherever we stop drawing - int fadeGradientSize = tabHeight; - - RGB from = start.getRGB(); - RGB to = selectionBackground.getRGB(); - - selectionHighlightGradientColorsCache = new Color[fadeGradientSize]; - int denom = fadeGradientSize - 1; - - for (int i = 0; i < fadeGradientSize; i++) { - int propFrom = denom - i; - int propTo = i; - int red = (to.red * propTo + from.red * propFrom) / denom; - int green = (to.green * propTo + from.green * propFrom) / denom; - int blue = (to.blue * propTo + from.blue * propFrom) / denom; - selectionHighlightGradientColorsCache[i] = new Color(getDisplay(), red, green, blue); - } -} - -void disposeSelectionHighlightGradientColors() { - if(selectionHighlightGradientColorsCache == null) - return; - for (int i = 0; i < selectionHighlightGradientColorsCache.length; i++) { - selectionHighlightGradientColorsCache[i].dispose(); - } - selectionHighlightGradientColorsCache = null; -} - -/* - * Return the gradient start color for selected tabs, which is the start of the tab fade - * (end is selectionBackground). - */ -Color getSelectionBackgroundGradientBegin() { - if (selectionGradientColors == null) - return getSelectionBackground(); - if (selectionGradientColors.length == 0) - return getSelectionBackground(); - return selectionGradientColors[0]; -} - -/** - * Sets the shape that the CTabFolder will use to render itself. - * - * @param simple true if the CTabFolder should render itself in a simple, traditional style - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public void setSimple(boolean simple) { - checkWidget(); - if (this.simple != simple) { - this.simple = simple; - Rectangle rectBefore = getClientArea(); - updateItems(); - Rectangle rectAfter = getClientArea(); - if (!rectBefore.equals(rectAfter)) { - notifyListeners(SWT.Resize, new Event()); - } - redraw(); - } -} -/** - * Sets the number of tabs that the CTabFolder should display - * - * @param single true if only the selected tab should be displayed otherwise, multiple tabs will be shown. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public void setSingle(boolean single) { - checkWidget(); - if (this.single != single) { - this.single = single; - if (!single) { - for (int i = 0; i < items.length; i++) { - if (i != selectedIndex && items[i].closeImageState == NORMAL) { - items[i].closeImageState = NONE; - } - } - } - Rectangle rectBefore = getClientArea(); - updateItems(); - Rectangle rectAfter = getClientArea(); - if (!rectBefore.equals(rectAfter)) { - notifyListeners(SWT.Resize, new Event()); - } - redraw(); - } -} -/** - * Specify a fixed height for the tab items. If no height is specified, - * the default height is the height of the text or the image, whichever - * is greater. Specifying a height of -1 will revert to the default height. - * - * @param height the pixel value of the height or -1 - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_INVALID_ARGUMENT - if called with a height of less than 0
    • - *
    - */ -public void setTabHeight(int height) { - checkWidget(); - if (height < -1) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - fixedTabHeight = height; - updateTabHeight(false); -} -/** - * Specify whether the tabs should appear along the top of the folder - * or along the bottom of the folder. - * - * @param position SWT.TOP for tabs along the top or SWT.BOTTOM for tabs along the bottom - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_INVALID_ARGUMENT - if the position value is not either SWT.TOP or SWT.BOTTOM
    • - *
    - * - * @since 3.0 - */ -public void setTabPosition(int position) { - checkWidget(); - if (position != SWT.TOP && position != SWT.BOTTOM) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (onBottom != (position == SWT.BOTTOM)) { - onBottom = position == SWT.BOTTOM; - borderTop = onBottom ? borderLeft : 0; - borderBottom = onBottom ? 0 : borderRight; - updateTabHeight(true); - Rectangle rectBefore = getClientArea(); - updateItems(); - Rectangle rectAfter = getClientArea(); - if (!rectBefore.equals(rectAfter)) { - notifyListeners(SWT.Resize, new Event()); - } - redraw(); - } -} -/** - * Set the control that appears in the top right corner of the tab folder. - * Typically this is a close button or a composite with a Menu and close button. - * The topRight control is optional. Setting the top right control to null will - * remove it from the tab folder. - * - * @param control the control to be displayed in the top right corner or null - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_INVALID_ARGUMENT - if the control is not a child of this CTabFolder
    • - *
    - * - * @since 2.1 - */ -public void setTopRight(Control control) { - setTopRight(control, SWT.RIGHT); -} -/** - * Set the control that appears in the top right corner of the tab folder. - * Typically this is a close button or a composite with a Menu and close button. - * The topRight control is optional. Setting the top right control to null - * will remove it from the tab folder. - *

    - * The alignment parameter sets the layout of the control in the tab area. - * SWT.RIGHT will cause the control to be positioned on the far - * right of the folder and it will have its default size. SWT.FILL - * will size the control to fill all the available space to the right of the - * last tab. If there is no available space, the control will not be visible. - *

    - * - * @param control the control to be displayed in the top right corner or null - * @param alignment SWT.RIGHT or SWT.FILL - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_INVALID_ARGUMENT - if the control is not a child of this CTabFolder
    • - *
    - * - * @since 3.0 - */ -public void setTopRight(Control control, int alignment) { - checkWidget(); - if (alignment != SWT.RIGHT && alignment != SWT.FILL) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (control != null && control.getParent() != this) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - topRight = control; - topRightAlignment = alignment; - if (updateItems()) redraw(); -} -/** - * Specify whether the close button appears - * when the user hovers over an unselected tabs. - * - * @param visible true makes the close button appear - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public void setUnselectedCloseVisible(boolean visible) { - checkWidget(); - if (showUnselectedClose == visible) return; - // display close button when mouse hovers - showUnselectedClose = visible; - updateItems(); - redraw(); -} -/** - * Specify whether the image appears on unselected tabs. - * - * @param visible true makes the image appear - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public void setUnselectedImageVisible(boolean visible) { - checkWidget(); - if (showUnselectedImage == visible) return; - // display image on unselected items - showUnselectedImage = visible; - updateItems(); - redraw(); -} -/** - * Shows the item. If the item is already showing in the receiver, - * this method simply returns. Otherwise, the items are scrolled until - * the item is visible. - * - * @param item the item to be shown - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the item is null
    • - *
    • ERROR_INVALID_ARGUMENT - if the item has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see CTabFolder#showSelection() - * - * @since 2.0 - */ -public void showItem (CTabItem item) { - checkWidget(); - if (item == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - if (item.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - int index = indexOf(item); - if (index == -1) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - int idx = -1; - for (int i = 0; i < priority.length; i++) { - if (priority[i] == index) { - idx = i; - break; - } - } - if (mru) { - // move to front of mru order - int[] newPriority = new int[priority.length]; - System.arraycopy(priority, 0, newPriority, 1, idx); - System.arraycopy(priority, idx+1, newPriority, idx+1, priority.length - idx - 1); - newPriority[0] = index; - priority = newPriority; - } - if (item.isShowing()) return; - updateItems(index); - redrawTabs(); -} -void showList (Rectangle rect) { - if (items.length == 0 || !showChevron) return; - if (showMenu == null || showMenu.isDisposed()) { - showMenu = new Menu(this); - } else { - MenuItem[] items = showMenu.getItems(); - for (int i = 0; i < items.length; i++) { - items[i].dispose(); - } - } - final String id = "CTabFolder_showList_Index"; //$NON-NLS-1$ - for (int i = 0; i < items.length; i++) { - CTabItem tab = items[i]; - if (tab.showing) continue; - MenuItem item = new MenuItem(showMenu, SWT.NONE); - item.setText(tab.getText()); - item.setImage(tab.getImage()); - item.setData(id, tab); - item.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - MenuItem menuItem = (MenuItem)e.widget; - int index = indexOf((CTabItem)menuItem.getData(id)); - CTabFolder.this.setSelection(index, true); - } - }); - } - int x = rect.x; - int y = rect.y + rect.height; - Point location = getDisplay().map(this, null, x, y); - showMenu.setLocation(location.x, location.y); - showMenu.setVisible(true); -} -/** - * Shows the selection. If the selection is already showing in the receiver, - * this method simply returns. Otherwise, the items are scrolled until - * the selection is visible. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see CTabFolder#showItem(CTabItem) - * - * @since 2.0 - */ -public void showSelection () { - checkWidget (); - if (selectedIndex != -1) { - showItem(getSelection()); - } -} - -void _setToolTipText (int x, int y) { - String oldTip = getToolTipText(); - String newTip = _getToolTip(x, y); - if (newTip == null || !newTip.equals(oldTip)) { - setToolTipText(newTip); - } -} - -boolean updateItems() { - return updateItems(selectedIndex); -} - -boolean updateItems(int showIndex) { - if (!single && !mru && showIndex != -1) { - // make sure selected item will be showing - int firstIndex = showIndex; - if (priority[0] < showIndex) { - int maxWidth = getRightItemEdge() - borderLeft; - if (!simple) maxWidth -= curveWidth - 2*curveIndent; - int width = 0; - int[] widths = new int[items.length]; - GC gc = new GC(this); - for (int i = priority[0]; i <= showIndex; i++) { - widths[i] = items[i].preferredWidth(gc, i == selectedIndex, true); - width += widths[i]; - if (width > maxWidth) break; - } - if (width > maxWidth) { - width = 0; - for (int i = showIndex; i >= 0; i--) { - if (widths[i] == 0) widths[i] = items[i].preferredWidth(gc, i == selectedIndex, true); - width += widths[i]; - if (width > maxWidth) break; - firstIndex = i; - } - } else { - firstIndex = priority[0]; - for (int i = showIndex + 1; i < items.length; i++) { - widths[i] = items[i].preferredWidth(gc, i == selectedIndex, true); - width += widths[i]; - if (width >= maxWidth) break; - } - if (width < maxWidth) { - for (int i = priority[0] - 1; i >= 0; i--) { - if (widths[i] == 0) widths[i] = items[i].preferredWidth(gc, i == selectedIndex, true); - width += widths[i]; - if (width > maxWidth) break; - firstIndex = i; - } - } - } - gc.dispose(); - } - if (firstIndex != priority[0]) { - int index = 0; - for (int i = firstIndex; i < items.length; i++) { - priority[index++] = i; - } - for (int i = 0; i < firstIndex; i++) { - priority[index++] = i; - } - } - } - - boolean oldShowChevron = showChevron; - boolean changed = setItemSize(); - changed |= setItemLocation(); - setButtonBounds(); - changed |= showChevron != oldShowChevron; - if (changed && getToolTipText() != null) { - Point pt = getDisplay().getCursorLocation(); - pt = toControl(pt); - _setToolTipText(pt.x, pt.y); - } - return changed; -} -boolean updateTabHeight(boolean force){ - int style = getStyle(); - if (fixedTabHeight == 0 && (style & SWT.FLAT) != 0 && (style & SWT.BORDER) == 0) highlight_header = 0; - int oldHeight = tabHeight; - if (fixedTabHeight != SWT.DEFAULT) { - tabHeight = fixedTabHeight == 0 ? 0 : fixedTabHeight + 1; // +1 for line drawn across top of tab - } else { - int tempHeight = 0; - GC gc = new GC(this); - if (items.length == 0) { - tempHeight = gc.textExtent("Default", CTabItem.FLAGS).y + CTabItem.TOP_MARGIN + CTabItem.BOTTOM_MARGIN; //$NON-NLS-1$ - } else { - for (int i=0; i < items.length; i++) { - tempHeight = Math.max(tempHeight, items[i].preferredHeight(gc)); - } - } - gc.dispose(); - tabHeight = tempHeight; - } - if (!force && tabHeight == oldHeight) return false; - - oldSize = null; - if (onBottom) { - int d = tabHeight - 12; - curve = new int[]{0,13+d, 0,12+d, 2,12+d, 3,11+d, 5,11+d, 6,10+d, 7,10+d, 9,8+d, 10,8+d, - 11,7+d, 11+d,7, - 12+d,6, 13+d,6, 15+d,4, 16+d,4, 17+d,3, 19+d,3, 20+d,2, 22+d,2, 23+d,1}; - curveWidth = 26+d; - curveIndent = curveWidth/3; - } else { - int d = tabHeight - 12; - curve = new int[]{0,0, 0,1, 2,1, 3,2, 5,2, 6,3, 7,3, 9,5, 10,5, - 11,6, 11+d,6+d, - 12+d,7+d, 13+d,7+d, 15+d,9+d, 16+d,9+d, 17+d,10+d, 19+d,10+d, 20+d,11+d, 22+d,11+d, 23+d,12+d}; - curveWidth = 26+d; - curveIndent = curveWidth/3; - - //this could be static but since values depend on curve, better to keep in one place - topCurveHighlightStart = new int[] { - 0, 2, 1, 2, 2, 2, - 3, 3, 4, 3, 5, 3, - 6, 4, 7, 4, - 8, 5, - 9, 6, 10, 6}; - - //also, by adding in 'd' here we save some math cost when drawing the curve - topCurveHighlightEnd = new int[] { - 10+d, 6+d, - 11+d, 7+d, - 12+d, 8+d, 13+d, 8+d, - 14+d, 9+d, - 15+d, 10+d, 16+d, 10+d, - 17+d, 11+d, 18+d, 11+d, 19+d, 11+d, - 20+d, 12+d, 21+d, 12+d, 22+d, 12+d }; - } - notifyListeners(SWT.Resize, new Event()); - return true; -} -String _getToolTip(int x, int y) { - if (showMin && minRect.contains(x, y)) return minimized ? SWT.getMessage("SWT_Restore") : SWT.getMessage("SWT_Minimize"); //$NON-NLS-1$ //$NON-NLS-2$ - if (showMax && maxRect.contains(x, y)) return maximized ? SWT.getMessage("SWT_Restore") : SWT.getMessage("SWT_Maximize"); //$NON-NLS-1$ //$NON-NLS-2$ - if (showChevron && chevronRect.contains(x, y)) return SWT.getMessage("SWT_ShowList"); //$NON-NLS-1$ - CTabItem item = getItem(new Point (x, y)); - if (item == null) return null; - if (!item.showing) return null; - if ((showClose || item.showClose) && item.closeRect.contains(x, y)) { - return SWT.getMessage("SWT_Close"); //$NON-NLS-1$ - } - return item.getToolTipText(); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder2Adapter.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder2Adapter.java deleted file mode 100644 index 82c0212709..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder2Adapter.java +++ /dev/null @@ -1,83 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -/** - * This adapter class provides default implementations for the - * methods described by the CTabFolder2Listener interface. - *

    - * Classes that wish to deal with CTabFolderEvents can - * extend this class and override only the methods which they are - * interested in. - *

    - * - * @see CTabFolder2Listener - * @see CTabFolderEvent - * @see Sample code and further information - * - * @since 3.0 - */ -public class CTabFolder2Adapter implements CTabFolder2Listener { - -/** - * Sent when the user clicks on the close button of an item in the CTabFolder. The item being closed is specified - * in the event.item field. Setting the event.doit field to false will stop the CTabItem from closing. - * When the CTabItem is closed, it is disposed. The contents of the CTabItem (see CTabItem#setControl) will be - * made not visible when the CTabItem is closed. - *

    - * The default behaviour is to close the CTabItem. - *

    - * - * @param event an event indicating the item being closed - */ -public void close(CTabFolderEvent event){} - -/** - * Sent when the user clicks on the minimize button of a CTabFolder. - *

    - * The default behaviour is to do nothing. - *

    - * - * @param event an event containing information about the minimize - */ -public void minimize(CTabFolderEvent event){} - -/** - * Sent when the user clicks on the maximize button of a CTabFolder. - *

    - * The default behaviour is to do nothing. - *

    - * - * @param event an event containing information about the maximize - */ -public void maximize(CTabFolderEvent event){} - -/** - * Sent when the user clicks on the restore button of a CTabFolder. - *

    - * The default behaviour is to do nothing. - *

    - * - * @param event an event containing information about the restore - */ -public void restore(CTabFolderEvent event){} - -/** - * Sent when the user clicks on the chevron button of a CTabFolder. - *

    - * The default behaviour is to show a list of items that are not currently - * visible and to change the selection based on the item selected from the list. - *

    - * - * @param event an event containing information about the show list - */ -public void showList(CTabFolderEvent event){} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder2Listener.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder2Listener.java deleted file mode 100644 index 7e2e17862f..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder2Listener.java +++ /dev/null @@ -1,112 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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.swt.custom; - -import org.eclipse.swt.internal.*; - -/** - * Classes which implement this interface provide methods - * that deal with the events that are generated by the CTabFolder - * control. - *

    - * After creating an instance of a class that implements - * this interface it can be added to a CTabFolder using the - * addCTabFolder2Listener method and removed using - * the removeCTabFolder2Listener method. When - * events occurs in a CTabFolder the appropriate method - * will be invoked. - *

    - * - * @see CTabFolder2Adapter - * @see CTabFolderEvent - * - * @since 3.0 - */ -public interface CTabFolder2Listener extends SWTEventListener { - -/** - * Sent when the user clicks on the close button of an item in the CTabFolder. - * The item being closed is specified in the event.item field. - * Setting the event.doit field to false will stop the CTabItem from closing. - * When the CTabItem is closed, it is disposed. The contents of the - * CTabItem (see CTabItem.setControl) will be made not visible when - * the CTabItem is closed. - * - * @param event an event indicating the item being closed - */ -public void close(CTabFolderEvent event); - -/** - * Sent when the user clicks on the minimize button of a CTabFolder. - * The state of the CTabFolder does not change automatically - it - * is up to the application to change the state of the CTabFolder - * in response to this event using CTabFolder.setMinimized(true). - * - * @param event an event containing information about the minimize - * - * @see CTabFolder#getMinimized() - * @see CTabFolder#setMinimized(boolean) - * @see CTabFolder#setMinimizeVisible(boolean) - */ -public void minimize(CTabFolderEvent event); - -/** - * Sent when the user clicks on the maximize button of a CTabFolder. - * The state of the CTabFolder does not change automatically - it - * is up to the application to change the state of the CTabFolder - * in response to this event using CTabFolder.setMaximized(true). - * - * @param event an event containing information about the maximize - * - * @see CTabFolder#getMaximized() - * @see CTabFolder#setMaximized(boolean) - * @see CTabFolder#setMaximizeVisible(boolean) - */ -public void maximize(CTabFolderEvent event); - -/** - * Sent when the user clicks on the restore button of a CTabFolder. - * This event is sent either to restore the CTabFolder from the - * minimized state or from the maximized state. To determine - * which restore is requested, use CTabFolder.getMinimized() or - * CTabFolder.getMaximized() to determine the current state. - * The state of the CTabFolder does not change automatically - it - * is up to the application to change the state of the CTabFolder - * in response to this event using CTabFolder.setMaximized(false) - * or CTabFolder.setMinimized(false). - * - * @param event an event containing information about the restore - * - * @see CTabFolder#getMinimized() - * @see CTabFolder#getMaximized() - * @see CTabFolder#setMinimized(boolean) - * @see CTabFolder#setMinimizeVisible(boolean) - * @see CTabFolder#setMaximized(boolean) - * @see CTabFolder#setMaximizeVisible(boolean) - */ -public void restore(CTabFolderEvent event); - -/** - * Sent when the user clicks on the chevron button of the CTabFolder. - * A chevron appears in the CTabFolder when there are more tabs - * than can be displayed at the current widget size. To select a - * tab that is not currently visible, the user clicks on the - * chevron and selects a tab item from a list. By default, the - * CTabFolder provides a list of all the items that are not currently - * visible, however, the application can provide its own list by setting - * the event.doit field to false and displaying a selection list. - * - * @param event an event containing information about the show list - * - * @see CTabFolder#setSelection(CTabItem) - */ -public void showList(CTabFolderEvent event); -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderAdapter.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderAdapter.java deleted file mode 100755 index 85f210a938..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderAdapter.java +++ /dev/null @@ -1,24 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -/** - * This adapter class provides a default implementation for the - * method described by the CTabFolderListener interface. - * - * @see CTabFolderListener - * @see CTabFolderEvent - * @see Sample code and further information - */ -public class CTabFolderAdapter implements CTabFolderListener { - public void itemClosed(CTabFolderEvent event){} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderEvent.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderEvent.java deleted file mode 100755 index 99394bf37a..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderEvent.java +++ /dev/null @@ -1,92 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -import org.eclipse.swt.events.*; -import org.eclipse.swt.widgets.*; - -/** - * This event is sent when an event is generated in the CTabFolder. - * - * @see Sample code and further information - */ -public class CTabFolderEvent extends TypedEvent { - /** - * The tab item for the operation. - */ - public Widget item; - - /** - * A flag indicating whether the operation should be allowed. - * Setting this field to false will cancel the operation. - * Applies to the close and showList events. - */ - public boolean doit; - - /** - * The widget-relative, x coordinate of the chevron button - * at the time of the event. Applies to the showList event. - * - * @since 3.0 - */ - public int x; - /** - * The widget-relative, y coordinate of the chevron button - * at the time of the event. Applies to the showList event. - * - * @since 3.0 - */ - public int y; - /** - * The width of the chevron button at the time of the event. - * Applies to the showList event. - * - * @since 3.0 - */ - public int width; - /** - * The height of the chevron button at the time of the event. - * Applies to the showList event. - * - * @since 3.0 - */ - public int height; - - static final long serialVersionUID = 3760566386225066807L; - -/** - * Constructs a new instance of this class. - * - * @param w the widget that fired the event - */ -CTabFolderEvent(Widget w) { - super(w); -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the event - */ -public String toString() { - String string = super.toString (); - return string.substring (0, string.length() - 1) // remove trailing '}' - + " item=" + item - + " doit=" + doit - + " x=" + x - + " y=" + y - + " width=" + width - + " height=" + height - + "}"; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderLayout.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderLayout.java deleted file mode 100644 index e01fac6e55..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderLayout.java +++ /dev/null @@ -1,82 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * This class provides the layout for CTabFolder - * - * @see CTabFolder - */ -class CTabFolderLayout extends Layout { -protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { - CTabFolder folder = (CTabFolder)composite; - CTabItem[] items = folder.items; - // preferred width of tab area to show all tabs - int tabW = 0; - GC gc = new GC(folder); - for (int i = 0; i < items.length; i++) { - if (folder.single) { - tabW = Math.max(tabW, items[i].preferredWidth(gc, true, false)); - } else { - tabW += items[i].preferredWidth(gc, i == folder.selectedIndex, false); - } - } - gc.dispose(); - tabW += 3; - if (folder.showMax) tabW += CTabFolder.BUTTON_SIZE; - if (folder.showMin) tabW += CTabFolder.BUTTON_SIZE; - if (folder.single) tabW += 3*CTabFolder.BUTTON_SIZE/2; //chevron - if (folder.topRight != null) { - Point pt = folder.topRight.computeSize(SWT.DEFAULT, folder.tabHeight, flushCache); - tabW += 3 + pt.x; - } - if (!folder.single && !folder.simple) tabW += folder.curveWidth - 2*folder.curveIndent; - - int controlW = 0; - int controlH = 0; - // preferred size of controls in tab items - for (int i = 0; i < items.length; i++) { - Control control = items[i].getControl(); - if (control != null && !control.isDisposed()){ - Point size = control.computeSize (wHint, hHint, flushCache); - controlW = Math.max (controlW, size.x); - controlH = Math.max (controlH, size.y); - } - } - - int minWidth = Math.max(tabW, controlW); - int minHeight = (folder.minimized) ? 0 : controlH; - if (minWidth == 0) minWidth = CTabFolder.DEFAULT_WIDTH; - if (minHeight == 0) minHeight = CTabFolder.DEFAULT_HEIGHT; - - if (wHint != SWT.DEFAULT) minWidth = wHint; - if (hHint != SWT.DEFAULT) minHeight = hHint; - - return new Point (minWidth, minHeight); -} -protected boolean flushCache(Control control) { - return true; -} -protected void layout(Composite composite, boolean flushCache) { - CTabFolder folder = (CTabFolder)composite; - // resize content - if (folder.selectedIndex != -1) { - Control control = folder.items[folder.selectedIndex].getControl(); - if (control != null && !control.isDisposed()) { - control.setBounds(folder.getClientArea()); - } - } -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderListener.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderListener.java deleted file mode 100755 index 4fdeab51fe..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolderListener.java +++ /dev/null @@ -1,41 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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.swt.custom; - -import org.eclipse.swt.internal.*; - -/** - * Classes which implement this interface provide a method - * that deals with events generated in the CTabFolder. - *

    - * After creating an instance of a class that implements - * this interface it can be added to a CTabFolder using the - * addCTabFolderListener method and removed using - * the removeCTabFolderListener method. When a - * tab item is closed, the itemClosed method will be invoked. - *

    - * - * @see CTabFolderEvent - */ -public interface CTabFolderListener extends SWTEventListener { - -/** - * Sent when the user clicks on the close button of an item in the CTabFolder. The item being closed is specified - * in the event.item field. Setting the event.doit field to false will stop the CTabItem from closing. - * When the CTabItem is closed, it is disposed. The contents of the CTabItem (see CTabItem.setControl) will be - * made not visible when the CTabItem is closed. - * - * @param event an event indicating the item being closed - * - * @see CTabItem#setControl - */ -public void itemClosed(CTabFolderEvent event); -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabItem.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabItem.java deleted file mode 100755 index ffe19d20e0..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabItem.java +++ /dev/null @@ -1,1053 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 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.swt.custom; - - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * Instances of this class represent a selectable user interface object - * that represent a page in a notebook widget. - * - *
    - *
    Styles:
    - *
    SWT.CLOSE
    - *
    Events:
    - *
    (none)
    - *
    - *

    - * IMPORTANT: This class is not intended to be subclassed. - *

    - * - * @see CTabFolder, CTabItem snippets - * @see Sample code and further information - * @noextend This class is not intended to be subclassed by clients. - */ -public class CTabItem extends Item { - CTabFolder parent; - int x,y,width,height = 0; - Control control; // the tab page - - String toolTipText; - String shortenedText; - int shortenedTextWidth; - - // Appearance - Font font; - Image disabledImage; - - Rectangle closeRect = new Rectangle(0, 0, 0, 0); - int closeImageState = CTabFolder.NONE; - boolean showClose = false; - boolean showing = false; - - // internal constants - static final int TOP_MARGIN = 2; - static final int BOTTOM_MARGIN = 2; - static final int LEFT_MARGIN = 4; - static final int RIGHT_MARGIN = 4; - static final int INTERNAL_SPACING = 4; - static final int FLAGS = SWT.DRAW_TRANSPARENT | SWT.DRAW_MNEMONIC; - static final String ELLIPSIS = "..."; //$NON-NLS-1$ // could use the ellipsis glyph on some platforms "\u2026" - -/** - * Constructs a new instance of this class given its parent - * (which must be a CTabFolder) and a style value - * describing its behavior and appearance. The item is added - * to the end of the items maintained by its parent. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a CTabFolder which will be the parent of the new instance (cannot be null) - * @param style the style of control to construct - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    - * - * @see SWT - * @see Widget#getStyle() - */ -public CTabItem (CTabFolder parent, int style) { - this(parent, style, parent.getItemCount()); -} -/** - * Constructs a new instance of this class given its parent - * (which must be a CTabFolder), a style value - * describing its behavior and appearance, and the index - * at which to place it in the items maintained by its parent. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a CTabFolder which will be the parent of the new instance (cannot be null) - * @param style the style of control to construct - * @param index the zero-relative index to store the receiver in its parent - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    • ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the parent (inclusive)
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    - * - * @see SWT - * @see Widget#getStyle() - */ -public CTabItem (CTabFolder parent, int style, int index) { - super (parent, style); - showClose = (style & SWT.CLOSE) != 0; - parent.createItem (this, index); -} - -/* - * Return whether to use ellipses or just truncate labels - */ -boolean useEllipses() { - return parent.simple; -} - -String shortenText(GC gc, String text, int width) { - return useEllipses() - ? shortenText(gc, text, width, ELLIPSIS) - : shortenText(gc, text, width, ""); //$NON-NLS-1$ -} - -String shortenText(GC gc, String text, int width, String ellipses) { - if (gc.textExtent(text, FLAGS).x <= width) return text; - int ellipseWidth = gc.textExtent(ellipses, FLAGS).x; - int length = text.length(); - TextLayout layout = new TextLayout(getDisplay()); - layout.setText(text); - int end = layout.getPreviousOffset(length, SWT.MOVEMENT_CLUSTER); - while (end > 0) { - text = text.substring(0, end); - int l = gc.textExtent(text, FLAGS).x; - if (l + ellipseWidth <= width) { - break; - } - end = layout.getPreviousOffset(end, SWT.MOVEMENT_CLUSTER); - } - layout.dispose(); - return end == 0 ? text.substring(0, 1) : text + ellipses; -} - -public void dispose() { - if (isDisposed ()) return; - //if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS); - parent.destroyItem(this); - super.dispose(); - parent = null; - control = null; - toolTipText = null; - shortenedText = null; - font = null; -} -void drawClose(GC gc) { - if (closeRect.width == 0 || closeRect.height == 0) return; - Display display = getDisplay(); - - // draw X 9x9 - int indent = Math.max(1, (CTabFolder.BUTTON_SIZE-9)/2); - int x = closeRect.x + indent; - int y = closeRect.y + indent; - y += parent.onBottom ? -1 : 1; - - Color closeBorder = display.getSystemColor(CTabFolder.BUTTON_BORDER); - switch (closeImageState) { - case CTabFolder.NORMAL: { - int[] shape = new int[] {x,y, x+2,y, x+4,y+2, x+5,y+2, x+7,y, x+9,y, - x+9,y+2, x+7,y+4, x+7,y+5, x+9,y+7, x+9,y+9, - x+7,y+9, x+5,y+7, x+4,y+7, x+2,y+9, x,y+9, - x,y+7, x+2,y+5, x+2,y+4, x,y+2}; - gc.setBackground(display.getSystemColor(CTabFolder.BUTTON_FILL)); - gc.fillPolygon(shape); - gc.setForeground(closeBorder); - gc.drawPolygon(shape); - break; - } - case CTabFolder.HOT: { - int[] shape = new int[] {x,y, x+2,y, x+4,y+2, x+5,y+2, x+7,y, x+9,y, - x+9,y+2, x+7,y+4, x+7,y+5, x+9,y+7, x+9,y+9, - x+7,y+9, x+5,y+7, x+4,y+7, x+2,y+9, x,y+9, - x,y+7, x+2,y+5, x+2,y+4, x,y+2}; - gc.setBackground(parent.getFillColor()); - gc.fillPolygon(shape); - gc.setForeground(closeBorder); - gc.drawPolygon(shape); - break; - } - case CTabFolder.SELECTED: { - int[] shape = new int[] {x+1,y+1, x+3,y+1, x+5,y+3, x+6,y+3, x+8,y+1, x+10,y+1, - x+10,y+3, x+8,y+5, x+8,y+6, x+10,y+8, x+10,y+10, - x+8,y+10, x+6,y+8, x+5,y+8, x+3,y+10, x+1,y+10, - x+1,y+8, x+3,y+6, x+3,y+5, x+1,y+3}; - gc.setBackground(parent.getFillColor()); - gc.fillPolygon(shape); - gc.setForeground(closeBorder); - gc.drawPolygon(shape); - break; - } - case CTabFolder.NONE: { - int[] shape = new int[] {x,y, x+10,y, x+10,y+10, x,y+10}; - if (parent.gradientColors != null && !parent.gradientVertical) { - parent.drawBackground(gc, shape, false); - } else { - Color defaultBackground = parent.getBackground(); - Color[] colors = parent.gradientColors; - int[] percents = parent.gradientPercents; - boolean vertical = parent.gradientVertical; - parent.drawBackground(gc, shape, x, y, 10, 10, defaultBackground, null, colors, percents, vertical); - } - break; - } - } -} -void drawSelected(GC gc ) { - Point size = parent.getSize(); - int rightEdge = Math.min (x + width, parent.getRightItemEdge()); - - // Draw selection border across all tabs - int xx = parent.borderLeft; - int yy = parent.onBottom ? size.y - parent.borderBottom - parent.tabHeight - parent.highlight_header : parent.borderTop + parent.tabHeight + 1; - int ww = size.x - parent.borderLeft - parent.borderRight; - int hh = parent.highlight_header - 1; - int[] shape = new int[] {xx,yy, xx+ww,yy, xx+ww,yy+hh, xx,yy+hh}; - if (parent.selectionGradientColors != null && !parent.selectionGradientVertical) { - parent.drawBackground(gc, shape, true); - } else { - gc.setBackground(parent.selectionBackground); - gc.fillRectangle(xx, yy, ww, hh); - } - - if (parent.single) { - if (!showing) return; - } else { - // if selected tab scrolled out of view or partially out of view - // just draw bottom line - if (!showing){ - int x1 = Math.max(0, parent.borderLeft - 1); - int y1 = (parent.onBottom) ? y - 1 : y + height; - int x2 = size.x - parent.borderRight; - gc.setForeground(getDisplay().getSystemColor(CTabFolder.BORDER1_COLOR)); - gc.drawLine(x1, y1, x2, y1); - return; - } - - // draw selected tab background and outline - shape = null; - if (this.parent.onBottom) { - int[] left = parent.simple ? CTabFolder.SIMPLE_BOTTOM_LEFT_CORNER : CTabFolder.BOTTOM_LEFT_CORNER; - int[] right = parent.simple ? CTabFolder.SIMPLE_BOTTOM_RIGHT_CORNER : parent.curve; - if (parent.borderLeft == 0 && parent.indexOf(this) == parent.firstIndex) { - left = new int[]{x, y+height}; - } - shape = new int[left.length+right.length+8]; - int index = 0; - shape[index++] = x; // first point repeated here because below we reuse shape to draw outline - shape[index++] = y - 1; - shape[index++] = x; - shape[index++] = y - 1; - for (int i = 0; i < left.length/2; i++) { - shape[index++] = x + left[2*i]; - shape[index++] = y + height + left[2*i+1] - 1; - } - for (int i = 0; i < right.length/2; i++) { - shape[index++] = parent.simple ? rightEdge - 1 + right[2*i] : rightEdge - parent.curveIndent + right[2*i]; - shape[index++] = parent.simple ? y + height + right[2*i+1] - 1 : y + right[2*i+1] - 2; - } - shape[index++] = parent.simple ? rightEdge - 1 : rightEdge + parent.curveWidth - parent.curveIndent; - shape[index++] = y - 1; - shape[index++] = parent.simple ? rightEdge - 1 : rightEdge + parent.curveWidth - parent.curveIndent; - shape[index++] = y - 1; - } else { - int[] left = parent.simple ? CTabFolder.SIMPLE_TOP_LEFT_CORNER : CTabFolder.TOP_LEFT_CORNER; - int[] right = parent.simple ? CTabFolder.SIMPLE_TOP_RIGHT_CORNER : parent.curve; - if (parent.borderLeft == 0 && parent.indexOf(this) == parent.firstIndex) { - left = new int[]{x, y}; - } - shape = new int[left.length+right.length+8]; - int index = 0; - shape[index++] = x; // first point repeated here because below we reuse shape to draw outline - shape[index++] = y + height + 1; - shape[index++] = x; - shape[index++] = y + height + 1; - for (int i = 0; i < left.length/2; i++) { - shape[index++] = x + left[2*i]; - shape[index++] = y + left[2*i+1]; - } - for (int i = 0; i < right.length/2; i++) { - shape[index++] = parent.simple ? rightEdge - 1 + right[2*i] : rightEdge - parent.curveIndent + right[2*i]; - shape[index++] = y + right[2*i+1]; - } - shape[index++] = parent.simple ? rightEdge - 1 : rightEdge + parent.curveWidth - parent.curveIndent; - shape[index++] = y + height + 1; - shape[index++] = parent.simple ? rightEdge - 1 : rightEdge + parent.curveWidth - parent.curveIndent; - shape[index++] = y + height + 1; - } - - Rectangle clipping = gc.getClipping(); - Rectangle bounds = getBounds(); - bounds.height += 1; - if (parent.onBottom) bounds.y -= 1; - boolean tabInPaint = clipping.intersects(bounds); - - if (tabInPaint) { - // fill in tab background - if (parent.selectionGradientColors != null && !parent.selectionGradientVertical) { - parent.drawBackground(gc, shape, true); - } else { - Color defaultBackground = parent.selectionBackground; - Image image = parent.selectionBgImage; - Color[] colors = parent.selectionGradientColors; - int[] percents = parent.selectionGradientPercents; - boolean vertical = parent.selectionGradientVertical; - xx = x; - yy = parent.onBottom ? y -1 : y + 1; - ww = width; - hh = height; - if (!parent.single && !parent.simple) ww += parent.curveWidth - parent.curveIndent; - parent.drawBackground(gc, shape, xx, yy, ww, hh, defaultBackground, image, colors, percents, vertical); - } - } - - //Highlight MUST be drawn before the outline so that outline can cover it in the right spots (start of swoop) - //otherwise the curve looks jagged - drawHighlight(gc, rightEdge); - - // draw outline - shape[0] = Math.max(0, parent.borderLeft - 1); - if (parent.borderLeft == 0 && parent.indexOf(this) == parent.firstIndex) { - shape[1] = parent.onBottom ? y + height - 1 : y; - shape[5] = shape[3] = shape[1]; - } - shape[shape.length - 2] = size.x - parent.borderRight + 1; - for (int i = 0; i < shape.length/2; i++) { - if (shape[2*i + 1] == y + height + 1) shape[2*i + 1] -= 1; - } - RGB inside = parent.selectionBackground.getRGB(); - if (parent.selectionBgImage != null || - (parent.selectionGradientColors != null && parent.selectionGradientColors.length > 1)) { - inside = null; - } - RGB outside = parent.getBackground().getRGB(); - if (parent.gradientColors != null && parent.gradientColors.length > 1) { - outside = null; - } - Color borderColor = getDisplay().getSystemColor(CTabFolder.BORDER1_COLOR); - parent.antialias(shape, borderColor.getRGB(), inside, outside, gc); - gc.setForeground(borderColor); - gc.drawPolyline(shape); - - if (!tabInPaint) return; - } - - // draw Image - int xDraw = x + LEFT_MARGIN; - if (parent.single && (parent.showClose || showClose)) xDraw += CTabFolder.BUTTON_SIZE; - Image image = getImage(); - if (image != null) { - Rectangle imageBounds = image.getBounds(); - // only draw image if it won't overlap with close button - int maxImageWidth = rightEdge - xDraw - RIGHT_MARGIN; - if (!parent.single && closeRect.width > 0) maxImageWidth -= closeRect.width + INTERNAL_SPACING; - if (imageBounds.width < maxImageWidth) { - int imageX = xDraw; - int imageY = y + (height - imageBounds.height) / 2; - imageY += parent.onBottom ? -1 : 1; - gc.drawImage(image, imageX, imageY); - xDraw += imageBounds.width + INTERNAL_SPACING; - } - } - - // draw Text - int textWidth = rightEdge - xDraw - RIGHT_MARGIN; - if (!parent.single && closeRect.width > 0) textWidth -= closeRect.width + INTERNAL_SPACING; - if (textWidth > 0) { - Font gcFont = gc.getFont(); - gc.setFont(font == null ? parent.getFont() : font); - - if (shortenedText == null || shortenedTextWidth != textWidth) { - shortenedText = shortenText(gc, getText(), textWidth); - shortenedTextWidth = textWidth; - } - Point extent = gc.textExtent(shortenedText, FLAGS); - int textY = y + (height - extent.y) / 2; - textY += parent.onBottom ? -1 : 1; - - gc.setForeground(parent.selectionForeground); - gc.drawText(shortenedText, xDraw, textY, FLAGS); - gc.setFont(gcFont); - - // draw a Focus rectangle - if (parent.isFocusControl()) { - Display display = getDisplay(); - if (parent.simple || parent.single) { - gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK)); - gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE)); - gc.drawFocus(xDraw-1, textY-1, extent.x+2, extent.y+2); - } else { - gc.setForeground(display.getSystemColor(CTabFolder.BUTTON_BORDER)); - gc.drawLine(xDraw, textY+extent.y+1, xDraw+extent.x+1, textY+extent.y+1); - } - } - } - if (parent.showClose || showClose) drawClose(gc); -} - -/* - * Draw a highlight effect along the left, top, and right edges of the tab. - * Only for curved tabs, on top. - * Do not draw if insufficient colors. - */ -void drawHighlight(GC gc, int rightEdge) { - //only draw for curvy tabs and only draw for top tabs - if(parent.simple || this.parent.onBottom) - return; - - if(parent.selectionHighlightGradientBegin == null) - return; - - Color[] gradients = parent.selectionHighlightGradientColorsCache; - if(gradients == null) - return; - int gradientsSize = gradients.length; - if(gradientsSize == 0) - return; //shouldn't happen but just to be tidy - - gc.setForeground(gradients[0]); - - //draw top horizontal line - gc.drawLine( - CTabFolder.TOP_LEFT_CORNER_HILITE[0] + x + 1, //rely on fact that first pair is top/right of curve - 1 + y, - rightEdge - parent.curveIndent, - 1 + y); - - int[] leftHighlightCurve = CTabFolder.TOP_LEFT_CORNER_HILITE; - - int d = parent.tabHeight - parent.topCurveHighlightEnd.length /2; - - int lastX = 0; - int lastY = 0; - int lastColorIndex = 0; - - //draw upper left curve highlight - for (int i = 0; i < leftHighlightCurve.length /2; i++) { - int rawX = leftHighlightCurve[i * 2]; - int rawY = leftHighlightCurve[i * 2 + 1]; - lastX = rawX + x; - lastY = rawY + y; - lastColorIndex = rawY - 1; - gc.setForeground(gradients[lastColorIndex]); - gc.drawPoint(lastX, lastY); - } - //draw left vertical line highlight - for(int i = lastColorIndex; i < gradientsSize; i++) { - gc.setForeground(gradients[i]); - gc.drawPoint(lastX, 1 + lastY++); - } - - int rightEdgeOffset = rightEdge - parent.curveIndent; - - //draw right swoop highlight up to diagonal portion - for (int i = 0; i < parent.topCurveHighlightStart.length /2; i++) { - int rawX = parent.topCurveHighlightStart[i * 2]; - int rawY = parent.topCurveHighlightStart[i * 2 + 1]; - lastX = rawX + rightEdgeOffset; - lastY = rawY + y; - lastColorIndex = rawY - 1; - if(lastColorIndex >= gradientsSize) - break; //can happen if tabs are unusually short and cut off the curve - gc.setForeground(gradients[lastColorIndex]); - gc.drawPoint(lastX, lastY); - } - //draw right diagonal line highlight - for(int i = lastColorIndex; i < lastColorIndex + d; i++) { - if(i >= gradientsSize) - break; //can happen if tabs are unusually short and cut off the curve - gc.setForeground(gradients[i]); - gc.drawPoint(1 + lastX++, 1 + lastY++); - } - - //draw right swoop highlight from diagonal portion to end - for (int i = 0; i < parent.topCurveHighlightEnd.length /2; i++) { - int rawX = parent.topCurveHighlightEnd[i * 2]; //d is already encoded in this value - int rawY = parent.topCurveHighlightEnd[i * 2 + 1]; //d already encoded - lastX = rawX + rightEdgeOffset; - lastY = rawY + y; - lastColorIndex = rawY - 1; - if(lastColorIndex >= gradientsSize) - break; //can happen if tabs are unusually short and cut off the curve - gc.setForeground(gradients[lastColorIndex]); - gc.drawPoint(lastX, lastY); - } -} - -/* - * Draw the unselected border for the receiver on the right. - * - * @param gc - */ -void drawRightUnselectedBorder(GC gc) { - - int[] shape = null; - int startX = x + width - 1; - - if (this.parent.onBottom) { - int[] right = parent.simple - ? CTabFolder.SIMPLE_UNSELECTED_INNER_CORNER - : CTabFolder.BOTTOM_RIGHT_CORNER; - - shape = new int[right.length + 2]; - int index = 0; - - for (int i = 0; i < right.length / 2; i++) { - shape[index++] = startX + right[2 * i]; - shape[index++] = y + height + right[2 * i + 1] - 1; - } - shape[index++] = startX; - shape[index++] = y - 1; - } else { - int[] right = parent.simple - ? CTabFolder.SIMPLE_UNSELECTED_INNER_CORNER - : CTabFolder.TOP_RIGHT_CORNER; - - shape = new int[right.length + 2]; - int index = 0; - - for (int i = 0; i < right.length / 2; i++) { - shape[index++] = startX + right[2 * i]; - shape[index++] = y + right[2 * i + 1]; - } - - shape[index++] = startX; - shape[index++] = y + height; - - } - - drawBorder(gc, shape); - -} - -/* - * Draw the border of the tab - * - * @param gc - * @param shape - */ -void drawBorder(GC gc, int[] shape) { - - gc.setForeground(getDisplay().getSystemColor(CTabFolder.BORDER1_COLOR)); - gc.drawPolyline(shape); -} - -/* - * Draw the unselected border for the receiver on the left. - * - * @param gc - */ -void drawLeftUnselectedBorder(GC gc) { - - int[] shape = null; - if (this.parent.onBottom) { - int[] left = parent.simple - ? CTabFolder.SIMPLE_UNSELECTED_INNER_CORNER - : CTabFolder.BOTTOM_LEFT_CORNER; - - shape = new int[left.length + 2]; - int index = 0; - shape[index++] = x; - shape[index++] = y - 1; - for (int i = 0; i < left.length / 2; i++) { - shape[index++] = x + left[2 * i]; - shape[index++] = y + height + left[2 * i + 1] - 1; - } - } else { - int[] left = parent.simple - ? CTabFolder.SIMPLE_UNSELECTED_INNER_CORNER - : CTabFolder.TOP_LEFT_CORNER; - - shape = new int[left.length + 2]; - int index = 0; - shape[index++] = x; - shape[index++] = y + height; - for (int i = 0; i < left.length / 2; i++) { - shape[index++] = x + left[2 * i]; - shape[index++] = y + left[2 * i + 1]; - } - - } - - drawBorder(gc, shape); -} - -void drawUnselected(GC gc) { - // Do not draw partial items - if (!showing) return; - - Rectangle clipping = gc.getClipping(); - Rectangle bounds = getBounds(); - if (!clipping.intersects(bounds)) return; - - // draw border - int index = parent.indexOf(this); - - if (index > 0 && index < parent.selectedIndex) - drawLeftUnselectedBorder(gc); - // If it is the last one then draw a line - if (index > parent.selectedIndex) - drawRightUnselectedBorder(gc); - - // draw Image - int xDraw = x + LEFT_MARGIN; - Image image = getImage(); - if (image != null && parent.showUnselectedImage) { - Rectangle imageBounds = image.getBounds(); - // only draw image if it won't overlap with close button - int maxImageWidth = x + width - xDraw - RIGHT_MARGIN; - if (parent.showUnselectedClose && (parent.showClose || showClose)) { - maxImageWidth -= closeRect.width + INTERNAL_SPACING; - } - if (imageBounds.width < maxImageWidth) { - int imageX = xDraw; - int imageHeight = imageBounds.height; - int imageY = y + (height - imageHeight) / 2; - imageY += parent.onBottom ? -1 : 1; - int imageWidth = imageBounds.width * imageHeight / imageBounds.height; - gc.drawImage(image, - imageBounds.x, imageBounds.y, imageBounds.width, imageBounds.height, - imageX, imageY, imageWidth, imageHeight); - xDraw += imageWidth + INTERNAL_SPACING; - } - } - // draw Text - int textWidth = x + width - xDraw - RIGHT_MARGIN; - if (parent.showUnselectedClose && (parent.showClose || showClose)) { - textWidth -= closeRect.width + INTERNAL_SPACING; - } - if (textWidth > 0) { - Font gcFont = gc.getFont(); - gc.setFont(font == null ? parent.getFont() : font); - if (shortenedText == null || shortenedTextWidth != textWidth) { - shortenedText = shortenText(gc, getText(), textWidth); - shortenedTextWidth = textWidth; - } - Point extent = gc.textExtent(shortenedText, FLAGS); - int textY = y + (height - extent.y) / 2; - textY += parent.onBottom ? -1 : 1; - gc.setForeground(parent.getForeground()); - gc.drawText(shortenedText, xDraw, textY, FLAGS); - gc.setFont(gcFont); - } - // draw close - if (parent.showUnselectedClose && (parent.showClose || showClose)) drawClose(gc); -} -/** - * Returns a rectangle describing the receiver's size and location - * relative to its parent. - * - * @return the receiver's bounding column rectangle - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public Rectangle getBounds () { - //checkWidget(); - int w = width; - if (!parent.simple && !parent.single && parent.indexOf(this) == parent.selectedIndex) w += parent.curveWidth - parent.curveIndent; - return new Rectangle(x, y, w, height); -} -/** -* Gets the control that is displayed in the content area of the tab item. -* -* @return the control -* -* @exception SWTException
      -*
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • -*
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • -*
    -*/ -public Control getControl () { - checkWidget(); - return control; -} -/** - * Get the image displayed in the tab if the tab is disabled. - * - * @return the disabled image or null - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @deprecated the disabled image is not used - */ -public Image getDisabledImage(){ - checkWidget(); - return disabledImage; -} -/** - * Returns the font that the receiver will use to paint textual information. - * - * @return the receiver's font - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public Font getFont() { - checkWidget(); - if (font != null) return font; - return parent.getFont(); -} -/** - * Returns the receiver's parent, which must be a CTabFolder. - * - * @return the receiver's parent - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public CTabFolder getParent () { - //checkWidget(); - return parent; -} -/** - * Returns true to indicate that the receiver's close button should be shown. - * Otherwise return false. The initial value is defined by the style (SWT.CLOSE) - * that was used to create the receiver. - * - * @return true if the close button should be shown - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.4 - */ -public boolean getShowClose() { - checkWidget(); - return showClose; -} -/** - * Returns the receiver's tool tip text, or null if it has - * not been set. - * - * @return the receiver's tool tip text - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public String getToolTipText () { - checkWidget(); - if (toolTipText == null && shortenedText != null) { - String text = getText(); - if (!shortenedText.equals(text)) return text; - } - return toolTipText; -} -/** -* Returns true if the item will be rendered in the visible area of the CTabFolder. Returns false otherwise. -* -* @return true if the item will be rendered in the visible area of the CTabFolder. Returns false otherwise. -* -* @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * -* @since 3.0 -*/ -public boolean isShowing () { - checkWidget(); - return showing; -} -void onPaint(GC gc, boolean isSelected) { - if (width == 0 || height == 0) return; - if (isSelected) { - drawSelected(gc); - } else { - drawUnselected(gc); - } -} -int preferredHeight(GC gc) { - Image image = getImage(); - int h = (image == null) ? 0 : image.getBounds().height; - String text = getText(); - if (font == null) { - h = Math.max(h, gc.textExtent(text, FLAGS).y); - } else { - Font gcFont = gc.getFont(); - gc.setFont(font); - h = Math.max(h, gc.textExtent(text, FLAGS).y); - gc.setFont(gcFont); - } - return h + TOP_MARGIN + BOTTOM_MARGIN; -} -int preferredWidth(GC gc, boolean isSelected, boolean minimum) { - // NOTE: preferred width does not include the "dead space" caused - // by the curve. - if (isDisposed()) return 0; - int w = 0; - Image image = getImage(); - if (image != null && (isSelected || parent.showUnselectedImage)) { - w += image.getBounds().width; - } - String text = null; - if (minimum) { - int minChars = parent.minChars; - text = minChars == 0 ? null : getText(); - if (text != null && text.length() > minChars) { - if (useEllipses()) { - int end = minChars < ELLIPSIS.length() + 1 ? minChars : minChars - ELLIPSIS.length(); - text = text.substring(0, end); - if (minChars > ELLIPSIS.length() + 1) text += ELLIPSIS; - } else { - int end = minChars; - text = text.substring(0, end); - } - } - } else { - text = getText(); - } - if (text != null) { - if (w > 0) w += INTERNAL_SPACING; - if (font == null) { - w += gc.textExtent(text, FLAGS).x; - } else { - Font gcFont = gc.getFont(); - gc.setFont(font); - w += gc.textExtent(text, FLAGS).x; - gc.setFont(gcFont); - } - } - if (parent.showClose || showClose) { - if (isSelected || parent.showUnselectedClose) { - if (w > 0) w += INTERNAL_SPACING; - w += CTabFolder.BUTTON_SIZE; - } - } - return w + LEFT_MARGIN + RIGHT_MARGIN; -} -/** - * Sets the control that is used to fill the client area of - * the tab folder when the user selects the tab item. - * - * @param control the new control (or null) - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT - if the control has been disposed
    • - *
    • ERROR_INVALID_PARENT - if the control is not in the same widget tree
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setControl (Control control) { - checkWidget(); - if (control != null) { - if (control.isDisposed()) SWT.error (SWT.ERROR_INVALID_ARGUMENT); - if (control.getParent() != parent) SWT.error (SWT.ERROR_INVALID_PARENT); - } - if (this.control != null && !this.control.isDisposed()) { - this.control.setVisible(false); - } - this.control = control; - if (this.control != null) { - int index = parent.indexOf (this); - if (index == parent.getSelectionIndex ()){ - this.control.setBounds(parent.getClientArea ()); - this.control.setVisible(true); - } else { - this.control.setVisible(false); - } - } -} -/** - * Sets the image that is displayed if the tab item is disabled. - * Null will clear the image. - * - * @param image the image to be displayed when the item is disabled or null - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @deprecated This image is not used - */ -public void setDisabledImage (Image image) { - checkWidget(); - if (image != null && image.isDisposed ()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - this.disabledImage = image; -} -/** - * Sets the font that the receiver will use to paint textual information - * for this item to the font specified by the argument, or to the default font - * for that kind of control if the argument is null. - * - * @param font the new font (or null) - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT - if the argument has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public void setFont (Font font){ - checkWidget(); - if (font != null && font.isDisposed ()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (font == null && this.font == null) return; - if (font != null && font.equals(this.font)) return; - this.font = font; - if (!parent.updateTabHeight(false)) { - parent.updateItems(); - parent.redrawTabs(); - } -} -public void setImage (Image image) { - checkWidget(); - if (image != null && image.isDisposed ()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - Image oldImage = getImage(); - if (image == null && oldImage == null) return; - if (image != null && image.equals(oldImage)) return; - super.setImage(image); - if (!parent.updateTabHeight(false)) { - // If image is the same size as before, - // redraw only the image - if (oldImage != null && image != null) { - Rectangle oldBounds = oldImage.getBounds(); - Rectangle bounds = image.getBounds(); - if (bounds.width == oldBounds.width && bounds.height == oldBounds.height) { - if (showing) { - boolean selected = parent.indexOf(this) == parent.selectedIndex; - if (selected || parent.showUnselectedImage) { - int imageX = x + LEFT_MARGIN, maxImageWidth; - if (selected) { - if (parent.single && (parent.showClose || showClose)) imageX += CTabFolder.BUTTON_SIZE; - int rightEdge = Math.min (x + width, parent.getRightItemEdge()); - maxImageWidth = rightEdge - imageX - RIGHT_MARGIN; - if (!parent.single && closeRect.width > 0) maxImageWidth -= closeRect.width + INTERNAL_SPACING; - } else { - maxImageWidth = x + width - imageX - RIGHT_MARGIN; - if (parent.showUnselectedClose && (parent.showClose || showClose)) { - maxImageWidth -= closeRect.width + INTERNAL_SPACING; - } - } - if (bounds.width < maxImageWidth) { - int imageY = y + (height - bounds.height) / 2 + (parent.onBottom ? -1 : 1); - parent.redraw(imageX, imageY, bounds.width, bounds.height, false); - } - } - } - return; - } - } - parent.updateItems(); - parent.redrawTabs(); - } -} -/** - * Sets to true to indicate that the receiver's close button should be shown. - * If the parent (CTabFolder) was created with SWT.CLOSE style, changing this value has - * no effect. - * - * @param close the new state of the close button - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.4 - */ -public void setShowClose(boolean close) { - checkWidget(); - if (showClose == close) return; - showClose = close; - parent.updateItems(); - parent.redrawTabs(); -} -public void setText (String string) { - checkWidget(); - if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - if (string.equals(getText())) return; - super.setText(string); - shortenedText = null; - shortenedTextWidth = 0; - if (!parent.updateTabHeight(false)) { - parent.updateItems(); - parent.redrawTabs(); - } -} -/** - * Sets the receiver's tool tip text to the argument, which - * may be null indicating that the default tool tip for the - * control will be shown. For a control that has a default - * tool tip, such as the Tree control on Windows, setting - * the tool tip text to an empty string replaces the default, - * causing no tool tip text to be shown. - * - * @param string the new tool tip text (or null) - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setToolTipText (String string) { - checkWidget(); - toolTipText = string; -} - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CaretEvent.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CaretEvent.java deleted file mode 100644 index 4c1b1d6571..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CaretEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 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.swt.custom; - - -import org.eclipse.swt.events.*; - -/** - * This event is sent when the caret offset changes. - * - * @see Sample code and further information - * - * @since 3.5 - */ -public class CaretEvent extends TypedEvent { - - /** - * caret offset - */ - public int caretOffset; - - static final long serialVersionUID = 3257846571587545489L; - -CaretEvent(StyledTextEvent e) { - super(e); - caretOffset = e.end; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CaretListener.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CaretListener.java deleted file mode 100644 index 7423d26404..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CaretListener.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 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.swt.custom; - -import org.eclipse.swt.internal.SWTEventListener; - -/** - * This listener interface may be implemented in order to receive - * CaretEvents. - * - * @see CaretEvent - * - * @since 3.5 - */ -public interface CaretListener extends SWTEventListener { - -/** - * This method is called after the caret offset is changed. - * - * The following event fields are used:
      - *
    • event.caretOffset the new caret offset (input)
    • - *
    - * - * @param event the given event - * - * @see CaretEvent - */ -public void caretMoved(CaretEvent event); - -} - diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ControlEditor.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ControlEditor.java deleted file mode 100755 index 9e7de3ee9e..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ControlEditor.java +++ /dev/null @@ -1,255 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** -* -* A ControlEditor is a manager for a Control that appears above a composite and tracks with the -* moving and resizing of that composite. It can be used to display one control above -* another control. This could be used when editing a control that does not have editing -* capabilities by using a text editor or for launching a dialog by placing a button -* above a control. -* -*

    Here is an example of using a ControlEditor: -* -*

    -* Canvas canvas = new Canvas(shell, SWT.BORDER);
    -* canvas.setBounds(10, 10, 300, 300);	
    -* Color color = new Color(null, 255, 0, 0);
    -* canvas.setBackground(color);
    -* ControlEditor editor = new ControlEditor (canvas);
    -* // The editor will be a button in the bottom right corner of the canvas.
    -* // When selected, it will launch a Color dialog that will change the background 
    -* // of the canvas.
    -* Button button = new Button(canvas, SWT.PUSH);
    -* button.setText("Select Color...");
    -* button.addSelectionListener (new SelectionAdapter() {
    -* 	public void widgetSelected(SelectionEvent e) {
    -* 		ColorDialog dialog = new ColorDialog(shell);
    -* 		dialog.open();
    -* 		RGB rgb = dialog.getRGB();
    -* 		if (rgb != null) {
    -* 			if (color != null) color.dispose();
    -* 			color = new Color(null, rgb);
    -* 			canvas.setBackground(color);
    -* 		}
    -* 		
    -* 	}
    -* });
    -*
    -* editor.horizontalAlignment = SWT.RIGHT;
    -* editor.verticalAlignment = SWT.BOTTOM;
    -* editor.grabHorizontal = false;
    -* editor.grabVertical = false;
    -* Point size = button.computeSize(SWT.DEFAULT, SWT.DEFAULT);
    -* editor.minimumWidth = size.x;
    -* editor.minimumHeight = size.y;
    -* editor.setEditor (button);
    -* 
    -* -* @see Sample code and further information -*/ -public class ControlEditor { - - /** - * Specifies how the editor should be aligned relative to the control. Allowed values - * are SWT.LEFT, SWT.RIGHT and SWT.CENTER. The default value is SWT.CENTER. - */ - public int horizontalAlignment = SWT.CENTER; - - /** - * Specifies whether the editor should be sized to use the entire width of the control. - * True means resize the editor to the same width as the cell. False means do not adjust - * the width of the editor. The default value is false. - */ - public boolean grabHorizontal = false; - - /** - * Specifies the minimum width the editor can have. This is used in association with - * a true value of grabHorizontal. If the cell becomes smaller than the minimumWidth, the - * editor will not made smaller than the minimum width value. The default value is 0. - */ - public int minimumWidth = 0; - - /** - * Specifies how the editor should be aligned relative to the control. Allowed values - * are SWT.TOP, SWT.BOTTOM and SWT.CENTER. The default value is SWT.CENTER. - */ - public int verticalAlignment = SWT.CENTER; - - /** - * Specifies whether the editor should be sized to use the entire height of the control. - * True means resize the editor to the same height as the underlying control. False means do not adjust - * the height of the editor. The default value is false. - */ - public boolean grabVertical = false; - - /** - * Specifies the minimum height the editor can have. This is used in association with - * a true value of grabVertical. If the control becomes smaller than the minimumHeight, the - * editor will not made smaller than the minimum height value. The default value is 0. - */ - public int minimumHeight = 0; - - Composite parent; - Control editor; - private boolean hadFocus; - private Listener controlListener; - private Listener scrollbarListener; - - private final static int [] EVENTS = {SWT.KeyDown, SWT.KeyUp, SWT.MouseDown, SWT.MouseUp, SWT.Resize}; -/** -* Creates a ControlEditor for the specified Composite. -* -* @param parent the Composite above which this editor will be displayed -* -*/ -public ControlEditor (Composite parent) { - this.parent = parent; - - controlListener = new Listener() { - public void handleEvent(Event e) { - layout (); - } - }; - for (int i=0; inot disposed. - */ -public void dispose () { - if (parent != null && !parent.isDisposed()) { - for (int i=0; iNote: The Control provided as the editor must be created with its parent -* being the Composite specified in the ControlEditor constructor. -* -* @param editor the Control that is displayed above the composite being edited -*/ -public void setEditor (Control editor) { - - if (editor == null) { - // this is the case where the caller is setting the editor to be blank - // set all the values accordingly - this.editor = null; - return; - } - - this.editor = editor; - layout(); - if (this.editor == null || this.editor.isDisposed()) return; - editor.setVisible(true); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/DefaultContent.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/DefaultContent.java deleted file mode 100755 index cd00023a27..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/DefaultContent.java +++ /dev/null @@ -1,881 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.internal.Compatibility; -import org.eclipse.swt.widgets.*; -import java.util.Vector; - -class DefaultContent implements StyledTextContent { - private final static String LineDelimiter = System.getProperty("line.separator"); - - Vector textListeners = new Vector(); // stores text listeners for event sending - char[] textStore = new char[0]; // stores the actual text - int gapStart = -1; // the character position start of the gap - int gapEnd = -1; // the character position after the end of the gap - int gapLine = -1; // the line on which the gap exists, the gap will always be associated with one line - int highWatermark = 300; - int lowWatermark = 50; - - int[][] lines = new int[50][2]; // array of character positions and lengths representing the lines of text - int lineCount = 0; // the number of lines of text - int expandExp = 1; // the expansion exponent, used to increase the lines array exponentially - int replaceExpandExp = 1; // the expansion exponent, used to increase the lines array exponentially - -/** - * Creates a new DefaultContent and initializes it. A StyledTextContent will always have - * at least one empty line. - */ -DefaultContent() { - super(); - setText(""); -} -/** - * Adds a line to the end of the line indexes array. Increases the size of the array if necessary. - * lineCount is updated to reflect the new entry. - *

    - * - * @param start the start of the line - * @param length the length of the line - */ -void addLineIndex(int start, int length) { - int size = lines.length; - if (lineCount == size) { - // expand the lines by powers of 2 - int[][] newLines = new int[size+Compatibility.pow2(expandExp)][2]; - System.arraycopy(lines, 0, newLines, 0, size); - lines = newLines; - expandExp++; - } - int[] range = new int[] {start, length}; - lines[lineCount] = range; - lineCount++; -} -/** - * Adds a line index to the end of linesArray. Increases the - * size of the array if necessary and returns a new array. - *

    - * - * @param start the start of the line - * @param length the length of the line - * @param linesArray the array to which to add the line index - * @param count the position at which to add the line - * @return a new array of line indexes - */ -int[][] addLineIndex(int start, int length, int[][] linesArray, int count) { - int size = linesArray.length; - int[][] newLines = linesArray; - if (count == size) { - newLines = new int[size+Compatibility.pow2(replaceExpandExp)][2]; - replaceExpandExp++; - System.arraycopy(linesArray, 0, newLines, 0, size); - } - int[] range = new int[] {start, length}; - newLines[count] = range; - return newLines; -} -/** - * Adds a TextChangeListener listening for - * TextChangingEvent and TextChangedEvent. A - * TextChangingEvent is sent before changes to the text occur. - * A TextChangedEvent is sent after changes to the text - * occurred. - *

    - * - * @param listener the listener - * @exception IllegalArgumentException

      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void addTextChangeListener(TextChangeListener listener) { - if (listener == null) error(SWT.ERROR_NULL_ARGUMENT); - StyledTextListener typedListener = new StyledTextListener(listener); - textListeners.addElement(typedListener); -} -/** - * Adjusts the gap to accommodate a text change that is occurring. - *

    - * - * @param position the position at which a change is occurring - * @param sizeHint the size of the change - * @param line the line where the gap will go - */ -void adjustGap(int position, int sizeHint, int line) { - if (position == gapStart) { - // text is being inserted at the gap position - int size = (gapEnd - gapStart) - sizeHint; - if (lowWatermark <= size && size <= highWatermark) - return; - } else if ((position + sizeHint == gapStart) && (sizeHint < 0)) { - // text is being deleted at the gap position - int size = (gapEnd - gapStart) - sizeHint; - if (lowWatermark <= size && size <= highWatermark) - return; - } - moveAndResizeGap(position, sizeHint, line); -} -/** - * Calculates the indexes of each line in the text store. Assumes no gap exists. - * Optimized to do less checking. - */ -void indexLines(){ - int start = 0; - lineCount = 0; - int textLength = textStore.length; - int i; - for (i = start; i < textLength; i++) { - char ch = textStore[i]; - if (ch == SWT.CR) { - // see if the next character is a LF - if (i + 1 < textLength) { - ch = textStore[i+1]; - if (ch == SWT.LF) { - i++; - } - } - addLineIndex(start, i - start + 1); - start = i + 1; - } else if (ch == SWT.LF) { - addLineIndex(start, i - start + 1); - start = i + 1; - } - } - addLineIndex(start, i - start); -} -/** - * Returns whether or not the given character is a line delimiter. Both CR and LF - * are valid line delimiters. - *

    - * - * @param ch the character to test - * @return true if ch is a delimiter, false otherwise - */ -boolean isDelimiter(char ch) { - if (ch == SWT.CR) return true; - if (ch == SWT.LF) return true; - return false; -} -/** - * Determine whether or not the replace operation is valid. DefaultContent will not allow - * the /r/n line delimiter to be split or partially deleted. - *

    - * - * @param start start offset of text to replace - * @param replaceLength start offset of text to replace - * @param newText start offset of text to replace - * @return a boolean specifying whether or not the replace operation is valid - */ -protected boolean isValidReplace(int start, int replaceLength, String newText){ - if (replaceLength == 0) { - // inserting text, see if the \r\n line delimiter is being split - if (start == 0) return true; - if (start == getCharCount()) return true; - char before = getTextRange(start - 1, 1).charAt(0); - if (before == '\r') { - char after = getTextRange(start, 1).charAt(0); - if (after == '\n') return false; - } - } else { - // deleting text, see if part of a \r\n line delimiter is being deleted - char startChar = getTextRange(start, 1).charAt(0); - if (startChar == '\n') { - // see if char before delete position is \r - if (start != 0) { - char before = getTextRange(start - 1, 1).charAt(0); - if (before == '\r') return false; - } - } - char endChar = getTextRange(start + replaceLength - 1, 1).charAt(0); - if (endChar == '\r') { - // see if char after delete position is \n - if (start + replaceLength != getCharCount()) { - char after = getTextRange(start + replaceLength, 1).charAt(0); - if (after == '\n') return false; - } - } - } - return true; -} -/** - * Calculates the indexes of each line of text in the given range. - *

    - * - * @param offset the logical start offset of the text lineate - * @param length the length of the text to lineate, includes gap - * @param numLines the number of lines to initially allocate for the line index array, - * passed in for efficiency (the exact number of lines may be known) - * @return a line indexes array where each line is identified by a start offset and - * a length - */ -int[][] indexLines(int offset, int length, int numLines){ - int[][] indexedLines = new int[numLines][2]; - int start = 0; - int lineCount = 0; - int i; - replaceExpandExp = 1; - for (i = start; i < length; i++) { - int location = i + offset; - if ((location >= gapStart) && (location < gapEnd)) { - // ignore the gap - } else { - char ch = textStore[location]; - if (ch == SWT.CR) { - // see if the next character is a LF - if (location+1 < textStore.length) { - ch = textStore[location+1]; - if (ch == SWT.LF) { - i++; - } - } - indexedLines = addLineIndex(start, i - start + 1, indexedLines, lineCount); - lineCount++; - start = i + 1; - } else if (ch == SWT.LF) { - indexedLines = addLineIndex(start, i - start + 1, indexedLines, lineCount); - lineCount++; - start = i + 1; - } - } - } - int[][] newLines = new int[lineCount+1][2]; - System.arraycopy(indexedLines, 0, newLines, 0, lineCount); - int[] range = new int[] {start, i - start}; - newLines[lineCount] = range; - return newLines; -} -/** - * Inserts text. - *

    - * - * @param position the position at which to insert the text - * @param text the text to insert - */ -void insert(int position, String text) { - if (text.length() == 0) return; - - int startLine = getLineAtOffset(position); - int change = text.length(); - boolean endInsert = position == getCharCount(); - adjustGap(position, change, startLine); - - // during an insert the gap will be adjusted to start at - // position and it will be associated with startline, the - // inserted text will be placed in the gap - int startLineOffset = getOffsetAtLine(startLine); - // at this point, startLineLength will include the start line - // and all of the newly inserted text - int startLineLength = getPhysicalLine(startLine).length(); - - if (change > 0) { - // shrink gap - gapStart += (change); - for (int i = 0; i < text.length(); i++) { - textStore[position + i]= text.charAt(i); - } - } - - // figure out the number of new lines that have been inserted - int [][] newLines = indexLines(startLineOffset, startLineLength, 10); - // only insert an empty line if it is the last line in the text - int numNewLines = newLines.length - 1; - if (newLines[numNewLines][1] == 0) { - // last inserted line is a new line - if (endInsert) { - // insert happening at end of the text, leave numNewLines as - // is since the last new line will not be concatenated with another - // line - numNewLines += 1; - } else { - numNewLines -= 1; - } - } - - // make room for the new lines - expandLinesBy(numNewLines); - // shift down the lines after the replace line - for (int i = lineCount - 1; i > startLine; i--) { - lines[i + numNewLines]=lines[i]; - } - // insert the new lines - for (int i = 0; i < numNewLines; i++) { - newLines[i][0] += startLineOffset; - lines[startLine + i]=newLines[i]; - } - // update the last inserted line - if (numNewLines < newLines.length) { - newLines[numNewLines][0] += startLineOffset; - lines[startLine + numNewLines] = newLines[numNewLines]; - } - - lineCount += numNewLines; - gapLine = getLineAtPhysicalOffset(gapStart); -} -/** - * Moves the gap and adjusts its size in anticipation of a text change. - * The gap is resized to actual size + the specified size and moved to the given - * position. - *

    - * - * @param position the position at which a change is occurring - * @param size the size of the change - * @param newGapLine the line where the gap should be put - */ -void moveAndResizeGap(int position, int size, int newGapLine) { - char[] content = null; - int oldSize = gapEnd - gapStart; - int newSize; - if (size > 0) { - newSize = highWatermark + size; - } else { - newSize = lowWatermark - size; - } - // remove the old gap from the lines information - if (gapExists()) { - // adjust the line length - lines[gapLine][1] = lines[gapLine][1] - oldSize; - // adjust the offsets of the lines after the gapLine - for (int i = gapLine + 1; i < lineCount; i++) { - lines[i][0] = lines[i][0] - oldSize; - } - } - - if (newSize < 0) { - if (oldSize > 0) { - // removing the gap - content = new char[textStore.length - oldSize]; - System.arraycopy(textStore, 0, content, 0, gapStart); - System.arraycopy(textStore, gapEnd, content, gapStart, content.length - gapStart); - textStore = content; - } - gapStart = gapEnd = position; - return; - } - content = new char[textStore.length + (newSize - oldSize)]; - int newGapStart = position; - int newGapEnd = newGapStart + newSize; - if (oldSize == 0) { - System.arraycopy(textStore, 0, content, 0, newGapStart); - System.arraycopy(textStore, newGapStart, content, newGapEnd, content.length - newGapEnd); - } else if (newGapStart < gapStart) { - int delta = gapStart - newGapStart; - System.arraycopy(textStore, 0, content, 0, newGapStart); - System.arraycopy(textStore, newGapStart, content, newGapEnd, delta); - System.arraycopy(textStore, gapEnd, content, newGapEnd + delta, textStore.length - gapEnd); - } else { - int delta = newGapStart - gapStart; - System.arraycopy(textStore, 0, content, 0, gapStart); - System.arraycopy(textStore, gapEnd, content, gapStart, delta); - System.arraycopy(textStore, gapEnd + delta, content, newGapEnd, content.length - newGapEnd); - } - textStore = content; - gapStart = newGapStart; - gapEnd = newGapEnd; - - // add the new gap to the lines information - if (gapExists()) { - gapLine = newGapLine; - // adjust the line length - int gapLength = gapEnd - gapStart; - lines[gapLine][1] = lines[gapLine][1] + (gapLength); - // adjust the offsets of the lines after the gapLine - for (int i = gapLine + 1; i < lineCount; i++) { - lines[i][0] = lines[i][0] + gapLength; - } - } -} -/** - * Returns the number of lines that are in the specified text. - *

    - * - * @param startOffset the start of the text to lineate - * @param length the length of the text to lineate - * @return number of lines - */ -int lineCount(int startOffset, int length){ - if (length == 0) { - return 0; - } - int lineCount = 0; - int count = 0; - int i = startOffset; - if (i >= gapStart) { - i += gapEnd - gapStart; - } - while (count < length) { - if ((i >= gapStart) && (i < gapEnd)) { - // ignore the gap - } else { - char ch = textStore[i]; - if (ch == SWT.CR) { - // see if the next character is a LF - if (i + 1 < textStore.length) { - ch = textStore[i+1]; - if (ch == SWT.LF) { - i++; - count++; - } - } - lineCount++; - } else if (ch == SWT.LF) { - lineCount++; - } - count++; - } - i++; - } - return lineCount; -} -/** - * Returns the number of lines that are in the specified text. - *

    - * - * @param text the text to lineate - * @return number of lines in the text - */ -int lineCount(String text){ - int lineCount = 0; - int length = text.length(); - for (int i = 0; i < length; i++) { - char ch = text.charAt(i); - if (ch == SWT.CR) { - if (i + 1 < length && text.charAt(i + 1) == SWT.LF) { - i++; - } - lineCount++; - } else if (ch == SWT.LF) { - lineCount++; - } - } - return lineCount; -} -/** - * @return the logical length of the text store - */ -public int getCharCount() { - int length = gapEnd - gapStart; - return (textStore.length - length); -} -/** - * Returns the line at index without delimiters. - *

    - * - * @param index the index of the line to return - * @return the logical line text (i.e., without the gap) - * @exception IllegalArgumentException

      - *
    • ERROR_INVALID_ARGUMENT when index is out of range
    • - *
    - */ -public String getLine(int index) { - if ((index >= lineCount) || (index < 0)) error(SWT.ERROR_INVALID_ARGUMENT); - int start = lines[index][0]; - int length = lines[index][1]; - int end = start + length - 1; - if (!gapExists() || (end < gapStart) || (start >= gapEnd)) { - // line is before or after the gap - while ((length - 1 >= 0) && isDelimiter(textStore[start+length-1])) { - length--; - } - return new String(textStore, start, length); - } else { - // gap is in the specified range, strip out the gap - StringBuffer buf = new StringBuffer(); - int gapLength = gapEnd - gapStart; - buf.append(textStore, start, gapStart - start); - buf.append(textStore, gapEnd, length - gapLength - (gapStart - start)); - length = buf.length(); - while ((length - 1 >=0) && isDelimiter(buf.charAt(length - 1))) { - length--; - } - return buf.toString().substring(0, length); - } -} -/** - * Returns the line delimiter that should be used by the StyledText - * widget when inserting new lines. This delimiter may be different than the - * delimiter that is used by the StyledTextContent interface. - *

    - * - * @return the platform line delimiter as specified in the line.separator - * system property. - */ -public String getLineDelimiter() { - return LineDelimiter; -} -/** - * Returns the line at the given index with delimiters. - *

    - * @param index the index of the line to return - * @return the logical line text (i.e., without the gap) with delimiters - */ -String getFullLine(int index) { - int start = lines[index][0]; - int length = lines[index][1]; - int end = start + length - 1; - if (!gapExists() || (end < gapStart) || (start >= gapEnd)) { - // line is before or after the gap - return new String(textStore, start, length); - } else { - // gap is in the specified range, strip out the gap - StringBuffer buffer = new StringBuffer(); - int gapLength = gapEnd - gapStart; - buffer.append(textStore, start, gapStart - start); - buffer.append(textStore, gapEnd, length - gapLength - (gapStart - start)); - return buffer.toString(); - } -} -/** - * Returns the physical line at the given index (i.e., with delimiters and the gap). - *

    - * - * @param index the line index - * @return the physical line - */ -String getPhysicalLine(int index) { - int start = lines[index][0]; - int length = lines[index][1]; - return getPhysicalText(start, length); -} -/** - * @return the number of lines in the text store - */ -public int getLineCount(){ - return lineCount; -} -/** - * Returns the line at the given offset. - *

    - * - * @param charPosition logical character offset (i.e., does not include gap) - * @return the line index - * @exception IllegalArgumentException

      - *
    • ERROR_INVALID_ARGUMENT when charPosition is out of range
    • - *
    - */ -public int getLineAtOffset(int charPosition){ - if ((charPosition > getCharCount()) || (charPosition < 0)) error(SWT.ERROR_INVALID_ARGUMENT); - int position; - if (charPosition < gapStart) { - // position is before the gap - position = charPosition; - } else { - // position includes the gap - position = charPosition + (gapEnd - gapStart); - } - - // if last line and the line is not empty you can ask for - // a position that doesn't exist (the one to the right of the - // last character) - for inserting - if (lineCount > 0) { - int lastLine = lineCount - 1; - if (position == lines[lastLine][0] + lines[lastLine][1]) - return lastLine; - } - - int high = lineCount; - int low = -1; - int index = lineCount; - while (high - low > 1) { - index = (high + low) / 2; - int lineStart = lines[index][0]; - int lineEnd = lineStart + lines[index][1] - 1; - if (position <= lineStart) { - high = index; - } else if (position <= lineEnd) { - high = index; - break; - } else { - low = index; - } - } - return high; -} -/** - * Returns the line index at the given physical offset. - *

    - * - * @param position physical character offset (i.e., includes gap) - * @return the line index - */ -int getLineAtPhysicalOffset(int position){ - int high = lineCount; - int low = -1; - int index = lineCount; - while (high - low > 1) { - index = (high + low) / 2; - int lineStart = lines[index][0]; - int lineEnd = lineStart + lines[index][1] - 1; - if (position <= lineStart) { - high = index; - } else if (position <= lineEnd) { - high = index; - break; - } else { - low = index; - } - } - return high; -} -/** - * Returns the logical offset of the given line. - *

    - * - * @param lineIndex index of line - * @return the logical starting offset of the line. When there are not any lines, - * getOffsetAtLine(0) is a valid call that should answer 0. - * @exception IllegalArgumentException

      - *
    • ERROR_INVALID_ARGUMENT when lineIndex is out of range
    • - *
    - */ -public int getOffsetAtLine(int lineIndex) { - if (lineIndex == 0) return 0; - if ((lineIndex >= lineCount) || (lineIndex < 0)) error(SWT.ERROR_INVALID_ARGUMENT); - int start = lines[lineIndex][0]; - if (start > gapEnd) { - return start - (gapEnd - gapStart); - } else { - return start; - } -} -/** - * Increases the line indexes array to accommodate more lines. - *

    - * - * @param numLines the number to increase the array by - */ -void expandLinesBy(int numLines) { - int size = lines.length; - if (size - lineCount >= numLines) { - return; - } - int[][] newLines = new int[size+Math.max(10, numLines)][2]; - System.arraycopy(lines, 0, newLines, 0, size); - lines = newLines; -} -/** - * Reports an SWT error. - *

    - * - * @param code the error code - */ -void error (int code) { - SWT.error(code); -} -/** - * Returns whether or not a gap exists in the text store. - *

    - * - * @return true if gap exists, false otherwise - */ -boolean gapExists() { - return gapStart != gapEnd; -} -/** - * Returns a string representing the continuous content of - * the text store. - *

    - * - * @param start the physical start offset of the text to return - * @param length the physical length of the text to return - * @return the text - */ -String getPhysicalText(int start, int length) { - return new String(textStore, start, length); -} -/** - * Returns a string representing the logical content of - * the text store (i.e., gap stripped out). - *

    - * - * @param start the logical start offset of the text to return - * @param length the logical length of the text to return - * @return the text - */ -public String getTextRange(int start, int length) { - if (textStore == null) - return ""; - if (length == 0) - return ""; - int end= start + length; - if (!gapExists() || (end < gapStart)) - return new String(textStore, start, length); - if (gapStart < start) { - int gapLength= gapEnd - gapStart; - return new String(textStore, start + gapLength , length); - } - StringBuffer buf = new StringBuffer(); - buf.append(textStore, start, gapStart - start); - buf.append(textStore, gapEnd, end - gapStart); - return buf.toString(); -} -/** - * Removes the specified TextChangeListener. - *

    - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException

      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void removeTextChangeListener(TextChangeListener listener){ - if (listener == null) error(SWT.ERROR_NULL_ARGUMENT); - for (int i = 0; i < textListeners.size(); i++) { - TypedListener typedListener = (TypedListener) textListeners.elementAt(i); - if (typedListener.getEventListener () == listener) { - textListeners.removeElementAt(i); - break; - } - } -} -/** - * Replaces the text with newText starting at position start - * for a length of replaceLength. Notifies the appropriate listeners. - *

    - * - * When sending the TextChangingEvent, newLineCount is the number of - * lines that are going to be inserted and replaceLineCount is - * the number of lines that are going to be deleted, based on the change - * that occurs visually. For example: - *

      - *
    • (replaceText,newText) ==> (replaceLineCount,newLineCount) - *
    • ("","\n") ==> (0,1) - *
    • ("\n\n","a") ==> (2,0) - *
    - *

    - * - * @param start start offset of text to replace - * @param replaceLength start offset of text to replace - * @param newText start offset of text to replace - * - * @exception SWTException
      - *
    • ERROR_INVALID_ARGUMENT when the text change results in a multi byte - * line delimiter being split or partially deleted. Splitting a line - * delimiter by inserting text between the CR and LF characters of the - * \r\n delimiter or deleting part of this line delimiter is not supported
    • - *
    - */ -public void replaceTextRange(int start, int replaceLength, String newText){ - // check for invalid replace operations - if (!isValidReplace(start, replaceLength, newText)) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - - // inform listeners - StyledTextEvent event = new StyledTextEvent(this); - event.type = StyledText.TextChanging; - event.start = start; - event.replaceLineCount = lineCount(start, replaceLength); - event.text = newText; - event.newLineCount = lineCount(newText); - event.replaceCharCount = replaceLength; - event.newCharCount = newText.length(); - sendTextEvent(event); - - // first delete the text to be replaced - delete(start, replaceLength, event.replaceLineCount + 1); - // then insert the new text - insert(start, newText); - // inform listeners - event = new StyledTextEvent(this); - event.type = StyledText.TextChanged; - sendTextEvent(event); -} -/** - * Sends the text listeners the TextChanged event. - */ -void sendTextEvent(StyledTextEvent event) { - for (int i = 0; i < textListeners.size(); i++) { - ((StyledTextListener)textListeners.elementAt(i)).handleEvent(event); - } -} -/** - * Sets the content to text and removes the gap since there are no sensible predictions - * about where the next change will occur. - *

    - * - * @param text the text - */ -public void setText (String text){ - textStore = text.toCharArray(); - gapStart = -1; - gapEnd = -1; - expandExp = 1; - indexLines(); - StyledTextEvent event = new StyledTextEvent(this); - event.type = StyledText.TextSet; - event.text = ""; - sendTextEvent(event); -} -/** - * Deletes text. - *

    - * @param position the position at which the text to delete starts - * @param length the length of the text to delete - * @param numLines the number of lines that are being deleted - */ -void delete(int position, int length, int numLines) { - if (length == 0) return; - - int startLine = getLineAtOffset(position); - int startLineOffset = getOffsetAtLine(startLine); - int endLine = getLineAtOffset(position + length); - - String endText = ""; - boolean splittingDelimiter = false; - if (position + length < getCharCount()) { - endText = getTextRange(position + length - 1, 2); - if ((endText.charAt(0) == SWT.CR) && (endText.charAt(1) == SWT.LF)) { - splittingDelimiter = true; - } - } - - adjustGap(position + length, -length, startLine); - int [][] oldLines = indexLines(position, length + (gapEnd - gapStart), numLines); - - // enlarge the gap - the gap can be enlarged either to the - // right or left - if (position + length == gapStart) { - gapStart -= length; - } else { - gapEnd += length; - } - - // figure out the length of the new concatenated line, do so by - // finding the first line delimiter after position - int j = position; - boolean eol = false; - while (j < textStore.length && !eol) { - if (j < gapStart || j >= gapEnd) { - char ch = textStore[j]; - if (isDelimiter(ch)) { - if (j + 1 < textStore.length) { - if (ch == SWT.CR && (textStore[j+1] == SWT.LF)) { - j++; - } - } - eol = true; - } - } - j++; - } - // update the line where the deletion started - lines[startLine][1] = (position - startLineOffset) + (j - position); - // figure out the number of lines that have been deleted - int numOldLines = oldLines.length - 1; - if (splittingDelimiter) numOldLines -= 1; - // shift up the lines after the last deleted line, no need to update - // the offset or length of the lines - for (int i = endLine + 1; i < lineCount; i++) { - lines[i - numOldLines] = lines[i]; - } - lineCount -= numOldLines; - gapLine = getLineAtPhysicalOffset(gapStart); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ExtendedModifyEvent.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ExtendedModifyEvent.java deleted file mode 100755 index 3d429291df..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ExtendedModifyEvent.java +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.events.*; - -/** - * This event is sent after a text change occurs. - * - * @see Sample code and further information - */ -public final class ExtendedModifyEvent extends TypedEvent { - /** start offset of the new text */ - public int start; - /** length of the new text */ - public int length; - /** replaced text or empty string if no text was replaced */ - public String replacedText; - - static final long serialVersionUID = 3258696507027830832L; - -/** - * Constructs a new instance of this class based on the - * information in the given event. - * - * @param e the event containing the information - */ -public ExtendedModifyEvent(StyledTextEvent e) { - super(e); - start = e.start; - length = e.end - e.start; - replacedText = e.text; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ExtendedModifyListener.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ExtendedModifyListener.java deleted file mode 100755 index 86ca395bc2..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ExtendedModifyListener.java +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.internal.SWTEventListener; - -/** - * Classes which implement this interface provide a method - * that deals with the event that is generated when text - * is modified. - * - * @see ExtendedModifyEvent - * @see Sample code and further information - */ -public interface ExtendedModifyListener extends SWTEventListener { - -/** - * This method is called after a text change occurs. - *

    - * The following event fields are used:

      - *
    • event.start the start offset of the new text (input)
    • - *
    • event.length the length of the new text (input)
    • - *
    • event.replacedText the replaced text (input)
    • - *
    - * - * @param event the given event - * @see ExtendedModifyEvent - */ -public void modifyText(ExtendedModifyEvent event); -} - - diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineBackgroundEvent.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineBackgroundEvent.java deleted file mode 100755 index 2337737299..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineBackgroundEvent.java +++ /dev/null @@ -1,54 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; - -/** - * This event is sent when a line is about to be drawn. - * - * @see Sample code and further information - */ -public class LineBackgroundEvent extends TypedEvent { - - /** - * line start offset - */ - public int lineOffset; - - /** - * line text - */ - public String lineText; - - /** - * line background color - */ - public Color lineBackground; - - static final long serialVersionUID = 3978711687853324342L; - -/** - * Constructs a new instance of this class based on the - * information in the given event. - * - * @param e the event containing the information - */ -public LineBackgroundEvent(StyledTextEvent e) { - super(e); - lineOffset = e.detail; - lineText = e.text; - lineBackground = e.lineBackground; -} -} - - diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineBackgroundListener.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineBackgroundListener.java deleted file mode 100755 index ebfac4dd41..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineBackgroundListener.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.internal.SWTEventListener; - -/** - * Classes which implement this interface provide a method - * that can provide the background color for a line that - * is to be drawn. - * - * @see LineBackgroundEvent - * @see Sample code and further information - */ -public interface LineBackgroundListener extends SWTEventListener { - -/** - * This method is called when a line is about to be drawn in order to get its - * background color. - *

    - * The following event fields are used:

      - *
    • event.lineOffset line start offset (input)
    • - *
    • event.lineText line text (input)
    • - *
    • event.lineBackground line background color (output)
    • - *
    - * - * @param event the given event - * @see LineBackgroundEvent - */ -public void lineGetBackground(LineBackgroundEvent event); -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineStyleEvent.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineStyleEvent.java deleted file mode 100755 index 7b5e2b3956..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineStyleEvent.java +++ /dev/null @@ -1,103 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.events.*; - -/** - * This event is sent when a line is about to be drawn. - * - * @see Sample code and further information - */ -public class LineStyleEvent extends TypedEvent { - - /** - * line start offset (input) - */ - public int lineOffset; - - /** - * line text (input) - */ - public String lineText; - - /** - * line ranges (output) - * - * @since 3.2 - */ - public int[] ranges; - - /** - * line styles (output) - * - * Note: Because a StyleRange includes the start and length, the - * same instance cannot occur multiple times in the array of styles. - * If the same style attributes, such as font and color, occur in - * multiple StyleRanges, ranges can be used to share - * styles and reduce memory usage. - */ - public StyleRange[] styles; - - /** - * line alignment (input, output) - * - * @since 3.2 - */ - public int alignment; - - /** - * line indent (input, output) - * - * @since 3.2 - */ - public int indent; - - /** - * line justification (input, output) - * - * @since 3.2 - */ - public boolean justify; - - /** - * line bullet (output) - * @since 3.2 - */ - public Bullet bullet; - - /** - * line bullet index (output) - * @since 3.2 - */ - public int bulletIndex; - - static final long serialVersionUID = 3906081274027192884L; - -/** - * Constructs a new instance of this class based on the - * information in the given event. - * - * @param e the event containing the information - */ -public LineStyleEvent(StyledTextEvent e) { - super(e); - styles = e.styles; - ranges = e.ranges; - lineOffset = e.detail; - lineText = e.text; - alignment = e.alignment; - justify = e.justify; - indent = e.indent; - bullet = e.bullet; - bulletIndex = e.bulletIndex; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineStyleListener.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineStyleListener.java deleted file mode 100755 index a6acfda978..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/LineStyleListener.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.internal.SWTEventListener; - -/** - * Classes which implement this interface provide a method - * that can provide the style information for a line that - * is to be drawn. - * - * @see LineStyleEvent - * @see Sample code and further information - */ -public interface LineStyleListener extends SWTEventListener { - -/** - * This method is called when a line is about to be drawn in order to get the - * line's style information. - *

    - * The following event fields are used:

      - *
    • event.lineOffset line start offset (input)
    • - *
    • event.lineText line text (input)
    • - *
    • event.styles array of StyleRanges, need to be in order (output)
    • - *
    - * - * @param event the given event - * @see LineStyleEvent - */ -public void lineGetStyle(LineStyleEvent event); -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/MovementEvent.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/MovementEvent.java deleted file mode 100644 index 97d758dd2e..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/MovementEvent.java +++ /dev/null @@ -1,74 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.events.*; - -/** - * This event is sent when a new offset is required based on the current - * offset and a movement type. - * - * @see Sample code and further information - * - * @since 3.3 - */ -public class MovementEvent extends TypedEvent { - - /** - * line start offset (input) - */ - public int lineOffset; - - /** - * line text (input) - */ - public String lineText; - - /** - * the current offset (input) - */ - public int offset; - - /** - * the new offset (input, output) - */ - public int newOffset; - - /** - * the movement type (input) - * - * @see org.eclipse.swt.SWT#MOVEMENT_WORD - * @see org.eclipse.swt.SWT#MOVEMENT_WORD_END - * @see org.eclipse.swt.SWT#MOVEMENT_WORD_START - * @see org.eclipse.swt.SWT#MOVEMENT_CHAR - * @see org.eclipse.swt.SWT#MOVEMENT_CLUSTER - */ - public int movement; - - static final long serialVersionUID = 3978765487853324342L; - -/** - * Constructs a new instance of this class based on the - * information in the given event. - * - * @param e the event containing the information - */ -public MovementEvent(StyledTextEvent e) { - super(e); - lineOffset = e.detail; - lineText = e.text; - movement = e.count; - offset = e.start; - newOffset = e.end; -} -} - - diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/MovementListener.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/MovementListener.java deleted file mode 100644 index abc39e58d5..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/MovementListener.java +++ /dev/null @@ -1,67 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2007 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.swt.custom; - -import org.eclipse.swt.internal.SWTEventListener; - -/** - * This listener is invoked when a new offset is required based on the current - * offset and a movement type. - * - * @see org.eclipse.swt.SWT#MOVEMENT_WORD - * @see org.eclipse.swt.SWT#MOVEMENT_WORD_END - * @see org.eclipse.swt.SWT#MOVEMENT_WORD_START - * @see org.eclipse.swt.SWT#MOVEMENT_CHAR - * @see org.eclipse.swt.SWT#MOVEMENT_CLUSTER - * - * @since 3.3 - */ -public interface MovementListener extends SWTEventListener { -/** - * This method is called when a new offset is required based on the current - * offset and a movement type. - * - *

    - * The following event fields are used:

      - *
    • event.lineOffset line start offset (input)
    • - *
    • event.lineText line text (input)
    • - *
    • event.movement the movement type (input)
    • - *
    • event.offset the current offset (input)
    • - *
    • event.newOffset the new offset (input, output)
    • - *
    - * - * @param event the event - * - * @see MovementEvent - * @see StyledText#addWordMovementListener(MovementListener) - */ -public void getNextOffset (MovementEvent event); -/** - * This method is called when a new offset is required based on the current - * offset and a movement type. - * - *

    - * The following event fields are used:

      - *
    • event.lineOffset line start offset (input)
    • - *
    • event.lineText line text (input)
    • - *
    • event.movement the movement type (input)
    • - *
    • event.offset the current offset (input)
    • - *
    • event.newOffset the new offset (input, output)
    • - *
    - * - * @param event the event - * - * @see MovementEvent - * @see StyledText#addWordMovementListener(MovementListener) - */ -public void getPreviousOffset (MovementEvent event); - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/PaintObjectEvent.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/PaintObjectEvent.java deleted file mode 100644 index 3c6a3ca545..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/PaintObjectEvent.java +++ /dev/null @@ -1,84 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; - -/** - * This event is sent when an object needs to be drawn. - * - * @see Sample code and further information - * - * @since 3.2 - */ -public class PaintObjectEvent extends TypedEvent { - - /** - * the GC - */ - public GC gc; - - /** - * the x location - */ - public int x; - - /** - * the y location - */ - public int y; - - /** - * the line ascent - */ - public int ascent; - - /** - * the line descent - */ - public int descent; - - /** - * the StyleRange - */ - public StyleRange style; - - /** - * the Bullet - */ - public Bullet bullet; - - /** - * the bullet index - */ - public int bulletIndex; - - static final long serialVersionUID = 3906081274027192855L; - -/** - * Constructs a new instance of this class based on the - * information in the given event. - * - * @param e the event containing the information - */ -public PaintObjectEvent(StyledTextEvent e) { - super(e); - gc = e.gc; - x = e.x; - y = e.y; - ascent = e.ascent; - descent = e.descent; - style = e.style; - bullet = e.bullet; - bulletIndex = e.bulletIndex; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/PaintObjectListener.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/PaintObjectListener.java deleted file mode 100644 index fc8ac01b5b..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/PaintObjectListener.java +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 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.swt.custom; - - -import org.eclipse.swt.internal.SWTEventListener; -/** - * This listener is invoked when an object needs to be drawn. - * - * @since 3.2 - */ -public interface PaintObjectListener extends SWTEventListener { -/** - * This method is called when an object needs to be drawn. - * - *

    - * The following event fields are used:

      - *
    • event.x the x location (input)
    • - *
    • event.y the y location (input)
    • - *
    • event.ascent the line ascent (input)
    • - *
    • event.descent the line descent (input)
    • - *
    • event.gc the gc (input)
    • - *
    • event.style the style (input)
    • - *
    - * - * @param event the event - * - * @see PaintObjectEvent - * @see StyledText#addPaintObjectListener(PaintObjectListener) - */ -public void paintObject(PaintObjectEvent event); -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/PopupList.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/PopupList.java deleted file mode 100755 index c3bb6f073d..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/PopupList.java +++ /dev/null @@ -1,274 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** -* A PopupList is a list of selectable items that appears in its own shell positioned above -* its parent shell. It is used for selecting items when editing a Table cell (similar to the -* list that appears when you open a Combo box). -* -* The list will be positioned so that it does not run off the screen and the largest number of items -* are visible. It may appear above the current cursor location or below it depending how close you -* are to the edge of the screen. -* -* @see Sample code and further information -*/ -public class PopupList { - Shell shell; - List list; - int minimumWidth; -/** -* Creates a PopupList above the specified shell. -* -* @param parent a Shell control which will be the parent of the new instance (cannot be null) -*/ -public PopupList(Shell parent) { - this (parent, 0); -} -/** -* Creates a PopupList above the specified shell. -* -* @param parent a widget which will be the parent of the new instance (cannot be null) -* @param style the style of widget to construct -* -* @since 3.0 -*/ -public PopupList(Shell parent, int style) { - shell = new Shell(parent, checkStyle(style)); - - list = new List(shell, SWT.SINGLE | SWT.V_SCROLL); - - // close dialog if user selects outside of the shell - shell.addListener(SWT.Deactivate, new Listener() { - public void handleEvent(Event e){ - shell.setVisible (false); - } - }); - - // resize shell when list resizes - shell.addControlListener(new ControlListener() { - public void controlMoved(ControlEvent e){} - public void controlResized(ControlEvent e){ - Rectangle shellSize = shell.getClientArea(); - list.setSize(shellSize.width, shellSize.height); - } - }); - - // return list selection on Mouse Up or Carriage Return - list.addMouseListener(new MouseListener() { - public void mouseDoubleClick(MouseEvent e){} - public void mouseDown(MouseEvent e){} - public void mouseUp(MouseEvent e){ - shell.setVisible (false); - } - }); - list.addKeyListener(new KeyListener() { - public void keyReleased(KeyEvent e){} - public void keyPressed(KeyEvent e){ - if (e.character == '\r'){ - shell.setVisible (false); - } - } - }); - -} -private static int checkStyle (int style) { - int mask = SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT; - return style & mask; -} -/** -* Gets the widget font. -*

    -* @return the widget font -* -* @exception SWTException

      -*
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • -*
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • -*
    -*/ -public Font getFont () { - return list.getFont(); -} -/** -* Gets the items. -*

    -* This operation will fail if the items cannot -* be queried from the OS. -* -* @return the items in the widget -* -* @exception SWTException

      -*
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • -*
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • -*
    -*/ -public String[] getItems () { - return list.getItems(); -} -/** -* Gets the minimum width of the list. -* -* @return the minimum width of the list -*/ -public int getMinimumWidth () { - return minimumWidth; -} -/** -* Launches the Popup List, waits for an item to be selected and then closes the PopupList. -* -* @param rect the initial size and location of the PopupList; the dialog will be -* positioned so that it does not run off the screen and the largest number of items are visible -* -* @return the text of the selected item or null if no item is selected -*/ -public String open (Rectangle rect) { - - Point listSize = list.computeSize (rect.width, SWT.DEFAULT, false); - Rectangle screenSize = shell.getDisplay().getBounds(); - - // Position the dialog so that it does not run off the screen and the largest number of items are visible - int spaceBelow = screenSize.height - (rect.y + rect.height) - 30; - int spaceAbove = rect.y - 30; - - int y = 0; - if (spaceAbove > spaceBelow && listSize.y > spaceBelow) { - // place popup list above table cell - if (listSize.y > spaceAbove){ - listSize.y = spaceAbove; - } else { - listSize.y += 2; - } - y = rect.y - listSize.y; - - } else { - // place popup list below table cell - if (listSize.y > spaceBelow){ - listSize.y = spaceBelow; - } else { - listSize.y += 2; - } - y = rect.y + rect.height; - } - - // Make dialog as wide as the cell - listSize.x = rect.width; - // dialog width should not be less than minimumWidth - if (listSize.x < minimumWidth) - listSize.x = minimumWidth; - - // Align right side of dialog with right side of cell - int x = rect.x + rect.width - listSize.x; - - shell.setBounds(x, y, listSize.x, listSize.y); - - shell.open(); - list.setFocus(); - - Display display = shell.getDisplay(); - while (!shell.isDisposed () && shell.isVisible ()) { - if (!display.readAndDispatch()) display.sleep(); - } - - String result = null; - if (!shell.isDisposed ()) { - String [] strings = list.getSelection (); - shell.dispose(); - if (strings.length != 0) result = strings [0]; - } - return result; -} -/** -* Selects an item with text that starts with specified String. -*

    -* If the item is not currently selected, it is selected. -* If the item at an index is selected, it remains selected. -* If the string is not matched, it is ignored. -* -* @param string the text of the item -* -* @exception SWTException

      -*
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • -*
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • -*
    -*/ -public void select(String string) { - String[] items = list.getItems(); - - // find the first entry in the list that starts with the - // specified string - if (string != null){ - for (int i = 0; i < items.length; i++) { - if (items[i].startsWith(string)){ - int index = list.indexOf(items[i]); - list.select(index); - break; - } - } - } -} -/** -* Sets the widget font. -*

    -* When new font is null, the font reverts -* to the default system font for the widget. -* -* @param font the new font (or null) -* -* @exception SWTException

      -*
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • -*
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • -*
    -*/ -public void setFont (Font font) { - list.setFont(font); -} -/** -* Sets all items. -*

    -* The previous selection is cleared. -* The previous items are deleted. -* The new items are added. -* The top index is set to 0. -* -* @param strings the array of items -* -* This operation will fail when an item is null -* or could not be added in the OS. -* -* @exception IllegalArgumentException

      -*
    • ERROR_NULL_ARGUMENT - if the items array is null
    • -*
    • ERROR_INVALID_ARGUMENT - if an item in the items array is null
    • -*
    -* @exception SWTException
      -*
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • -*
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • -*
    -*/ -public void setItems (String[] strings) { - list.setItems(strings); -} -/** -* Sets the minimum width of the list. -* -* @param width the minimum width of the list -*/ -public void setMinimumWidth (int width) { - if (width < 0) - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - - minimumWidth = width; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ST.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ST.java deleted file mode 100755 index 77276975cc..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ST.java +++ /dev/null @@ -1,140 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -/** - * This class provides access to the public constants provided by StyledText. - * - * @see Sample code and further information - */ -public class ST { - - /* - * Navigation Key Actions. Key bindings for the actions are set - * by the StyledText widget. - */ - public static final int LINE_UP = 16777217; // binding = SWT.ARROW_UP - public static final int LINE_DOWN = 16777218; // binding = SWT.ARROW_DOWN - public static final int LINE_START = 16777223; // binding = SWT.HOME - public static final int LINE_END = 16777224; // binding = SWT.END - public static final int COLUMN_PREVIOUS = 16777219; // binding = SWT.ARROW_LEFT - public static final int COLUMN_NEXT = 16777220; // binding = SWT.ARROW_RIGHT - public static final int PAGE_UP = 16777221; // binding = SWT.PAGE_UP - public static final int PAGE_DOWN = 16777222; // binding = SWT.PAGE_DOWN - public static final int WORD_PREVIOUS = 17039363; // binding = SWT.MOD1 + SWT.ARROW_LEFT - public static final int WORD_NEXT = 17039364; // binding = SWT.MOD1 + SWT.ARROW_RIGHT - public static final int TEXT_START = 17039367; // binding = SWT.MOD1 + SWT.HOME - public static final int TEXT_END = 17039368; // binding = SWT.MOD1 + SWT.END - public static final int WINDOW_START = 17039365; // binding = SWT.MOD1 + SWT.PAGE_UP - public static final int WINDOW_END = 17039366; // binding = SWT.MOD1 + SWT.PAGE_DOWN - - /* - * Selection Key Actions - */ - public static final int SELECT_ALL = 262209; // binding = SWT.MOD1 + 'A' - public static final int SELECT_LINE_UP = 16908289; // binding = SWT.MOD2 + SWT.ARROW_UP - public static final int SELECT_LINE_DOWN = 16908290; // binding = SWT.MOD2 + SWT.ARROW_DOWN - public static final int SELECT_LINE_START = 16908295; // binding = SWT.MOD2 + SWT.HOME - public static final int SELECT_LINE_END = 16908296; // binding = SWT.MOD2 + SWT.END - public static final int SELECT_COLUMN_PREVIOUS = 16908291; // binding = SWT.MOD2 + SWT.ARROW_LEFT - public static final int SELECT_COLUMN_NEXT = 16908292; // binding = SWT.MOD2 + SWT.ARROW_RIGHT - public static final int SELECT_PAGE_UP = 16908293; // binding = SWT.MOD2 + SWT.PAGE_UP - public static final int SELECT_PAGE_DOWN = 16908294; // binding = SWT.MOD2 + SWT.PAGE_DOWN - public static final int SELECT_WORD_PREVIOUS = 17170435; // binding = SWT.MOD1 + SWT.MOD2 + SWT.ARROW_LEFT - public static final int SELECT_WORD_NEXT = 17170436; // binding = SWT.MOD1 + SWT.MOD2 + SWT.ARROW_RIGHT - public static final int SELECT_TEXT_START = 17170439; // binding = SWT.MOD1 + SWT.MOD2 + SWT.HOME - public static final int SELECT_TEXT_END = 17170440; // binding = SWT.MOD1 + SWT.MOD2 + SWT.END - public static final int SELECT_WINDOW_START = 17170437; // binding = SWT.MOD1 + SWT.MOD2 + SWT.PAGE_UP - public static final int SELECT_WINDOW_END = 17170438; // binding = SWT.MOD1 + SWT.MOD2 + SWT.PAGE_DOWN - - /* - * Modification Key Actions - */ - public static final int CUT = 131199; // binding = SWT.MOD2 + SWT.DEL - public static final int COPY = 17039369; // binding = SWT.MOD1 + SWT.INSERT; - public static final int PASTE = 16908297; // binding = SWT.MOD2 + SWT.INSERT ; - public static final int DELETE_PREVIOUS = '\b'; // binding = SWT.BS; - public static final int DELETE_NEXT = 0x7F; // binding = SWT.DEL; - public static final int DELETE_WORD_PREVIOUS = 262152; // binding = SWT.BS | SWT.MOD1; - public static final int DELETE_WORD_NEXT = 262271; // binding = SWT.DEL | SWT.MOD1; - - /* - * Miscellaneous Key Actions - */ - public static final int TOGGLE_OVERWRITE = 16777225; // binding = SWT.INSERT; - - /** - * TEMPORARY CODE - API SUBJECT TO CHANGE - * - * Toggle block selection mode - * - * @since 3.5 - */ - public static final int TOGGLE_BLOCKSELECTION = 16777226; - - /** - * Bullet style dot. - * - * @see Bullet - * - * @since 3.2 - */ - public static final int BULLET_DOT = 1 << 0; - - /** - * Bullet style number. - * - * @see Bullet - * - * @since 3.2 - */ - public static final int BULLET_NUMBER = 1 << 1; - - /** - * Bullet style lower case letter. - * - * @see Bullet - * - * @since 3.2 - */ - public static final int BULLET_LETTER_LOWER = 1 << 2; - - /** - * Bullet style upper case letter. - * - * @see Bullet - * - * @since 3.2 - */ - public static final int BULLET_LETTER_UPPER = 1 << 3; - - /** - * Bullet style text. - * - * @see Bullet - * - * @since 3.2 - */ - public static final int BULLET_TEXT = 1 << 4; - - /** - * Bullet style custom draw. - * - * @see StyledText#addPaintObjectListener(PaintObjectListener) - * @see StyledText#removePaintObjectListener(PaintObjectListener) - * @see Bullet - * - * @since 3.2 - */ - public static final int BULLET_CUSTOM = 1 << 5; - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/SashForm.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/SashForm.java deleted file mode 100755 index 232652d665..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/SashForm.java +++ /dev/null @@ -1,446 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 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.swt.custom; - - -import org.eclipse.swt.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.graphics.*; - -/** - * The SashForm is a composite control that lays out its children in a - * row or column arrangement (as specified by the orientation) and places - * a Sash between each child. One child may be maximized to occupy the - * entire size of the SashForm. The relative sizes of the children may - * be specified using weights. - *

    - *

    - *
    Styles:
    - *
    HORIZONTAL, VERTICAL, SMOOTH
    - *
    - *

    - * - * @see SashForm snippets - * @see SWT Example: CustomControlExample - * @see Sample code and further information - */ -public class SashForm extends Composite { - - /** - * The width of all sashes in the form. - */ - public int SASH_WIDTH = 3; - - int sashStyle; - Sash[] sashes = new Sash[0]; - // Remember background and foreground - // colors to determine whether to set - // sashes to the default color (null) or - // a specific color - Color background = null; - Color foreground = null; - Control[] controls = new Control[0]; - Control maxControl = null; - Listener sashListener; - static final int DRAG_MINIMUM = 20; - -/** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    - * - * @see SWT#HORIZONTAL - * @see SWT#VERTICAL - * @see #getStyle() - */ -public SashForm(Composite parent, int style) { - super(parent, checkStyle(style)); - super.setLayout(new SashFormLayout()); - sashStyle = ((style & SWT.VERTICAL) != 0) ? SWT.HORIZONTAL : SWT.VERTICAL; - if ((style & SWT.BORDER) != 0) sashStyle |= SWT.BORDER; - if ((style & SWT.SMOOTH) != 0) sashStyle |= SWT.SMOOTH; - sashListener = new Listener() { - public void handleEvent(Event e) { - onDragSash(e); - } - }; -} -static int checkStyle (int style) { - int mask = SWT.BORDER | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT; - return style & mask; -} -Sash createSash() { - Sash sash = new Sash(this, sashStyle); - sash.setBackground(background); - sash.setForeground(foreground); - sash.setToolTipText(getToolTipText()); - sash.addListener(SWT.Selection, sashListener); - return sash; -} -/** - * Returns SWT.HORIZONTAL if the controls in the SashForm are laid out side by side - * or SWT.VERTICAL if the controls in the SashForm are laid out top to bottom. - * - * @return SWT.HORIZONTAL or SWT.VERTICAL - */ -public int getOrientation() { - //checkWidget(); - return (sashStyle & SWT.VERTICAL) != 0 ? SWT.HORIZONTAL : SWT.VERTICAL; -} -/** - * Returns the width of the sashes when the controls in the SashForm are - * laid out. - * - * @return the width of the sashes - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.4 - */ -public int getSashWidth() { - checkWidget(); - return SASH_WIDTH; -} -public int getStyle() { - int style = super.getStyle(); - style |= getOrientation() == SWT.VERTICAL ? SWT.VERTICAL : SWT.HORIZONTAL; - if ((sashStyle & SWT.SMOOTH) != 0) style |= SWT.SMOOTH; - return style; -} -/** - * Answer the control that currently is maximized in the SashForm. - * This value may be null. - * - * @return the control that currently is maximized or null - */ -public Control getMaximizedControl(){ - //checkWidget(); - return this.maxControl; -} -/** - * Answer the relative weight of each child in the SashForm. The weight represents the - * percent of the total width (if SashForm has Horizontal orientation) or - * total height (if SashForm has Vertical orientation) each control occupies. - * The weights are returned in order of the creation of the widgets (weight[0] - * corresponds to the weight of the first child created). - * - * @return the relative weight of each child - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ - -public int[] getWeights() { - checkWidget(); - Control[] cArray = getControls(false); - int[] ratios = new int[cArray.length]; - for (int i = 0; i < cArray.length; i++) { - Object data = cArray[i].getLayoutData(); - if (data != null && data instanceof SashFormData) { - ratios[i] = (int)(((SashFormData)data).weight * 1000 >> 16); - } else { - ratios[i] = 200; - } - } - return ratios; -} -Control[] getControls(boolean onlyVisible) { - Control[] children = getChildren(); - Control[] result = new Control[0]; - for (int i = 0; i < children.length; i++) { - if (children[i] instanceof Sash) continue; - if (onlyVisible && !children[i].getVisible()) continue; - - Control[] newResult = new Control[result.length + 1]; - System.arraycopy(result, 0, newResult, 0, result.length); - newResult[result.length] = children[i]; - result = newResult; - } - return result; -} -void onDragSash(Event event) { - Sash sash = (Sash)event.widget; - int sashIndex = -1; - for (int i= 0; i < sashes.length; i++) { - if (sashes[i] == sash) { - sashIndex = i; - break; - } - } - if (sashIndex == -1) return; - - Control c1 = controls[sashIndex]; - Control c2 = controls[sashIndex + 1]; - Rectangle b1 = c1.getBounds(); - Rectangle b2 = c2.getBounds(); - - Rectangle sashBounds = sash.getBounds(); - Rectangle area = getClientArea(); - boolean correction = false; - if (getOrientation() == SWT.HORIZONTAL) { - correction = b1.width < DRAG_MINIMUM || b2.width < DRAG_MINIMUM; - int totalWidth = b2.x + b2.width - b1.x; - int shift = event.x - sashBounds.x; - b1.width += shift; - b2.x += shift; - b2.width -= shift; - if (b1.width < DRAG_MINIMUM) { - b1.width = DRAG_MINIMUM; - b2.x = b1.x + b1.width + sashBounds.width; - b2.width = totalWidth - b2.x; - event.x = b1.x + b1.width; - event.doit = false; - } - if (b2.width < DRAG_MINIMUM) { - b1.width = totalWidth - DRAG_MINIMUM - sashBounds.width; - b2.x = b1.x + b1.width + sashBounds.width; - b2.width = DRAG_MINIMUM; - event.x = b1.x + b1.width; - event.doit = false; - } - Object data1 = c1.getLayoutData(); - if (data1 == null || !(data1 instanceof SashFormData)) { - data1 = new SashFormData(); - c1.setLayoutData(data1); - } - Object data2 = c2.getLayoutData(); - if (data2 == null || !(data2 instanceof SashFormData)) { - data2 = new SashFormData(); - c2.setLayoutData(data2); - } - ((SashFormData)data1).weight = (((long)b1.width << 16) + area.width - 1) / area.width; - ((SashFormData)data2).weight = (((long)b2.width << 16) + area.width - 1) / area.width; - } else { - correction = b1.height < DRAG_MINIMUM || b2.height < DRAG_MINIMUM; - int totalHeight = b2.y + b2.height - b1.y; - int shift = event.y - sashBounds.y; - b1.height += shift; - b2.y += shift; - b2.height -= shift; - if (b1.height < DRAG_MINIMUM) { - b1.height = DRAG_MINIMUM; - b2.y = b1.y + b1.height + sashBounds.height; - b2.height = totalHeight - b2.y; - event.y = b1.y + b1.height; - event.doit = false; - } - if (b2.height < DRAG_MINIMUM) { - b1.height = totalHeight - DRAG_MINIMUM - sashBounds.height; - b2.y = b1.y + b1.height + sashBounds.height; - b2.height = DRAG_MINIMUM; - event.y = b1.y + b1.height; - event.doit = false; - } - Object data1 = c1.getLayoutData(); - if (data1 == null || !(data1 instanceof SashFormData)) { - data1 = new SashFormData(); - c1.setLayoutData(data1); - } - Object data2 = c2.getLayoutData(); - if (data2 == null || !(data2 instanceof SashFormData)) { - data2 = new SashFormData(); - c2.setLayoutData(data2); - } - ((SashFormData)data1).weight = (((long)b1.height << 16) + area.height - 1) / area.height; - ((SashFormData)data2).weight = (((long)b2.height << 16) + area.height - 1) / area.height; - } - if (correction || (event.doit && event.detail != SWT.DRAG)) { - c1.setBounds(b1); - sash.setBounds(event.x, event.y, event.width, event.height); - c2.setBounds(b2); - } -} -/** - * If orientation is SWT.HORIZONTAL, lay the controls in the SashForm - * out side by side. If orientation is SWT.VERTICAL, lay the - * controls in the SashForm out top to bottom. - * - * @param orientation SWT.HORIZONTAL or SWT.VERTICAL - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_INVALID_ARGUMENT - if the value of orientation is not SWT.HORIZONTAL or SWT.VERTICAL - *
    - */ -public void setOrientation(int orientation) { - checkWidget(); - if (getOrientation() == orientation) return; - if (orientation != SWT.HORIZONTAL && orientation != SWT.VERTICAL) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - sashStyle &= ~(SWT.HORIZONTAL | SWT.VERTICAL); - sashStyle |= orientation == SWT.VERTICAL ? SWT.HORIZONTAL : SWT.VERTICAL; - for (int i = 0; i < sashes.length; i++) { - sashes[i].dispose(); - sashes[i] = createSash(); - } - layout(false); -} -public void setBackground (Color color) { - super.setBackground(color); - background = color; - for (int i = 0; i < sashes.length; i++) { - sashes[i].setBackground(background); - } -} -public void setForeground (Color color) { - super.setForeground(color); - foreground = color; - for (int i = 0; i < sashes.length; i++) { - sashes[i].setForeground(foreground); - } -} -/** - * Sets the layout which is associated with the receiver to be - * the argument which may be null. - *

    - * Note: No Layout can be set on this Control because it already - * manages the size and position of its children. - *

    - * - * @param layout the receiver's new layout or null - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setLayout (Layout layout) { - checkWidget(); - return; -} -/** - * Specify the control that should take up the entire client area of the SashForm. - * If one control has been maximized, and this method is called with a different control, - * the previous control will be minimized and the new control will be maximized. - * If the value of control is null, the SashForm will minimize all controls and return to - * the default layout where all controls are laid out separated by sashes. - * - * @param control the control to be maximized or null - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setMaximizedControl(Control control){ - checkWidget(); - if (control == null) { - if (maxControl != null) { - this.maxControl = null; - layout(false); - for (int i= 0; i < sashes.length; i++){ - sashes[i].setVisible(true); - } - } - return; - } - - for (int i= 0; i < sashes.length; i++){ - sashes[i].setVisible(false); - } - maxControl = control; - layout(false); -} - -/** - * Specify the width of the sashes when the controls in the SashForm are - * laid out. - * - * @param width the width of the sashes - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.4 - */ -public void setSashWidth(int width) { - checkWidget(); - if (SASH_WIDTH == width) return; - SASH_WIDTH = width; - layout(false); -} -public void setToolTipText(String string) { - super.setToolTipText(string); - for (int i = 0; i < sashes.length; i++) { - sashes[i].setToolTipText(string); - } -} -/** - * Specify the relative weight of each child in the SashForm. This will determine - * what percent of the total width (if SashForm has Horizontal orientation) or - * total height (if SashForm has Vertical orientation) each control will occupy. - * The weights must be positive values and there must be an entry for each - * non-sash child of the SashForm. - * - * @param weights the relative weight of each child - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_INVALID_ARGUMENT - if the weights value is null or of incorrect length (must match the number of children)
    • - *
    - */ -public void setWeights(int[] weights) { - checkWidget(); - Control[] cArray = getControls(false); - if (weights == null || weights.length != cArray.length) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - - int total = 0; - for (int i = 0; i < weights.length; i++) { - if (weights[i] < 0) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - total += weights[i]; - } - if (total == 0) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - for (int i = 0; i < cArray.length; i++) { - Object data = cArray[i].getLayoutData(); - if (data == null || !(data instanceof SashFormData)) { - data = new SashFormData(); - cArray[i].setLayoutData(data); - } - ((SashFormData)data).weight = (((long)weights[i] << 16) + total - 1) / total; - } - - layout(false); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/SashFormData.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/SashFormData.java deleted file mode 100644 index eea3b39638..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/SashFormData.java +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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.swt.custom; - -class SashFormData { - - long weight; - -String getName () { - String string = getClass ().getName (); - int index = string.lastIndexOf ('.'); - if (index == -1) return string; - return string.substring (index + 1, string.length ()); -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the event - */ -public String toString () { - return getName()+" {weight="+weight+"}"; //$NON-NLS-2$ -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/SashFormLayout.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/SashFormLayout.java deleted file mode 100644 index f01d0a2c16..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/SashFormLayout.java +++ /dev/null @@ -1,192 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * This class provides the layout for SashForm - * - * @see SashForm - */ -class SashFormLayout extends Layout { -protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { - SashForm sashForm = (SashForm)composite; - Control[] cArray = sashForm.getControls(true); - int width = 0; - int height = 0; - if (cArray.length == 0) { - if (wHint != SWT.DEFAULT) width = wHint; - if (hHint != SWT.DEFAULT) height = hHint; - return new Point(width, height); - } - // determine control sizes - boolean vertical = sashForm.getOrientation() == SWT.VERTICAL; - int maxIndex = 0; - int maxValue = 0; - for (int i = 0; i < cArray.length; i++) { - if (vertical) { - Point size = cArray[i].computeSize(wHint, SWT.DEFAULT, flushCache); - if (size.y > maxValue) { - maxIndex = i; - maxValue = size.y; - } - width = Math.max(width, size.x); - } else { - Point size = cArray[i].computeSize(SWT.DEFAULT, hHint, flushCache); - if (size.x > maxValue) { - maxIndex = i; - maxValue = size.x; - } - height = Math.max(height, size.y); - } - } - // get the ratios - long[] ratios = new long[cArray.length]; - long total = 0; - for (int i = 0; i < cArray.length; i++) { - Object data = cArray[i].getLayoutData(); - if (data != null && data instanceof SashFormData) { - ratios[i] = ((SashFormData)data).weight; - } else { - data = new SashFormData(); - cArray[i].setLayoutData(data); - ((SashFormData)data).weight = ratios[i] = ((200 << 16) + 999) / 1000; - - } - total += ratios[i]; - } - if (ratios[maxIndex] > 0) { - int sashwidth = sashForm.sashes.length > 0 ? sashForm.SASH_WIDTH + sashForm.sashes [0].getBorderWidth() * 2 : sashForm.SASH_WIDTH; - if (vertical) { - height += (int)(total * maxValue / ratios[maxIndex]) + (cArray.length - 1) * sashwidth; - } else { - width += (int)(total * maxValue / ratios[maxIndex]) + (cArray.length - 1) * sashwidth; - } - } - width += sashForm.getBorderWidth()*2; - height += sashForm.getBorderWidth()*2; - if (wHint != SWT.DEFAULT) width = wHint; - if (hHint != SWT.DEFAULT) height = hHint; - return new Point(width, height); -} - -protected boolean flushCache(Control control) { - return true; -} - -protected void layout(Composite composite, boolean flushCache) { - SashForm sashForm = (SashForm)composite; - Rectangle area = sashForm.getClientArea(); - if (area.width <= 1 || area.height <= 1) return; - - Control[] newControls = sashForm.getControls(true); - if (sashForm.controls.length == 0 && newControls.length == 0) return; - sashForm.controls = newControls; - - Control[] controls = sashForm.controls; - - if (sashForm.maxControl != null && !sashForm.maxControl.isDisposed()) { - for (int i= 0; i < controls.length; i++){ - if (controls[i] != sashForm.maxControl) { - controls[i].setBounds(-200, -200, 0, 0); - } else { - controls[i].setBounds(area); - } - } - return; - } - - // keep just the right number of sashes - if (sashForm.sashes.length < controls.length - 1) { - Sash[] newSashes = new Sash[controls.length - 1]; - System.arraycopy(sashForm.sashes, 0, newSashes, 0, sashForm.sashes.length); - for (int i = sashForm.sashes.length; i < newSashes.length; i++) { - newSashes[i] = sashForm.createSash(); - } - sashForm.sashes = newSashes; - } - if (sashForm.sashes.length > controls.length - 1) { - if (controls.length == 0) { - for (int i = 0; i < sashForm.sashes.length; i++) { - sashForm.sashes[i].dispose(); - } - sashForm.sashes = new Sash[0]; - } else { - Sash[] newSashes = new Sash[controls.length - 1]; - System.arraycopy(sashForm.sashes, 0, newSashes, 0, newSashes.length); - for (int i = controls.length - 1; i < sashForm.sashes.length; i++) { - sashForm.sashes[i].dispose(); - } - sashForm.sashes = newSashes; - } - } - if (controls.length == 0) return; - Sash[] sashes = sashForm.sashes; - // get the ratios - long[] ratios = new long[controls.length]; - long total = 0; - for (int i = 0; i < controls.length; i++) { - Object data = controls[i].getLayoutData(); - if (data != null && data instanceof SashFormData) { - ratios[i] = ((SashFormData)data).weight; - } else { - data = new SashFormData(); - controls[i].setLayoutData(data); - ((SashFormData)data).weight = ratios[i] = ((200 << 16) + 999) / 1000; - - } - total += ratios[i]; - } - - int sashwidth = sashes.length > 0 ? sashForm.SASH_WIDTH + sashes [0].getBorderWidth() * 2 : sashForm.SASH_WIDTH; - if (sashForm.getOrientation() == SWT.HORIZONTAL) { - int width = (int)(ratios[0] * (area.width - sashes.length * sashwidth) / total); - int x = area.x; - controls[0].setBounds(x, area.y, width, area.height); - x += width; - for (int i = 1; i < controls.length - 1; i++) { - sashes[i - 1].setBounds(x, area.y, sashwidth, area.height); - x += sashwidth; - width = (int)(ratios[i] * (area.width - sashes.length * sashwidth) / total); - controls[i].setBounds(x, area.y, width, area.height); - x += width; - } - if (controls.length > 1) { - sashes[sashes.length - 1].setBounds(x, area.y, sashwidth, area.height); - x += sashwidth; - width = area.width - x; - controls[controls.length - 1].setBounds(x, area.y, width, area.height); - } - } else { - int height = (int)(ratios[0] * (area.height - sashes.length * sashwidth) / total); - int y = area.y; - controls[0].setBounds(area.x, y, area.width, height); - y += height; - for (int i = 1; i < controls.length - 1; i++) { - sashes[i - 1].setBounds(area.x, y, area.width, sashwidth); - y += sashwidth; - height = (int)(ratios[i] * (area.height - sashes.length * sashwidth) / total); - controls[i].setBounds(area.x, y, area.width, height); - y += height; - } - if (controls.length > 1) { - sashes[sashes.length - 1].setBounds(area.x, y, area.width, sashwidth); - y += sashwidth; - height = area.height - y; - controls[controls.length - 1].setBounds(area.x, y, area.width, height); - } - - } -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ScrolledComposite.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ScrolledComposite.java deleted file mode 100755 index f115784c4b..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ScrolledComposite.java +++ /dev/null @@ -1,700 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * A ScrolledComposite provides scrollbars and will scroll its content when the user - * uses the scrollbars. - * - * - *

    There are two ways to use the ScrolledComposite: - * - *

    - * 1) Set the size of the control that is being scrolled and the ScrolledComposite - * will show scrollbars when the contained control can not be fully seen. - * - * 2) The second way imitates the way a browser would work. Set the minimum size of - * the control and the ScrolledComposite will show scroll bars if the visible area is - * less than the minimum size of the control and it will expand the size of the control - * if the visible area is greater than the minimum size. This requires invoking - * both setMinWidth(), setMinHeight() and setExpandHorizontal(), setExpandVertical(). - * - *

    - * public static void main (String [] args) {
    - *      Display display = new Display ();
    - *      Color red = display.getSystemColor(SWT.COLOR_RED);
    - *      Color blue = display.getSystemColor(SWT.COLOR_BLUE);
    - *      Shell shell = new Shell (display);
    - *      shell.setLayout(new FillLayout());
    - * 	
    - *      // set the size of the scrolled content - method 1
    - *      final ScrolledComposite sc1 = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
    - *      final Composite c1 = new Composite(sc1, SWT.NONE);
    - *      sc1.setContent(c1);
    - *      c1.setBackground(red);
    - *      GridLayout layout = new GridLayout();
    - *      layout.numColumns = 4;
    - *      c1.setLayout(layout);
    - *      Button b1 = new Button (c1, SWT.PUSH);
    - *      b1.setText("first button");
    - *      c1.setSize(c1.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    - *      
    - *      // set the minimum width and height of the scrolled content - method 2
    - *      final ScrolledComposite sc2 = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
    - *      sc2.setExpandHorizontal(true);
    - *      sc2.setExpandVertical(true);
    - *      final Composite c2 = new Composite(sc2, SWT.NONE);
    - *      sc2.setContent(c2);
    - *      c2.setBackground(blue);
    - *      layout = new GridLayout();
    - *      layout.numColumns = 4;
    - *      c2.setLayout(layout);
    - *      Button b2 = new Button (c2, SWT.PUSH);
    - *      b2.setText("first button");
    - *      sc2.setMinSize(c2.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    - *      
    - *      Button add = new Button (shell, SWT.PUSH);
    - *      add.setText("add children");
    - *      final int[] index = new int[]{0};
    - *      add.addListener(SWT.Selection, new Listener() {
    - *          public void handleEvent(Event e) {
    - *              index[0]++;
    - *              Button button = new Button(c1, SWT.PUSH);
    - *              button.setText("button "+index[0]);
    - *              // reset size of content so children can be seen - method 1
    - *              c1.setSize(c1.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    - *              c1.layout();
    - *              
    - *              button = new Button(c2, SWT.PUSH);
    - *              button.setText("button "+index[0]);
    - *              // reset the minimum width and height so children can be seen - method 2
    - *              sc2.setMinSize(c2.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    - *              c2.layout();
    - *          }
    - *      });
    - * 
    - *      shell.open ();
    - *      while (!shell.isDisposed ()) {
    - *          if (!display.readAndDispatch ()) display.sleep ();
    - *      }
    - *      display.dispose ();
    - * }
    - * 
    - * - *
    - *
    Styles:
    H_SCROLL, V_SCROLL - *
    - * - * @see ScrolledComposite snippets - * @see Sample code and further information - */ -public class ScrolledComposite extends Composite { - - Control content; - Listener contentListener; - Listener filter; - - int minHeight = 0; - int minWidth = 0; - boolean expandHorizontal = false; - boolean expandVertical = false; - boolean alwaysShowScroll = false; - boolean showFocusedControl = false; - -/** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    - * - * @see SWT#H_SCROLL - * @see SWT#V_SCROLL - * @see #getStyle() - */ -public ScrolledComposite(Composite parent, int style) { - super(parent, checkStyle(style)); - super.setLayout(new ScrolledCompositeLayout()); - ScrollBar hBar = getHorizontalBar (); - if (hBar != null) { - hBar.setVisible(false); - hBar.addListener (SWT.Selection, new Listener () { - public void handleEvent (Event e) { - hScroll(); - } - }); - } - - ScrollBar vBar = getVerticalBar (); - if (vBar != null) { - vBar.setVisible(false); - vBar.addListener (SWT.Selection, new Listener () { - public void handleEvent (Event e) { - vScroll(); - } - }); - } - - contentListener = new Listener() { - public void handleEvent(Event e) { - if (e.type != SWT.Resize) return; - layout(false); - } - }; - - filter = new Listener() { - public void handleEvent(Event event) { - if (event.widget instanceof Control) { - Control control = (Control) event.widget; - if (contains(control)) showControl(control); - } - } - }; - - addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - getDisplay().removeFilter(SWT.FocusIn, filter); - } - }); -} - -static int checkStyle (int style) { - int mask = SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT; - return style & mask; -} - -boolean contains(Control control) { - if (control == null || control.isDisposed()) return false; - - Composite parent = control.getParent(); - while (parent != null && !(parent instanceof Shell)) { - if (this == parent) return true; - parent = parent.getParent(); - } - return false; -} - -/** - * Returns the Always Show Scrollbars flag. True if the scrollbars are - * always shown even if they are not required. False if the scrollbars are only - * visible when some part of the composite needs to be scrolled to be seen. - * The H_SCROLL and V_SCROLL style bits are also required to enable scrollbars in the - * horizontal and vertical directions. - * - * @return the Always Show Scrollbars flag value - */ -public boolean getAlwaysShowScrollBars() { - //checkWidget(); - return alwaysShowScroll; -} - -/** - * Returns true if the content control - * will be expanded to fill available horizontal space. - * - * @return the receiver's horizontal expansion state - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.2 - */ -public boolean getExpandHorizontal() { - checkWidget(); - return expandHorizontal; -} - -/** - * Returns true if the content control - * will be expanded to fill available vertical space. - * - * @return the receiver's vertical expansion state - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.2 - */ -public boolean getExpandVertical() { - checkWidget(); - return expandVertical; -} - -/** - * Returns the minimum width of the content control. - * - * @return the minimum width - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.2 - */ -public int getMinWidth() { - checkWidget(); - return minWidth; -} - -/** - * Returns the minimum height of the content control. - * - * @return the minimum height - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.2 - */ -public int getMinHeight() { - checkWidget(); - return minHeight; -} - -/** - * Get the content that is being scrolled. - * - * @return the control displayed in the content area - */ -public Control getContent() { - //checkWidget(); - return content; -} - -/** - * Returns true if the receiver automatically scrolls to a focused child control - * to make it visible. Otherwise, returns false. - * - * @return a boolean indicating whether focused child controls are automatically scrolled into the viewport - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.4 - */ -public boolean getShowFocusedControl() { - checkWidget(); - return showFocusedControl; -} - -void hScroll() { - if (content == null) return; - Point location = content.getLocation (); - ScrollBar hBar = getHorizontalBar (); - int hSelection = hBar.getSelection (); - content.setLocation (-hSelection, location.y); -} -boolean needHScroll(Rectangle contentRect, boolean vVisible) { - ScrollBar hBar = getHorizontalBar(); - if (hBar == null) return false; - - Rectangle hostRect = getBounds(); - int border = getBorderWidth(); - hostRect.width -= 2*border; - ScrollBar vBar = getVerticalBar(); - if (vVisible && vBar != null) hostRect.width -= vBar.getSize().x; - - if (!expandHorizontal && contentRect.width > hostRect.width) return true; - if (expandHorizontal && minWidth > hostRect.width) return true; - return false; -} - -boolean needVScroll(Rectangle contentRect, boolean hVisible) { - ScrollBar vBar = getVerticalBar(); - if (vBar == null) return false; - - Rectangle hostRect = getBounds(); - int border = getBorderWidth(); - hostRect.height -= 2*border; - ScrollBar hBar = getHorizontalBar(); - if (hVisible && hBar != null) hostRect.height -= hBar.getSize().y; - - if (!expandVertical && contentRect.height > hostRect.height) return true; - if (expandVertical && minHeight > hostRect.height) return true; - return false; -} - -/** - * Return the point in the content that currently appears in the top left - * corner of the scrolled composite. - * - * @return the point in the content that currently appears in the top left - * corner of the scrolled composite. If no content has been set, this returns - * (0, 0). - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 2.0 - */ -public Point getOrigin() { - checkWidget(); - if (content == null) return new Point(0, 0); - Point location = content.getLocation(); - return new Point(-location.x, -location.y); -} -/** - * Scrolls the content so that the specified point in the content is in the top - * left corner. If no content has been set, nothing will occur. - * - * Negative values will be ignored. Values greater than the maximum scroll - * distance will result in scrolling to the end of the scrollbar. - * - * @param origin the point on the content to appear in the top left corner - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_INVALID_ARGUMENT - value of origin is outside of content - *
    - * @since 2.0 - */ -public void setOrigin(Point origin) { - setOrigin(origin.x, origin.y); -} -/** - * Scrolls the content so that the specified point in the content is in the top - * left corner. If no content has been set, nothing will occur. - * - * Negative values will be ignored. Values greater than the maximum scroll - * distance will result in scrolling to the end of the scrollbar. - * - * @param x the x coordinate of the content to appear in the top left corner - * - * @param y the y coordinate of the content to appear in the top left corner - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 2.0 - */ -public void setOrigin(int x, int y) { - checkWidget(); - if (content == null) return; - ScrollBar hBar = getHorizontalBar (); - if (hBar != null) { - hBar.setSelection(x); - x = -hBar.getSelection (); - } else { - x = 0; - } - ScrollBar vBar = getVerticalBar (); - if (vBar != null) { - vBar.setSelection(y); - y = -vBar.getSelection (); - } else { - y = 0; - } - content.setLocation(x, y); -} -/** - * Set the Always Show Scrollbars flag. True if the scrollbars are - * always shown even if they are not required. False if the scrollbars are only - * visible when some part of the composite needs to be scrolled to be seen. - * The H_SCROLL and V_SCROLL style bits are also required to enable scrollbars in the - * horizontal and vertical directions. - * - * @param show true to show the scrollbars even when not required, false to show scrollbars only when required - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setAlwaysShowScrollBars(boolean show) { - checkWidget(); - if (show == alwaysShowScroll) return; - alwaysShowScroll = show; - ScrollBar hBar = getHorizontalBar (); - if (hBar != null && alwaysShowScroll) hBar.setVisible(true); - ScrollBar vBar = getVerticalBar (); - if (vBar != null && alwaysShowScroll) vBar.setVisible(true); - layout(false); -} - -/** - * Set the content that will be scrolled. - * - * @param content the control to be displayed in the content area - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setContent(Control content) { - checkWidget(); - if (this.content != null && !this.content.isDisposed()) { - this.content.removeListener(SWT.Resize, contentListener); - this.content.setBounds(new Rectangle(-200, -200, 0, 0)); - } - - this.content = content; - ScrollBar vBar = getVerticalBar (); - ScrollBar hBar = getHorizontalBar (); - if (this.content != null) { - if (vBar != null) { - vBar.setMaximum (0); - vBar.setThumb (0); - vBar.setSelection(0); - } - if (hBar != null) { - hBar.setMaximum (0); - hBar.setThumb (0); - hBar.setSelection(0); - } - content.setLocation(0, 0); - layout(false); - this.content.addListener(SWT.Resize, contentListener); - } else { - if (hBar != null) hBar.setVisible(alwaysShowScroll); - if (vBar != null) vBar.setVisible(alwaysShowScroll); - } -} -/** - * Configure the ScrolledComposite to resize the content object to be as wide as the - * ScrolledComposite when the width of the ScrolledComposite is greater than the - * minimum width specified in setMinWidth. If the ScrolledComposite is less than the - * minimum width, the content will not be resized and instead the horizontal scroll bar will be - * used to view the entire width. - * If expand is false, this behaviour is turned off. By default, this behaviour is turned off. - * - * @param expand true to expand the content control to fill available horizontal space - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setExpandHorizontal(boolean expand) { - checkWidget(); - if (expand == expandHorizontal) return; - expandHorizontal = expand; - layout(false); -} -/** - * Configure the ScrolledComposite to resize the content object to be as tall as the - * ScrolledComposite when the height of the ScrolledComposite is greater than the - * minimum height specified in setMinHeight. If the ScrolledComposite is less than the - * minimum height, the content will not be resized and instead the vertical scroll bar will be - * used to view the entire height. - * If expand is false, this behaviour is turned off. By default, this behaviour is turned off. - * - * @param expand true to expand the content control to fill available vertical space - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setExpandVertical(boolean expand) { - checkWidget(); - if (expand == expandVertical) return; - expandVertical = expand; - layout(false); -} -/** - * Sets the layout which is associated with the receiver to be - * the argument which may be null. - *

    - * Note: No Layout can be set on this Control because it already - * manages the size and position of its children. - *

    - * - * @param layout the receiver's new layout or null - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setLayout (Layout layout) { - checkWidget(); - return; -} -/** - * Specify the minimum height at which the ScrolledComposite will begin scrolling the - * content with the vertical scroll bar. This value is only relevant if - * setExpandVertical(true) has been set. - * - * @param height the minimum height or 0 for default height - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setMinHeight(int height) { - setMinSize(minWidth, height); -} -/** - * Specify the minimum width and height at which the ScrolledComposite will begin scrolling the - * content with the horizontal scroll bar. This value is only relevant if - * setExpandHorizontal(true) and setExpandVertical(true) have been set. - * - * @param size the minimum size or null for the default size - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setMinSize(Point size) { - if (size == null) { - setMinSize(0, 0); - } else { - setMinSize(size.x, size.y); - } -} -/** - * Specify the minimum width and height at which the ScrolledComposite will begin scrolling the - * content with the horizontal scroll bar. This value is only relevant if - * setExpandHorizontal(true) and setExpandVertical(true) have been set. - * - * @param width the minimum width or 0 for default width - * @param height the minimum height or 0 for default height - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setMinSize(int width, int height) { - checkWidget(); - if (width == minWidth && height == minHeight) return; - minWidth = Math.max(0, width); - minHeight = Math.max(0, height); - layout(false); -} -/** - * Specify the minimum width at which the ScrolledComposite will begin scrolling the - * content with the horizontal scroll bar. This value is only relevant if - * setExpandHorizontal(true) has been set. - * - * @param width the minimum width or 0 for default width - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setMinWidth(int width) { - setMinSize(width, minHeight); -} - -/** - * Configure the receiver to automatically scroll to a focused child control - * to make it visible. - * - * If show is false, show a focused control is off. - * By default, show a focused control is off. - * - * @param show true to show a focused control. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.4 - */ -public void setShowFocusedControl(boolean show) { - checkWidget(); - if (showFocusedControl == show) return; - Display display = getDisplay(); - display.removeFilter(SWT.FocusIn, filter); - showFocusedControl = show; - if (!showFocusedControl) return; - display.addFilter(SWT.FocusIn, filter); - Control control = display.getFocusControl(); - if (contains(control)) showControl(control); -} - -/** - * Scrolls the content of the receiver so that the control is visible. - * - * @param control the control to be shown - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the control is null
    • - *
    • ERROR_INVALID_ARGUMENT - if the control has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.4 - */ -public void showControl(Control control) { - checkWidget (); - if (control == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (control.isDisposed ()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (!contains(control)) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - - Rectangle itemRect = getDisplay().map(control.getParent(), this, control.getBounds()); - Rectangle area = getClientArea(); - Point origin = getOrigin(); - if (itemRect.x < 0) { - origin.x = Math.max(0, origin.x + itemRect.x); - } else { - if (area.width < itemRect.x + itemRect.width) origin.x = Math.max(0, origin.x + itemRect.x + Math.min(itemRect.width, area.width) - area.width); - } - if (itemRect.y < 0) { - origin.y = Math.max(0, origin.y + itemRect.y); - } else { - if (area.height < itemRect.y + itemRect.height) origin.y = Math.max(0, origin.y + itemRect.y + Math.min(itemRect.height, area.height) - area.height); - } - setOrigin(origin); -} - -void vScroll() { - if (content == null) return; - Point location = content.getLocation (); - ScrollBar vBar = getVerticalBar (); - int vSelection = vBar.getSelection (); - content.setLocation (location.x, -vSelection); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ScrolledCompositeLayout.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ScrolledCompositeLayout.java deleted file mode 100644 index 0af014860e..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ScrolledCompositeLayout.java +++ /dev/null @@ -1,112 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * This class provides the layout for ScrolledComposite - * - * @see ScrolledComposite - */ -class ScrolledCompositeLayout extends Layout { - - boolean inLayout = false; - static final int DEFAULT_WIDTH = 64; - static final int DEFAULT_HEIGHT = 64; - -protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { - ScrolledComposite sc = (ScrolledComposite)composite; - Point size = new Point(DEFAULT_WIDTH, DEFAULT_HEIGHT); - if (sc.content != null) { - Point preferredSize = sc.content.computeSize(wHint, hHint, flushCache); - Point currentSize = sc.content.getSize(); - size.x = sc.getExpandHorizontal() ? preferredSize.x : currentSize.x; - size.y = sc.getExpandVertical() ? preferredSize.y : currentSize.y; - } - size.x = Math.max(size.x, sc.minWidth); - size.y = Math.max(size.y, sc.minHeight); - if (wHint != SWT.DEFAULT) size.x = wHint; - if (hHint != SWT.DEFAULT) size.y = hHint; - return size; -} - -protected boolean flushCache(Control control) { - return true; -} - -protected void layout(Composite composite, boolean flushCache) { - if (inLayout) return; - ScrolledComposite sc = (ScrolledComposite)composite; - if (sc.content == null) return; - ScrollBar hBar = sc.getHorizontalBar(); - ScrollBar vBar = sc.getVerticalBar(); - if (hBar != null) { - if (hBar.getSize().y >= sc.getSize().y) { - return; - } - } - if (vBar != null) { - if (vBar.getSize().x >= sc.getSize().x) { - return; - } - } - inLayout = true; - Rectangle contentRect = sc.content.getBounds(); - if (!sc.alwaysShowScroll) { - boolean hVisible = sc.needHScroll(contentRect, false); - boolean vVisible = sc.needVScroll(contentRect, hVisible); - if (!hVisible && vVisible) hVisible = sc.needHScroll(contentRect, vVisible); - if (hBar != null) hBar.setVisible(hVisible); - if (vBar != null) vBar.setVisible(vVisible); - } - Rectangle hostRect = sc.getClientArea(); - if (sc.expandHorizontal) { - contentRect.width = Math.max(sc.minWidth, hostRect.width); - } - if (sc.expandVertical) { - contentRect.height = Math.max(sc.minHeight, hostRect.height); - } - - if (hBar != null) { - hBar.setMaximum (contentRect.width); - hBar.setThumb (Math.min (contentRect.width, hostRect.width)); - int hPage = contentRect.width - hostRect.width; - int hSelection = hBar.getSelection (); - if (hSelection >= hPage) { - if (hPage <= 0) { - hSelection = 0; - hBar.setSelection(0); - } - contentRect.x = -hSelection; - } - } - - if (vBar != null) { - vBar.setMaximum (contentRect.height); - vBar.setThumb (Math.min (contentRect.height, hostRect.height)); - int vPage = contentRect.height - hostRect.height; - int vSelection = vBar.getSelection (); - if (vSelection >= vPage) { - if (vPage <= 0) { - vSelection = 0; - vBar.setSelection(0); - } - contentRect.y = -vSelection; - } - } - - sc.content.setBounds (contentRect); - inLayout = false; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StackLayout.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StackLayout.java deleted file mode 100755 index cc76e978ef..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StackLayout.java +++ /dev/null @@ -1,148 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * This Layout stacks all the controls one on top of the other and resizes all controls - * to have the same size and location. - * The control specified in topControl is visible and all other controls are not visible. - * Users must set the topControl value to flip between the visible items and then call - * layout() on the composite which has the StackLayout. - * - *

    Here is an example which places ten buttons in a stack layout and - * flips between them: - * - *

    
    - * 	public static void main(String[] args) {
    - * 		Display display = new Display();
    - * 		Shell shell = new Shell(display);
    - * 		shell.setLayout(new GridLayout());
    - * 	
    - * 		final Composite parent = new Composite(shell, SWT.NONE);
    - * 		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
    - * 		final StackLayout layout = new StackLayout();
    - * 		parent.setLayout(layout);
    - * 		final Button[] bArray = new Button[10];
    - * 		for (int i = 0; i < 10; i++) {
    - * 			bArray[i] = new Button(parent, SWT.PUSH);
    - * 			bArray[i].setText("Button "+i);
    - * 		}
    - * 		layout.topControl = bArray[0];
    - * 	
    - * 		Button b = new Button(shell, SWT.PUSH);
    - * 		b.setText("Show Next Button");
    - * 		final int[] index = new int[1];
    - * 		b.addListener(SWT.Selection, new Listener(){
    - * 			public void handleEvent(Event e) {
    - * 				index[0] = (index[0] + 1) % 10;
    - * 				layout.topControl = bArray[index[0]];
    - * 				parent.layout();
    - * 			}
    - * 		});
    - * 	
    - * 		shell.open();
    - * 		while (shell != null && !shell.isDisposed()) {
    - * 			if (!display.readAndDispatch())
    - * 				display.sleep(); 
    - * 		} 	
    - * 	}
    - * 
    - * - * @see StackLayout snippets - * @see SWT Example: LayoutExample - * @see Sample code and further information - */ - -public class StackLayout extends Layout { - - /** - * marginWidth specifies the number of pixels of horizontal margin - * that will be placed along the left and right edges of the layout. - * - * The default value is 0. - */ - public int marginWidth = 0; - /** - * marginHeight specifies the number of pixels of vertical margin - * that will be placed along the top and bottom edges of the layout. - * - * The default value is 0. - */ - public int marginHeight = 0; - - /** - * topControl the Control that is displayed at the top of the stack. - * All other controls that are children of the parent composite will not be visible. - */ - public Control topControl; - -protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { - Control children[] = composite.getChildren(); - int maxWidth = 0; - int maxHeight = 0; - for (int i = 0; i < children.length; i++) { - Point size = children[i].computeSize(wHint, hHint, flushCache); - maxWidth = Math.max(size.x, maxWidth); - maxHeight = Math.max(size.y, maxHeight); - } - int width = maxWidth + 2 * marginWidth; - int height = maxHeight + 2 * marginHeight; - if (wHint != SWT.DEFAULT) width = wHint; - if (hHint != SWT.DEFAULT) height = hHint; - return new Point(width, height); -} - -protected boolean flushCache(Control control) { - return true; -} - -protected void layout(Composite composite, boolean flushCache) { - Control children[] = composite.getChildren(); - Rectangle rect = composite.getClientArea(); - rect.x += marginWidth; - rect.y += marginHeight; - rect.width -= 2 * marginWidth; - rect.height -= 2 * marginHeight; - for (int i = 0; i < children.length; i++) { - children[i].setBounds(rect); - children[i].setVisible(children[i] == topControl); - - } -} - -String getName () { - String string = getClass ().getName (); - int index = string.lastIndexOf ('.'); - if (index == -1) return string; - return string.substring (index + 1, string.length ()); -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the layout - */ -public String toString () { - String string = getName ()+" {"; - if (marginWidth != 0) string += "marginWidth="+marginWidth+" "; - if (marginHeight != 0) string += "marginHeight="+marginHeight+" "; - if (topControl != null) string += "topControl="+topControl+" "; - string = string.trim(); - string += "}"; - return string; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyleRange.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyleRange.java deleted file mode 100755 index 76469db5f9..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyleRange.java +++ /dev/null @@ -1,213 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.internal.CloneableCompatibility; - -/** - * StyleRange defines a set of styles for a specified - * range of text. - *

    - * The hashCode() method in this class uses the values of the public - * fields to compute the hash value. When storing instances of the - * class in hashed collections, do not modify these fields after the - * object has been inserted. - *

    - * - * @see Sample code and further information - */ -public class StyleRange extends TextStyle implements CloneableCompatibility { - - /** - * the start offset of the range, zero-based from the document start - */ - public int start; - - /** - * the length of the range - */ - public int length; - - /** - * the font style of the range. It may be a combination of - * SWT.NORMAL, SWT.ITALIC or SWT.BOLD - * - * Note: the font style is not used if the font attribute - * is set - */ - public int fontStyle = SWT.NORMAL; - -/** - * Create a new style range with no styles - * - * @since 3.2 - */ -public StyleRange() { -} - -/** - * Create a new style range from an existing text style. - * - * @param style the text style to copy - * - * @since 3.4 - */ -public StyleRange(TextStyle style) { - super(style); -} - -/** - * Create a new style range. - * - * @param start start offset of the style - * @param length length of the style - * @param foreground foreground color of the style, null if none - * @param background background color of the style, null if none - */ -public StyleRange(int start, int length, Color foreground, Color background) { - super(null, foreground, background); - this.start = start; - this.length = length; -} - -/** - * Create a new style range. - * - * @param start start offset of the style - * @param length length of the style - * @param foreground foreground color of the style, null if none - * @param background background color of the style, null if none - * @param fontStyle font style of the style, may be SWT.NORMAL, SWT.ITALIC or SWT.BOLD - */ -public StyleRange(int start, int length, Color foreground, Color background, int fontStyle) { - this(start, length, foreground, background); - this.fontStyle = fontStyle; -} - -/** - * Compares the argument to the receiver, and returns true - * if they represent the same object using a class - * specific comparison. - * - * @param object the object to compare with this object - * @return true if the object is the same as this object and false otherwise - * - * @see #hashCode() - */ -public boolean equals(Object object) { - if (object == this) return true; - if (object instanceof StyleRange) { - StyleRange style = (StyleRange)object; - if (start != style.start) return false; - if (length != style.length) return false; - return similarTo(style); - } - return false; -} - -/** - * Returns an integer hash code for the receiver. Any two - * objects that return true when passed to - * equals must return the same value for this - * method. - * - * @return the receiver's hash - * - * @see #equals(Object) - */ -public int hashCode() { - return super.hashCode() ^ fontStyle; -} -boolean isVariableHeight() { - return font != null || metrics != null || rise != 0; -} -/** - * Returns whether or not the receiver is unstyled (i.e., does not have any - * style attributes specified). - * - * @return true if the receiver is unstyled, false otherwise. - */ -public boolean isUnstyled() { - if (font != null) return false; - if (rise != 0) return false; - if (metrics != null) return false; - if (foreground != null) return false; - if (background != null) return false; - if (fontStyle != SWT.NORMAL) return false; - if (underline) return false; - if (strikeout) return false; - if (borderStyle != SWT.NONE) return false; - return true; -} - -/** - * Compares the specified object to this StyleRange and answer if the two - * are similar. The object must be an instance of StyleRange and have the - * same field values for except for start and length. - * - * @param style the object to compare with this object - * @return true if the objects are similar, false otherwise - */ -public boolean similarTo(StyleRange style) { - if (!super.equals(style)) return false; - if (fontStyle != style.fontStyle) return false; - return true; -} - -/** - * Returns a new StyleRange with the same values as this StyleRange. - * - * @return a shallow copy of this StyleRange - */ -public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the StyleRange - */ -public String toString() { - StringBuffer buffer = new StringBuffer(); - buffer.append("StyleRange {"); - buffer.append(start); - buffer.append(", "); - buffer.append(length); - buffer.append(", fontStyle="); - switch (fontStyle) { - case SWT.BOLD: - buffer.append("bold"); - break; - case SWT.ITALIC: - buffer.append("italic"); - break; - case SWT.BOLD | SWT.ITALIC: - buffer.append("bold-italic"); - break; - default: - buffer.append("normal"); - } - String str = super.toString(); - int index = str.indexOf('{'); - str = str.substring(index + 1); - if (str.length() > 1) buffer.append(", "); - buffer.append(str); - return buffer.toString(); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledText.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledText.java deleted file mode 100755 index 50e1587b2e..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledText.java +++ /dev/null @@ -1,9475 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 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.swt.custom; - - -import java.util.*; - -import org.eclipse.swt.*; -import org.eclipse.swt.accessibility.*; -import org.eclipse.swt.dnd.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.internal.*; -import org.eclipse.swt.printing.*; -import org.eclipse.swt.widgets.*; - -/** - * A StyledText is an editable user interface object that displays lines - * of text. The following style attributes can be defined for the text: - *
      - *
    • foreground color - *
    • background color - *
    • font style (bold, italic, bold-italic, regular) - *
    • underline - *
    • strikeout - *
    - *

    - * In addition to text style attributes, the background color of a line may - * be specified. - *

    - * There are two ways to use this widget when specifying text style information. - * You may use the API that is defined for StyledText or you may define your own - * LineStyleListener. If you define your own listener, you will be responsible - * for maintaining the text style information for the widget. IMPORTANT: You may - * not define your own listener and use the StyledText API. The following - * StyledText API is not supported if you have defined a LineStyleListener: - *

      - *
    • getStyleRangeAtOffset(int) - *
    • getStyleRanges() - *
    • replaceStyleRanges(int,int,StyleRange[]) - *
    • setStyleRange(StyleRange) - *
    • setStyleRanges(StyleRange[]) - *
    - *

    - * There are two ways to use this widget when specifying line background colors. - * You may use the API that is defined for StyledText or you may define your own - * LineBackgroundListener. If you define your own listener, you will be responsible - * for maintaining the line background color information for the widget. - * IMPORTANT: You may not define your own listener and use the StyledText API. - * The following StyledText API is not supported if you have defined a - * LineBackgroundListener: - *

      - *
    • getLineBackground(int) - *
    • setLineBackground(int,int,Color) - *
    - *

    - * The content implementation for this widget may also be user-defined. To do so, - * you must implement the StyledTextContent interface and use the StyledText API - * setContent(StyledTextContent) to initialize the widget. - *

    - *

    - *
    Styles:
    FULL_SELECTION, MULTI, READ_ONLY, SINGLE, WRAP - *
    Events:
    ExtendedModify, LineGetBackground, LineGetSegments, LineGetStyle, Modify, Selection, Verify, VerifyKey - *
    - *

    - * IMPORTANT: This class is not intended to be subclassed. - *

    - * - * @see StyledText snippets - * @see SWT Examples: CustomControlExample, TextEditor - * @see Sample code and further information - * @noextend This class is not intended to be subclassed by clients. - */ -public class StyledText extends Canvas { - static final char TAB = '\t'; - static final String PlatformLineDelimiter = System.getProperty("line.separator"); - static final int BIDI_CARET_WIDTH = 3; - static final int DEFAULT_WIDTH = 64; - static final int DEFAULT_HEIGHT = 64; - static final int V_SCROLL_RATE = 50; - static final int H_SCROLL_RATE = 10; - - static final int ExtendedModify = 3000; - static final int LineGetBackground = 3001; - static final int LineGetStyle = 3002; - static final int TextChanging = 3003; - static final int TextSet = 3004; - static final int VerifyKey = 3005; - static final int TextChanged = 3006; - static final int LineGetSegments = 3007; - static final int PaintObject = 3008; - static final int WordNext = 3009; - static final int WordPrevious = 3010; - static final int CaretMoved = 3011; - - static final int PREVIOUS_OFFSET_TRAILING = 0; - static final int OFFSET_LEADING = 1; - - Color selectionBackground; // selection background color - Color selectionForeground; // selection foreground color - StyledTextContent content; // native content (default or user specified) - StyledTextRenderer renderer; - Listener listener; - TextChangeListener textChangeListener; // listener for TextChanging, TextChanged and TextSet events from StyledTextContent - int verticalScrollOffset = 0; // pixel based - int horizontalScrollOffset = 0; // pixel based - int topIndex = 0; // top visible line - int topIndexY; - int clientAreaHeight = 0; // the client area height. Needed to calculate content width for new visible lines during Resize callback - int clientAreaWidth = 0; // the client area width. Needed during Resize callback to determine if line wrap needs to be recalculated - int tabLength = 4; // number of characters in a tab - int leftMargin; - int topMargin; - int rightMargin; - int bottomMargin; - Color marginColor; - int columnX; // keep track of the horizontal caret position when changing lines/pages. Fixes bug 5935 - int caretOffset; - int caretAlignment; - Point selection = new Point(0, 0); // x and y are start and end caret offsets of selection - Point clipboardSelection; // x and y are start and end caret offsets of previous selection - int selectionAnchor; // position of selection anchor. 0 based offset from beginning of text - Point doubleClickSelection; // selection after last mouse double click - boolean editable = true; - boolean wordWrap = false; - boolean doubleClickEnabled = true; // see getDoubleClickEnabled - boolean overwrite = false; // insert/overwrite edit mode - int textLimit = -1; // limits the number of characters the user can type in the widget. Unlimited by default. - Hashtable keyActionMap = new Hashtable(); - Color background = null; // workaround for bug 4791 - Color foreground = null; // - Clipboard clipboard; - int clickCount; - int autoScrollDirection = SWT.NULL; // the direction of autoscrolling (up, down, right, left) - int autoScrollDistance = 0; - int lastTextChangeStart; // cache data of the - int lastTextChangeNewLineCount; // last text changing - int lastTextChangeNewCharCount; // event for use in the - int lastTextChangeReplaceLineCount; // text changed handler - int lastTextChangeReplaceCharCount; - int lastCharCount = 0; - int lastLineBottom; // the bottom pixel of the last line been replaced - boolean isMirrored; - boolean bidiColoring = false; // apply the BIDI algorithm on text segments of the same color - Image leftCaretBitmap = null; - Image rightCaretBitmap = null; - int caretDirection = SWT.NULL; - int caretWidth = 0; - Caret defaultCaret = null; - boolean updateCaretDirection = true; - boolean fixedLineHeight; - boolean dragDetect = true; - IME ime; - Cursor cursor; - int alignment; - boolean justify; - int indent; - int lineSpacing; - int alignmentMargin; - - //block selection - boolean blockSelection; - int blockXAnchor = -1, blockYAnchor = -1; - int blockXLocation = -1, blockYLocation = -1; - - - final static boolean IS_MAC, IS_GTK, IS_MOTIF; - static { - String platform = SWT.getPlatform(); - IS_MAC = "carbon".equals(platform) || "cocoa".equals(platform); - IS_GTK = "gtk".equals(platform); - IS_MOTIF = "motif".equals(platform); - } - - /** - * The Printing class implements printing of a range of text. - * An instance of Printing is returned in the - * StyledText#print(Printer) API. The run() method may be - * invoked from any thread. - */ - static class Printing implements Runnable { - final static int LEFT = 0; // left aligned header/footer segment - final static int CENTER = 1; // centered header/footer segment - final static int RIGHT = 2; // right aligned header/footer segment - - Printer printer; - StyledTextRenderer printerRenderer; - StyledTextPrintOptions printOptions; - Rectangle clientArea; - FontData fontData; - Font printerFont; - Hashtable resources; - int tabLength; - GC gc; // printer GC - int pageWidth; // width of a printer page in pixels - int startPage; // first page to print - int endPage; // last page to print - int startLine; // first (wrapped) line to print - int endLine; // last (wrapped) line to print - boolean singleLine; // widget single line mode - Point selection = null; // selected text - boolean mirrored; // indicates the printing gc should be mirrored - int lineSpacing; - int printMargin; - - /** - * Creates an instance of Printing. - * Copies the widget content and rendering data that needs - * to be requested from listeners. - *

    - * @param parent StyledText widget to print. - * @param printer printer device to print on. - * @param printOptions print options - */ - Printing(StyledText styledText, Printer printer, StyledTextPrintOptions printOptions) { - this.printer = printer; - this.printOptions = printOptions; - this.mirrored = (styledText.getStyle() & SWT.MIRRORED) != 0; - singleLine = styledText.isSingleLine(); - startPage = 1; - endPage = Integer.MAX_VALUE; - PrinterData data = printer.getPrinterData(); - if (data.scope == PrinterData.PAGE_RANGE) { - startPage = data.startPage; - endPage = data.endPage; - if (endPage < startPage) { - int temp = endPage; - endPage = startPage; - startPage = temp; - } - } else if (data.scope == PrinterData.SELECTION) { - selection = styledText.getSelectionRange(); - } - printerRenderer = new StyledTextRenderer(printer, null); - printerRenderer.setContent(copyContent(styledText.getContent())); - cacheLineData(styledText); - } - /** - * Caches all line data that needs to be requested from a listener. - *

    - * @param printerContent StyledTextContent to request - * line data for. - */ - void cacheLineData(StyledText styledText) { - StyledTextRenderer renderer = styledText.renderer; - renderer.copyInto(printerRenderer); - fontData = styledText.getFont().getFontData()[0]; - tabLength = styledText.tabLength; - int lineCount = printerRenderer.lineCount; - if (styledText.isListening(LineGetBackground) || (styledText.isBidi() && styledText.isListening(LineGetSegments)) || styledText.isListening(LineGetStyle)) { - StyledTextContent content = printerRenderer.content; - for (int i = 0; i < lineCount; i++) { - String line = content.getLine(i); - int lineOffset = content.getOffsetAtLine(i); - StyledTextEvent event = styledText.getLineBackgroundData(lineOffset, line); - if (event != null && event.lineBackground != null) { - printerRenderer.setLineBackground(i, 1, event.lineBackground); - } - if (styledText.isBidi()) { - int[] segments = styledText.getBidiSegments(lineOffset, line); - printerRenderer.setLineSegments(i, 1, segments); - } - event = styledText.getLineStyleData(lineOffset, line); - if (event != null) { - printerRenderer.setLineIndent(i, 1, event.indent); - printerRenderer.setLineAlignment(i, 1, event.alignment); - printerRenderer.setLineJustify(i, 1, event.justify); - printerRenderer.setLineBullet(i, 1, event.bullet); - StyleRange[] styles = event.styles; - if (styles != null && styles.length > 0) { - printerRenderer.setStyleRanges(event.ranges, styles); - } - } - } - } - Point screenDPI = styledText.getDisplay().getDPI(); - Point printerDPI = printer.getDPI(); - resources = new Hashtable (); - for (int i = 0; i < lineCount; i++) { - Color color = printerRenderer.getLineBackground(i, null); - if (color != null) { - if (printOptions.printLineBackground) { - Color printerColor = (Color)resources.get(color); - if (printerColor == null) { - printerColor = new Color (printer, color.getRGB()); - resources.put(color, printerColor); - } - printerRenderer.setLineBackground(i, 1, printerColor); - } else { - printerRenderer.setLineBackground(i, 1, null); - } - } - int indent = printerRenderer.getLineIndent(i, 0); - if (indent != 0) { - printerRenderer.setLineIndent(i, 1, indent * printerDPI.x / screenDPI.x); - } - } - StyleRange[] styles = printerRenderer.styles; - for (int i = 0; i < printerRenderer.styleCount; i++) { - StyleRange style = styles[i]; - Font font = style.font; - if (style.font != null) { - Font printerFont = (Font)resources.get(font); - if (printerFont == null) { - printerFont = new Font (printer, font.getFontData()); - resources.put(font, printerFont); - } - style.font = printerFont; - } - Color color = style.foreground; - if (color != null) { - Color printerColor = (Color)resources.get(color); - if (printOptions.printTextForeground) { - if (printerColor == null) { - printerColor = new Color (printer, color.getRGB()); - resources.put(color, printerColor); - } - style.foreground = printerColor; - } else { - style.foreground = null; - } - } - color = style.background; - if (color != null) { - Color printerColor = (Color)resources.get(color); - if (printOptions.printTextBackground) { - if (printerColor == null) { - printerColor = new Color (printer, color.getRGB()); - resources.put(color, printerColor); - } - style.background = printerColor; - } else { - style.background = null; - } - } - if (!printOptions.printTextFontStyle) { - style.fontStyle = SWT.NORMAL; - } - style.rise = style.rise * printerDPI.y / screenDPI.y; - GlyphMetrics metrics = style.metrics; - if (metrics != null) { - metrics.ascent = metrics.ascent * printerDPI.y / screenDPI.y; - metrics.descent = metrics.descent * printerDPI.y / screenDPI.y; - metrics.width = metrics.width * printerDPI.x / screenDPI.x; - } - } - lineSpacing = styledText.lineSpacing * printerDPI.y / screenDPI.y; - if (printOptions.printLineNumbers) { - printMargin = 3 * printerDPI.x / screenDPI.x; - } - } - /** - * Copies the text of the specified StyledTextContent. - *

    - * @param original the StyledTextContent to copy. - */ - StyledTextContent copyContent(StyledTextContent original) { - StyledTextContent printerContent = new DefaultContent(); - int insertOffset = 0; - for (int i = 0; i < original.getLineCount(); i++) { - int insertEndOffset; - if (i < original.getLineCount() - 1) { - insertEndOffset = original.getOffsetAtLine(i + 1); - } else { - insertEndOffset = original.getCharCount(); - } - printerContent.replaceTextRange(insertOffset, 0, original.getTextRange(insertOffset, insertEndOffset - insertOffset)); - insertOffset = insertEndOffset; - } - return printerContent; - } - /** - * Disposes of the resources and the PrintRenderer. - */ - void dispose() { - if (gc != null) { - gc.dispose(); - gc = null; - } - if (resources != null) { - Enumeration enumeration = resources.elements(); - while (enumeration.hasMoreElements()) { - Resource resource = (Resource) enumeration.nextElement(); - resource.dispose(); - } - resources = null; - } - if (printerFont != null) { - printerFont.dispose(); - printerFont = null; - } - if (printerRenderer != null) { - printerRenderer.dispose(); - printerRenderer = null; - } - } - void init() { - Rectangle trim = printer.computeTrim(0, 0, 0, 0); - Point dpi = printer.getDPI(); - - printerFont = new Font(printer, fontData.getName(), fontData.getHeight(), SWT.NORMAL); - clientArea = printer.getClientArea(); - pageWidth = clientArea.width; - // one inch margin around text - clientArea.x = dpi.x + trim.x; - clientArea.y = dpi.y + trim.y; - clientArea.width -= (clientArea.x + trim.width); - clientArea.height -= (clientArea.y + trim.height); - - int style = mirrored ? SWT.RIGHT_TO_LEFT : SWT.LEFT_TO_RIGHT; - gc = new GC(printer, style); - gc.setFont(printerFont); - printerRenderer.setFont(printerFont, tabLength); - int lineHeight = printerRenderer.getLineHeight(); - if (printOptions.header != null) { - clientArea.y += lineHeight * 2; - clientArea.height -= lineHeight * 2; - } - if (printOptions.footer != null) { - clientArea.height -= lineHeight * 2; - } - - // TODO not wrapped - StyledTextContent content = printerRenderer.content; - startLine = 0; - endLine = singleLine ? 0 : content.getLineCount() - 1; - PrinterData data = printer.getPrinterData(); - if (data.scope == PrinterData.PAGE_RANGE) { - int pageSize = clientArea.height / lineHeight;//WRONG - startLine = (startPage - 1) * pageSize; - } else if (data.scope == PrinterData.SELECTION) { - startLine = content.getLineAtOffset(selection.x); - if (selection.y > 0) { - endLine = content.getLineAtOffset(selection.x + selection.y - 1); - } else { - endLine = startLine - 1; - } - } - } - /** - * Prints the lines in the specified page range. - */ - void print() { - Color background = gc.getBackground(); - Color foreground = gc.getForeground(); - int paintY = clientArea.y; - int paintX = clientArea.x; - int width = clientArea.width; - int page = startPage; - int pageBottom = clientArea.y + clientArea.height; - int orientation = gc.getStyle() & (SWT.RIGHT_TO_LEFT | SWT.LEFT_TO_RIGHT); - TextLayout printLayout = null; - if (printOptions.printLineNumbers || printOptions.header != null || printOptions.footer != null) { - printLayout = new TextLayout(printer); - printLayout.setFont(printerFont); - } - if (printOptions.printLineNumbers) { - int numberingWidth = 0; - int count = endLine - startLine + 1; - String[] lineLabels = printOptions.lineLabels; - if (lineLabels != null) { - for (int i = startLine; i < Math.min(count, lineLabels.length); i++) { - if (lineLabels[i] != null) { - printLayout.setText(lineLabels[i]); - int lineWidth = printLayout.getBounds().width; - numberingWidth = Math.max(numberingWidth, lineWidth); - } - } - } else { - StringBuffer buffer = new StringBuffer("0"); - while ((count /= 10) > 0) buffer.append("0"); - printLayout.setText(buffer.toString()); - numberingWidth = printLayout.getBounds().width; - } - numberingWidth += printMargin; - if (numberingWidth > width) numberingWidth = width; - paintX += numberingWidth; - width -= numberingWidth; - } - for (int i = startLine; i <= endLine && page <= endPage; i++) { - if (paintY == clientArea.y) { - printer.startPage(); - printDecoration(page, true, printLayout); - } - TextLayout layout = printerRenderer.getTextLayout(i, orientation, width, lineSpacing); - Color lineBackground = printerRenderer.getLineBackground(i, background); - int paragraphBottom = paintY + layout.getBounds().height; - if (paragraphBottom <= pageBottom) { - //normal case, the whole paragraph fits in the current page - printLine(paintX, paintY, gc, foreground, lineBackground, layout, printLayout, i); - paintY = paragraphBottom; - } else { - int lineCount = layout.getLineCount(); - while (paragraphBottom > pageBottom && lineCount > 0) { - lineCount--; - paragraphBottom -= layout.getLineBounds(lineCount).height + layout.getSpacing(); - } - if (lineCount == 0) { - //the whole paragraph goes to the next page - printDecoration(page, false, printLayout); - printer.endPage(); - page++; - if (page <= endPage) { - printer.startPage(); - printDecoration(page, true, printLayout); - paintY = clientArea.y; - printLine(paintX, paintY, gc, foreground, lineBackground, layout, printLayout, i); - paintY += layout.getBounds().height; - } - } else { - //draw paragraph top in the current page and paragraph bottom in the next - int height = paragraphBottom - paintY; - gc.setClipping(clientArea.x, paintY, clientArea.width, height); - printLine(paintX, paintY, gc, foreground, lineBackground, layout, printLayout, i); - gc.setClipping((Rectangle)null); - printDecoration(page, false, printLayout); - printer.endPage(); - page++; - if (page <= endPage) { - printer.startPage(); - printDecoration(page, true, printLayout); - paintY = clientArea.y - height; - int layoutHeight = layout.getBounds().height; - gc.setClipping(clientArea.x, clientArea.y, clientArea.width, layoutHeight - height); - printLine(paintX, paintY, gc, foreground, lineBackground, layout, printLayout, i); - gc.setClipping((Rectangle)null); - paintY += layoutHeight; - } - } - } - printerRenderer.disposeTextLayout(layout); - } - if (page <= endPage && paintY > clientArea.y) { - // close partial page - printDecoration(page, false, printLayout); - printer.endPage(); - } - if (printLayout != null) printLayout.dispose(); - } - /** - * Print header or footer decorations. - * - * @param page page number to print, if specified in the StyledTextPrintOptions header or footer. - * @param header true = print the header, false = print the footer - */ - void printDecoration(int page, boolean header, TextLayout layout) { - String text = header ? printOptions.header : printOptions.footer; - if (text == null) return; - int lastSegmentIndex = 0; - for (int i = 0; i < 3; i++) { - int segmentIndex = text.indexOf(StyledTextPrintOptions.SEPARATOR, lastSegmentIndex); - String segment; - if (segmentIndex == -1) { - segment = text.substring(lastSegmentIndex); - printDecorationSegment(segment, i, page, header, layout); - break; - } else { - segment = text.substring(lastSegmentIndex, segmentIndex); - printDecorationSegment(segment, i, page, header, layout); - lastSegmentIndex = segmentIndex + StyledTextPrintOptions.SEPARATOR.length(); - } - } - } - /** - * Print one segment of a header or footer decoration. - * Headers and footers have three different segments. - * One each for left aligned, centered, and right aligned text. - * - * @param segment decoration segment to print - * @param alignment alignment of the segment. 0=left, 1=center, 2=right - * @param page page number to print, if specified in the decoration segment. - * @param header true = print the header, false = print the footer - */ - void printDecorationSegment(String segment, int alignment, int page, boolean header, TextLayout layout) { - int pageIndex = segment.indexOf(StyledTextPrintOptions.PAGE_TAG); - if (pageIndex != -1) { - int pageTagLength = StyledTextPrintOptions.PAGE_TAG.length(); - StringBuffer buffer = new StringBuffer(segment.substring (0, pageIndex)); - buffer.append (page); - buffer.append (segment.substring(pageIndex + pageTagLength)); - segment = buffer.toString(); - } - if (segment.length() > 0) { - layout.setText(segment); - int segmentWidth = layout.getBounds().width; - int segmentHeight = printerRenderer.getLineHeight(); - int drawX = 0, drawY; - if (alignment == LEFT) { - drawX = clientArea.x; - } else if (alignment == CENTER) { - drawX = (pageWidth - segmentWidth) / 2; - } else if (alignment == RIGHT) { - drawX = clientArea.x + clientArea.width - segmentWidth; - } - if (header) { - drawY = clientArea.y - segmentHeight * 2; - } else { - drawY = clientArea.y + clientArea.height + segmentHeight; - } - layout.draw(gc, drawX, drawY); - } - } - void printLine(int x, int y, GC gc, Color foreground, Color background, TextLayout layout, TextLayout printLayout, int index) { - if (background != null) { - Rectangle rect = layout.getBounds(); - gc.setBackground(background); - gc.fillRectangle(x, y, rect.width, rect.height); - -// int lineCount = layout.getLineCount(); -// for (int i = 0; i < lineCount; i++) { -// Rectangle rect = layout.getLineBounds(i); -// rect.x += paintX; -// rect.y += paintY + layout.getSpacing(); -// rect.width = width;//layout bounds -// gc.fillRectangle(rect); -// } - } - if (printOptions.printLineNumbers) { - FontMetrics metrics = layout.getLineMetrics(0); - printLayout.setAscent(metrics.getAscent() + metrics.getLeading()); - printLayout.setDescent(metrics.getDescent()); - String[] lineLabels = printOptions.lineLabels; - if (lineLabels != null) { - if (0 <= index && index < lineLabels.length && lineLabels[index] != null) { - printLayout.setText(lineLabels[index]); - } else { - printLayout.setText(""); - } - } else { - printLayout.setText(String.valueOf(index)); - } - int paintX = x - printMargin - printLayout.getBounds().width; - printLayout.draw(gc, paintX, y); - printLayout.setAscent(-1); - printLayout.setDescent(-1); - } - gc.setForeground(foreground); - layout.draw(gc, x, y); - } - /** - * Starts a print job and prints the pages specified in the constructor. - */ - public void run() { - String jobName = printOptions.jobName; - if (jobName == null) { - jobName = "Printing"; - } - if (printer.startJob(jobName)) { - init(); - print(); - dispose(); - printer.endJob(); - } - } - } - /** - * The RTFWriter class is used to write widget content as - * rich text. The implementation complies with the RTF specification - * version 1.5. - *

    - * toString() is guaranteed to return a valid RTF string only after - * close() has been called. - *

    - * Whole and partial lines and line breaks can be written. Lines will be - * formatted using the styles queried from the LineStyleListener, if - * set, or those set directly in the widget. All styles are applied to - * the RTF stream like they are rendered by the widget. In addition, the - * widget font name and size is used for the whole text. - *

    - */ - class RTFWriter extends TextWriter { - static final int DEFAULT_FOREGROUND = 0; - static final int DEFAULT_BACKGROUND = 1; - Vector colorTable, fontTable; - boolean WriteUnicode; - - /** - * Creates a RTF writer that writes content starting at offset "start" - * in the document. start and lengthcan be set to specify partial - * lines. - * - * @param start start offset of content to write, 0 based from - * beginning of document - * @param length length of content to write - */ - public RTFWriter(int start, int length) { - super(start, length); - colorTable = new Vector(); - fontTable = new Vector(); - colorTable.addElement(getForeground()); - colorTable.addElement(getBackground()); - fontTable.addElement(getFont()); - setUnicode(); - } - /** - * Closes the RTF writer. Once closed no more content can be written. - * NOTE: toString() does not return a valid RTF string until - * close() has been called. - */ - public void close() { - if (!isClosed()) { - writeHeader(); - write("\n}}\0"); - super.close(); - } - } - /** - * Returns the index of the specified color in the RTF color table. - * - * @param color the color - * @param defaultIndex return value if color is null - * @return the index of the specified color in the RTF color table - * or "defaultIndex" if "color" is null. - */ - int getColorIndex(Color color, int defaultIndex) { - if (color == null) return defaultIndex; - int index = colorTable.indexOf(color); - if (index == -1) { - index = colorTable.size(); - colorTable.addElement(color); - } - return index; - } - /** - * Returns the index of the specified color in the RTF color table. - * - * @param color the color - * @param defaultIndex return value if color is null - * @return the index of the specified color in the RTF color table - * or "defaultIndex" if "color" is null. - */ - int getFontIndex(Font font) { - int index = fontTable.indexOf(font); - if (index == -1) { - index = fontTable.size(); - fontTable.addElement(font); - } - return index; - } - /** - * Determines if Unicode RTF should be written. - * Don't write Unicode RTF on Windows 95/98/ME or NT. - */ - void setUnicode() { - final String Win95 = "windows 95"; - final String Win98 = "windows 98"; - final String WinME = "windows me"; - final String WinNT = "windows nt"; - String osName = System.getProperty("os.name").toLowerCase(); - String osVersion = System.getProperty("os.version"); - int majorVersion = 0; - - if (osName.startsWith(WinNT) && osVersion != null) { - int majorIndex = osVersion.indexOf('.'); - if (majorIndex != -1) { - osVersion = osVersion.substring(0, majorIndex); - try { - majorVersion = Integer.parseInt(osVersion); - } catch (NumberFormatException exception) { - // ignore exception. version number remains unknown. - // will write without Unicode - } - } - } - WriteUnicode = !osName.startsWith(Win95) && - !osName.startsWith(Win98) && - !osName.startsWith(WinME) && - (!osName.startsWith(WinNT) || majorVersion > 4); - } - /** - * Appends the specified segment of "string" to the RTF data. - * Copy from start up to, but excluding, end. - * - * @param string string to copy a segment from. Must not contain - * line breaks. Line breaks should be written using writeLineDelimiter() - * @param start start offset of segment. 0 based. - * @param end end offset of segment - */ - void write(String string, int start, int end) { - for (int index = start; index < end; index++) { - char ch = string.charAt(index); - if (ch > 0xFF && WriteUnicode) { - // write the sub string from the last escaped character - // to the current one. Fixes bug 21698. - if (index > start) { - write(string.substring(start, index)); - } - write("\\u"); - write(Integer.toString((short) ch)); - write('?'); // ANSI representation (1 byte long, \\uc1) - start = index + 1; - } else if (ch == '}' || ch == '{' || ch == '\\') { - // write the sub string from the last escaped character - // to the current one. Fixes bug 21698. - if (index > start) { - write(string.substring(start, index)); - } - write('\\'); - write(ch); - start = index + 1; - } - } - // write from the last escaped character to the end. - // Fixes bug 21698. - if (start < end) { - write(string.substring(start, end)); - } - } - /** - * Writes the RTF header including font table and color table. - */ - void writeHeader() { - StringBuffer header = new StringBuffer(); - FontData fontData = getFont().getFontData()[0]; - header.append("{\\rtf1\\ansi"); - // specify code page, necessary for copy to work in bidi - // systems that don't support Unicode RTF. - String cpg = System.getProperty("file.encoding").toLowerCase(); - if (cpg.startsWith("cp") || cpg.startsWith("ms")) { - cpg = cpg.substring(2, cpg.length()); - header.append("\\ansicpg"); - header.append(cpg); - } - header.append("\\uc1\\deff0{\\fonttbl{\\f0\\fnil "); - header.append(fontData.getName()); - header.append(";"); - for (int i = 1; i < fontTable.size(); i++) { - header.append("\\f"); - header.append(i); - header.append(" "); - FontData fd = ((Font)fontTable.elementAt(i)).getFontData()[0]; - header.append(fd.getName()); - header.append(";"); - } - header.append("}}\n{\\colortbl"); - for (int i = 0; i < colorTable.size(); i++) { - Color color = (Color) colorTable.elementAt(i); - header.append("\\red"); - header.append(color.getRed()); - header.append("\\green"); - header.append(color.getGreen()); - header.append("\\blue"); - header.append(color.getBlue()); - header.append(";"); - } - // some RTF readers ignore the deff0 font tag. Explicitly - // set the font for the whole document to work around this. - header.append("}\n{\\f0\\fs"); - // font size is specified in half points - header.append(fontData.getHeight() * 2); - header.append(" "); - write(header.toString(), 0); - } - /** - * Appends the specified line text to the RTF data. Lines will be formatted - * using the styles queried from the LineStyleListener, if set, or those set - * directly in the widget. - * - * @param line line text to write as RTF. Must not contain line breaks - * Line breaks should be written using writeLineDelimiter() - * @param lineOffset offset of the line. 0 based from the start of the - * widget document. Any text occurring before the start offset or after the - * end offset specified during object creation is ignored. - * @exception SWTException
      - *
    • ERROR_IO when the writer is closed.
    • - *
    - */ - public void writeLine(String line, int lineOffset) { - if (isClosed()) { - SWT.error(SWT.ERROR_IO); - } - int lineIndex = content.getLineAtOffset(lineOffset); - int lineAlignment, lineIndent; - boolean lineJustify; - int[] ranges; - StyleRange[] styles; - StyledTextEvent event = getLineStyleData(lineOffset, line); - if (event != null) { - lineAlignment = event.alignment; - lineIndent = event.indent; - lineJustify = event.justify; - ranges = event.ranges; - styles = event.styles; - } else { - lineAlignment = renderer.getLineAlignment(lineIndex, alignment); - lineIndent = renderer.getLineIndent(lineIndex, indent); - lineJustify = renderer.getLineJustify(lineIndex, justify); - ranges = renderer.getRanges(lineOffset, line.length()); - styles = renderer.getStyleRanges(lineOffset, line.length(), false); - } - if (styles == null) styles = new StyleRange[0]; - Color lineBackground = renderer.getLineBackground(lineIndex, null); - event = getLineBackgroundData(lineOffset, line); - if (event != null && event.lineBackground != null) lineBackground = event.lineBackground; - writeStyledLine(line, lineOffset, ranges, styles, lineBackground, lineIndent, lineAlignment, lineJustify); - } - /** - * Appends the specified line delimiter to the RTF data. - * - * @param lineDelimiter line delimiter to write as RTF. - * @exception SWTException
      - *
    • ERROR_IO when the writer is closed.
    • - *
    - */ - public void writeLineDelimiter(String lineDelimiter) { - if (isClosed()) { - SWT.error(SWT.ERROR_IO); - } - write(lineDelimiter, 0, lineDelimiter.length()); - write("\\par "); - } - /** - * Appends the specified line text to the RTF data. - *

    - * Use the colors and font styles specified in "styles" and "lineBackground". - * Formatting is written to reflect the text rendering by the text widget. - * Style background colors take precedence over the line background color. - * Background colors are written using the \highlight tag (vs. the \cb tag). - *

    - * - * @param line line text to write as RTF. Must not contain line breaks - * Line breaks should be written using writeLineDelimiter() - * @param lineOffset offset of the line. 0 based from the start of the - * widget document. Any text occurring before the start offset or after the - * end offset specified during object creation is ignored. - * @param styles styles to use for formatting. Must not be null. - * @param lineBackground line background color to use for formatting. - * May be null. - */ - void writeStyledLine(String line, int lineOffset, int ranges[], StyleRange[] styles, Color lineBackground, int indent, int alignment, boolean justify) { - int lineLength = line.length(); - int startOffset = getStart(); - int writeOffset = startOffset - lineOffset; - if (writeOffset >= lineLength) return; - int lineIndex = Math.max(0, writeOffset); - - write("\\fi"); - write(indent); - switch (alignment) { - case SWT.LEFT: write("\\ql"); break; - case SWT.CENTER: write("\\qc"); break; - case SWT.RIGHT: write("\\qr"); break; - } - if (justify) write("\\qj"); - write(" "); - - if (lineBackground != null) { - write("{\\highlight"); - write(getColorIndex(lineBackground, DEFAULT_BACKGROUND)); - write(" "); - } - int endOffset = startOffset + super.getCharCount(); - int lineEndOffset = Math.min(lineLength, endOffset - lineOffset); - for (int i = 0; i < styles.length; i++) { - StyleRange style = styles[i]; - int start, end; - if (ranges != null) { - start = ranges[i << 1] - lineOffset; - end = start + ranges[(i << 1) + 1]; - } else { - start = style.start - lineOffset; - end = start + style.length; - } - // skip over partial first line - if (end < writeOffset) { - continue; - } - // style starts beyond line end or RTF write end - if (start >= lineEndOffset) { - break; - } - // write any unstyled text - if (lineIndex < start) { - // copy to start of style - // style starting beyond end of write range or end of line - // is guarded against above. - write(line, lineIndex, start); - lineIndex = start; - } - // write styled text - write("{\\cf"); - write(getColorIndex(style.foreground, DEFAULT_FOREGROUND)); - int colorIndex = getColorIndex(style.background, DEFAULT_BACKGROUND); - if (colorIndex != DEFAULT_BACKGROUND) { - write("\\highlight"); - write(colorIndex); - } - Font font = style.font; - if (font != null) { - int fontIndex = getFontIndex(font); - write("\\f"); - write(fontIndex); - FontData fontData = font.getFontData()[0]; - write("\\fs"); - write(fontData.getHeight() * 2); - } else { - if ((style.fontStyle & SWT.BOLD) != 0) { - write("\\b"); - } - if ((style.fontStyle & SWT.ITALIC) != 0) { - write("\\i"); - } - } - if (style.underline) { - write("\\ul"); - } - if (style.strikeout) { - write("\\strike"); - } - write(" "); - // copy to end of style or end of write range or end of line - int copyEnd = Math.min(end, lineEndOffset); - // guard against invalid styles and let style processing continue - copyEnd = Math.max(copyEnd, lineIndex); - write(line, lineIndex, copyEnd); - if (font == null) { - if ((style.fontStyle & SWT.BOLD) != 0) { - write("\\b0"); - } - if ((style.fontStyle & SWT.ITALIC) != 0) { - write("\\i0"); - } - } - if (style.underline) { - write("\\ul0"); - } - if (style.strikeout) { - write("\\strike0"); - } - write("}"); - lineIndex = copyEnd; - } - // write unstyled text at the end of the line - if (lineIndex < lineEndOffset) { - write(line, lineIndex, lineEndOffset); - } - if (lineBackground != null) write("}"); - } - } - /** - * The TextWriter class is used to write widget content to - * a string. Whole and partial lines and line breaks can be written. To write - * partial lines, specify the start and length of the desired segment - * during object creation. - *

    - * NOTE: toString() is guaranteed to return a valid string only after close() - * has been called. - *

    - */ - class TextWriter { - private StringBuffer buffer; - private int startOffset; // offset of first character that will be written - private int endOffset; // offset of last character that will be written. - // 0 based from the beginning of the widget text. - private boolean isClosed = false; - - /** - * Creates a writer that writes content starting at offset "start" - * in the document. start and length can be set to specify partial lines. - * - * @param start start offset of content to write, 0 based from beginning of document - * @param length length of content to write - */ - public TextWriter(int start, int length) { - buffer = new StringBuffer(length); - startOffset = start; - endOffset = start + length; - } - /** - * Closes the writer. Once closed no more content can be written. - * NOTE: toString() is not guaranteed to return a valid string unless - * the writer is closed. - */ - public void close() { - if (!isClosed) { - isClosed = true; - } - } - /** - * Returns the number of characters to write. - * @return the integer number of characters to write - */ - public int getCharCount() { - return endOffset - startOffset; - } - /** - * Returns the offset where writing starts. 0 based from the start of - * the widget text. Used to write partial lines. - * @return the integer offset where writing starts - */ - public int getStart() { - return startOffset; - } - /** - * Returns whether the writer is closed. - * @return a boolean specifying whether or not the writer is closed - */ - public boolean isClosed() { - return isClosed; - } - /** - * Returns the string. close() must be called before toString() - * is guaranteed to return a valid string. - * - * @return the string - */ - public String toString() { - return buffer.toString(); - } - /** - * Appends the given string to the data. - */ - void write(String string) { - buffer.append(string); - } - /** - * Inserts the given string to the data at the specified offset. - *

    - * Do nothing if "offset" is < 0 or > getCharCount() - *

    - * - * @param string text to insert - * @param offset offset in the existing data to insert "string" at. - */ - void write(String string, int offset) { - if (offset < 0 || offset > buffer.length()) { - return; - } - buffer.insert(offset, string); - } - /** - * Appends the given int to the data. - */ - void write(int i) { - buffer.append(i); - } - /** - * Appends the given character to the data. - */ - void write(char i) { - buffer.append(i); - } - /** - * Appends the specified line text to the data. - * - * @param line line text to write. Must not contain line breaks - * Line breaks should be written using writeLineDelimiter() - * @param lineOffset offset of the line. 0 based from the start of the - * widget document. Any text occurring before the start offset or after the - * end offset specified during object creation is ignored. - * @exception SWTException
      - *
    • ERROR_IO when the writer is closed.
    • - *
    - */ - public void writeLine(String line, int lineOffset) { - if (isClosed) { - SWT.error(SWT.ERROR_IO); - } - int writeOffset = startOffset - lineOffset; - int lineLength = line.length(); - int lineIndex; - if (writeOffset >= lineLength) { - return; // whole line is outside write range - } else if (writeOffset > 0) { - lineIndex = writeOffset; // line starts before write start - } else { - lineIndex = 0; - } - int copyEnd = Math.min(lineLength, endOffset - lineOffset); - if (lineIndex < copyEnd) { - write(line.substring(lineIndex, copyEnd)); - } - } - /** - * Appends the specified line delimiter to the data. - * - * @param lineDelimiter line delimiter to write - * @exception SWTException
      - *
    • ERROR_IO when the writer is closed.
    • - *
    - */ - public void writeLineDelimiter(String lineDelimiter) { - if (isClosed) { - SWT.error(SWT.ERROR_IO); - } - write(lineDelimiter); - } - } - -/** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    - * - * @see SWT#FULL_SELECTION - * @see SWT#MULTI - * @see SWT#READ_ONLY - * @see SWT#SINGLE - * @see SWT#WRAP - * @see #getStyle - */ -public StyledText(Composite parent, int style) { - super(parent, checkStyle(style)); - // set the fg in the OS to ensure that these are the same as StyledText, necessary - // for ensuring that the bg/fg the IME box uses is the same as what StyledText uses - super.setForeground(getForeground()); - super.setDragDetect(false); - Display display = getDisplay(); - isMirrored = (super.getStyle() & SWT.MIRRORED) != 0; - fixedLineHeight = true; - if ((style & SWT.READ_ONLY) != 0) { - setEditable(false); - } - leftMargin = rightMargin = isBidiCaret() ? BIDI_CARET_WIDTH - 1: 0; - if ((style & SWT.SINGLE) != 0 && (style & SWT.BORDER) != 0) { - leftMargin = topMargin = rightMargin = bottomMargin = 2; - } - alignment = style & (SWT.LEFT | SWT.RIGHT | SWT.CENTER); - if (alignment == 0) alignment = SWT.LEFT; - clipboard = new Clipboard(display); - installDefaultContent(); - renderer = new StyledTextRenderer(getDisplay(), this); - renderer.setContent(content); - renderer.setFont(getFont(), tabLength); - ime = new IME(this, SWT.NONE); - defaultCaret = new Caret(this, SWT.NONE); - if ((style & SWT.WRAP) != 0) { - setWordWrap(true); - } - if (isBidiCaret()) { - createCaretBitmaps(); - Runnable runnable = new Runnable() { - public void run() { - int direction = BidiUtil.getKeyboardLanguage() == BidiUtil.KEYBOARD_BIDI ? SWT.RIGHT : SWT.LEFT; - if (direction == caretDirection) return; - if (getCaret() != defaultCaret) return; - Point newCaretPos = getPointAtOffset(caretOffset); - setCaretLocation(newCaretPos, direction); - } - }; - BidiUtil.addLanguageListener(this, runnable); - } - setCaret(defaultCaret); - calculateScrollBars(); - createKeyBindings(); - super.setCursor(display.getSystemCursor(SWT.CURSOR_IBEAM)); - installListeners(); - initializeAccessible(); - setData("DEFAULT_DROP_TARGET_EFFECT", new StyledTextDropTargetEffect(this)); -} -/** - * Adds an extended modify listener. An ExtendedModify event is sent by the - * widget when the widget text has changed. - * - * @param extendedModifyListener the listener - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void addExtendedModifyListener(ExtendedModifyListener extendedModifyListener) { - checkWidget(); - if (extendedModifyListener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - StyledTextListener typedListener = new StyledTextListener(extendedModifyListener); - addListener(ExtendedModify, typedListener); -} -/** - * Adds a bidirectional segment listener. - *

    - * A BidiSegmentEvent is sent - * whenever a line of text is measured or rendered. The user can - * specify text ranges in the line that should be treated as if they - * had a different direction than the surrounding text. - * This may be used when adjacent segments of right-to-left text should - * not be reordered relative to each other. - * E.g., Multiple Java string literals in a right-to-left language - * should generally remain in logical order to each other, that is, the - * way they are stored. - *

    - * - * @param listener the listener - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - * @see BidiSegmentEvent - * @since 2.0 - */ -public void addBidiSegmentListener(BidiSegmentListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - addListener(LineGetSegments, new StyledTextListener(listener)); -} -/** - * Adds a caret listener. CaretEvent is sent when the caret offset changes. - * - * @param listener the listener - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - * - * @since 3.5 - */ -public void addCaretListener(CaretListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - addListener(CaretMoved, new StyledTextListener(listener)); -} -/** - * Adds a line background listener. A LineGetBackground event is sent by the - * widget to determine the background color for a line. - * - * @param listener the listener - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void addLineBackgroundListener(LineBackgroundListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (!isListening(LineGetBackground)) { - renderer.clearLineBackground(0, content.getLineCount()); - } - addListener(LineGetBackground, new StyledTextListener(listener)); -} -/** - * Adds a line style listener. A LineGetStyle event is sent by the widget to - * determine the styles for a line. - * - * @param listener the listener - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void addLineStyleListener(LineStyleListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (!isListening(LineGetStyle)) { - setStyleRanges(0, 0, null, null, true); - renderer.clearLineStyle(0, content.getLineCount()); - } - addListener(LineGetStyle, new StyledTextListener(listener)); - setCaretLocation(); -} -/** - * Adds a modify listener. A Modify event is sent by the widget when the widget text - * has changed. - * - * @param modifyListener the listener - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void addModifyListener(ModifyListener modifyListener) { - checkWidget(); - if (modifyListener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - addListener(SWT.Modify, new TypedListener(modifyListener)); -} -/** - * Adds a paint object listener. A paint object event is sent by the widget when an object - * needs to be drawn. - * - * @param listener the listener - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - * - * @since 3.2 - * - * @see PaintObjectListener - * @see PaintObjectEvent - */ -public void addPaintObjectListener(PaintObjectListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - addListener(PaintObject, new StyledTextListener(listener)); -} -/** - * Adds a selection listener. A Selection event is sent by the widget when the - * user changes the selection. - *

    - * When widgetSelected is called, the event x and y fields contain - * the start and end caret indices of the selection. - * widgetDefaultSelected is not called for StyledTexts. - *

    - * - * @param listener the listener which should be notified when the user changes the receiver's selection - - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see SelectionListener - * @see #removeSelectionListener - * @see SelectionEvent - */ -public void addSelectionListener(SelectionListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - addListener(SWT.Selection, new TypedListener(listener)); -} -/** - * Adds a verify key listener. A VerifyKey event is sent by the widget when a key - * is pressed. The widget ignores the key press if the listener sets the doit field - * of the event to false. - * - * @param listener the listener - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void addVerifyKeyListener(VerifyKeyListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - addListener(VerifyKey, new StyledTextListener(listener)); -} -/** - * Adds a verify listener. A Verify event is sent by the widget when the widget text - * is about to change. The listener can set the event text and the doit field to - * change the text that is set in the widget or to force the widget to ignore the - * text change. - * - * @param verifyListener the listener - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void addVerifyListener(VerifyListener verifyListener) { - checkWidget(); - if (verifyListener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - addListener(SWT.Verify, new TypedListener(verifyListener)); -} -/** - * Adds a word movement listener. A movement event is sent when the boundary - * of a word is needed. For example, this occurs during word next and word - * previous actions. - * - * @param movementListener the listener - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - * - * @see MovementEvent - * @see MovementListener - * @see #removeWordMovementListener - * - * @since 3.3 - */ -public void addWordMovementListener(MovementListener movementListener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - addListener(WordNext, new StyledTextListener(movementListener)); - addListener(WordPrevious, new StyledTextListener(movementListener)); -} -/** - * Appends a string to the text at the end of the widget. - * - * @param string the string to be appended - * @see #replaceTextRange(int,int,String) - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void append(String string) { - checkWidget(); - if (string == null) { - SWT.error(SWT.ERROR_NULL_ARGUMENT); - } - int lastChar = Math.max(getCharCount(), 0); - replaceTextRange(lastChar, 0, string); -} -/** - * Calculates the scroll bars - */ -void calculateScrollBars() { - ScrollBar horizontalBar = getHorizontalBar(); - ScrollBar verticalBar = getVerticalBar(); - setScrollBars(true); - if (verticalBar != null) { - verticalBar.setIncrement(getVerticalIncrement()); - } - if (horizontalBar != null) { - horizontalBar.setIncrement(getHorizontalIncrement()); - } -} -/** - * Calculates the top index based on the current vertical scroll offset. - * The top index is the index of the topmost fully visible line or the - * topmost partially visible line if no line is fully visible. - * The top index starts at 0. - */ -void calculateTopIndex(int delta) { - int oldTopIndex = topIndex; - int oldTopIndexY = topIndexY; - if (isFixedLineHeight()) { - int verticalIncrement = getVerticalIncrement(); - if (verticalIncrement == 0) { - return; - } - topIndex = Compatibility.ceil(getVerticalScrollOffset(), verticalIncrement); - // Set top index to partially visible top line if no line is fully - // visible but at least some of the widget client area is visible. - // Fixes bug 15088. - if (topIndex > 0) { - if (clientAreaHeight > 0) { - int bottomPixel = getVerticalScrollOffset() + clientAreaHeight; - int fullLineTopPixel = topIndex * verticalIncrement; - int fullLineVisibleHeight = bottomPixel - fullLineTopPixel; - // set top index to partially visible line if no line fully fits in - // client area or if space is available but not used (the latter should - // never happen because we use claimBottomFreeSpace) - if (fullLineVisibleHeight < verticalIncrement) { - topIndex--; - } - } else if (topIndex >= content.getLineCount()) { - topIndex = content.getLineCount() - 1; - } - } - } else { - if (delta >= 0) { - delta -= topIndexY; - int lineIndex = topIndex; - int lineCount = content.getLineCount(); - while (lineIndex < lineCount) { - if (delta <= 0) break; - delta -= renderer.getLineHeight(lineIndex++); - } - if (lineIndex < lineCount && -delta + renderer.getLineHeight(lineIndex) <= clientAreaHeight - topMargin - bottomMargin) { - topIndex = lineIndex; - topIndexY = -delta; - } else { - topIndex = lineIndex - 1; - topIndexY = -renderer.getLineHeight(topIndex) - delta; - } - } else { - delta -= topIndexY; - int lineIndex = topIndex; - while (lineIndex > 0) { - int lineHeight = renderer.getLineHeight(lineIndex - 1); - if (delta + lineHeight > 0) break; - delta += lineHeight; - lineIndex--; - } - if (lineIndex == 0 || -delta + renderer.getLineHeight(lineIndex) <= clientAreaHeight - topMargin - bottomMargin) { - topIndex = lineIndex; - topIndexY = - delta; - } else { - topIndex = lineIndex - 1; - topIndexY = - renderer.getLineHeight(topIndex) - delta; - } - } - } - if (topIndex != oldTopIndex || oldTopIndexY != topIndexY) { - renderer.calculateClientArea(); - setScrollBars(false); - } -} -/** - * Hides the scroll bars if widget is created in single line mode. - */ -static int checkStyle(int style) { - if ((style & SWT.SINGLE) != 0) { - style &= ~(SWT.H_SCROLL | SWT.V_SCROLL | SWT.WRAP | SWT.MULTI); - } else { - style |= SWT.MULTI; - if ((style & SWT.WRAP) != 0) { - style &= ~SWT.H_SCROLL; - } - } - style |= SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED | SWT.NO_BACKGROUND; - /* Clear SWT.CENTER to avoid the conflict with SWT.EMBEDDED */ - return style & ~SWT.CENTER; -} -/** - * Scrolls down the text to use new space made available by a resize or by - * deleted lines. - */ -void claimBottomFreeSpace() { - if (isFixedLineHeight()) { - int newVerticalOffset = Math.max(0, renderer.getHeight() - clientAreaHeight); - if (newVerticalOffset < getVerticalScrollOffset()) { - scrollVertical(newVerticalOffset - getVerticalScrollOffset(), true); - } - } else { - int bottomIndex = getPartialBottomIndex(); - int height = getLinePixel(bottomIndex + 1); - if (clientAreaHeight > height) { - scrollVertical(-getAvailableHeightAbove(clientAreaHeight - height), true); - } - } -} -/** - * Scrolls text to the right to use new space made available by a resize. - */ -void claimRightFreeSpace() { - int newHorizontalOffset = Math.max(0, renderer.getWidth() - clientAreaWidth); - if (newHorizontalOffset < horizontalScrollOffset) { - // item is no longer drawn past the right border of the client area - // align the right end of the item with the right border of the - // client area (window is scrolled right). - scrollHorizontal(newHorizontalOffset - horizontalScrollOffset, true); - } -} -void clearBlockSelection(boolean reset, boolean sendEvent) { - if (reset) resetSelection(); - blockXAnchor = blockYAnchor = -1; - blockXLocation = blockYLocation = -1; - caretDirection = SWT.NULL; - updateCaretVisibility(); - super.redraw(); - if (sendEvent) sendSelectionEvent(); -} -/** - * Removes the widget selection. - * - * @param sendEvent a Selection event is sent when set to true and when the selection is actually reset. - */ -void clearSelection(boolean sendEvent) { - int selectionStart = selection.x; - int selectionEnd = selection.y; - resetSelection(); - // redraw old selection, if any - if (selectionEnd - selectionStart > 0) { - int length = content.getCharCount(); - // called internally to remove selection after text is removed - // therefore make sure redraw range is valid. - int redrawStart = Math.min(selectionStart, length); - int redrawEnd = Math.min(selectionEnd, length); - if (redrawEnd - redrawStart > 0) { - internalRedrawRange(redrawStart, redrawEnd - redrawStart); - } - if (sendEvent) { - sendSelectionEvent(); - } - } -} -public Point computeSize (int wHint, int hHint, boolean changed) { - checkWidget(); - int lineCount = (getStyle() & SWT.SINGLE) != 0 ? 1 : content.getLineCount(); - int width = 0; - int height = 0; - if (wHint == SWT.DEFAULT || hHint == SWT.DEFAULT) { - Display display = getDisplay(); - int maxHeight = display.getClientArea().height; - for (int lineIndex = 0; lineIndex < lineCount; lineIndex++) { - TextLayout layout = renderer.getTextLayout(lineIndex); - int wrapWidth = layout.getWidth(); - if (wordWrap) layout.setWidth(wHint == 0 ? 1 : wHint); - Rectangle rect = layout.getBounds(); - height += rect.height; - width = Math.max(width, rect.width); - layout.setWidth(wrapWidth); - renderer.disposeTextLayout(layout); - if (isFixedLineHeight() && height > maxHeight) break; - } - if (isFixedLineHeight()) { - height = lineCount * renderer.getLineHeight(); - } - } - // Use default values if no text is defined. - if (width == 0) width = DEFAULT_WIDTH; - if (height == 0) height = DEFAULT_HEIGHT; - if (wHint != SWT.DEFAULT) width = wHint; - if (hHint != SWT.DEFAULT) height = hHint; - int wTrim = leftMargin + rightMargin + getCaretWidth(); - int hTrim = topMargin + bottomMargin; - Rectangle rect = computeTrim(0, 0, width + wTrim, height + hTrim); - return new Point (rect.width, rect.height); -} -/** - * Copies the selected text to the DND.CLIPBOARD clipboard. - *

    - * The text will be put on the clipboard in plain text format and RTF format. - * The DND.CLIPBOARD clipboard is used for data that is - * transferred by keyboard accelerator (such as Ctrl+C/Ctrl+V) or - * by menu action. - *

    - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void copy() { - checkWidget(); - copySelection(DND.CLIPBOARD); -} -/** - * Copies the selected text to the specified clipboard. The text will be put in the - * clipboard in plain text format and RTF format. - *

    - * The clipboardType is one of the clipboard constants defined in class - * DND. The DND.CLIPBOARD clipboard is - * used for data that is transferred by keyboard accelerator (such as Ctrl+C/Ctrl+V) - * or by menu action. The DND.SELECTION_CLIPBOARD - * clipboard is used for data that is transferred by selecting text and pasting - * with the middle mouse button. - *

    - * - * @param clipboardType indicates the type of clipboard - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.1 - */ -public void copy(int clipboardType) { - checkWidget(); - copySelection(clipboardType); -} -boolean copySelection(int type) { - if (type != DND.CLIPBOARD && type != DND.SELECTION_CLIPBOARD) return false; - try { - if (blockSelection && blockXLocation != -1) { - String text = getBlockSelectionText(PlatformLineDelimiter); - if (text.length() > 0) { - //TODO RTF support - TextTransfer plainTextTransfer = TextTransfer.getInstance(); - Object[] data = new Object[]{text}; - Transfer[] types = new Transfer[]{plainTextTransfer}; - clipboard.setContents(data, types, type); - return true; - } - } else { - int length = selection.y - selection.x; - if (length > 0) { - setClipboardContent(selection.x, length, type); - return true; - } - } - } catch (SWTError error) { - // Copy to clipboard failed. This happens when another application - // is accessing the clipboard while we copy. Ignore the error. - // Rethrow all other errors. Fixes bug 17578. - if (error.code != DND.ERROR_CANNOT_SET_CLIPBOARD) { - throw error; - } - } - return false; -} -/** - * Returns the alignment of the widget. - * - * @return the alignment - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see #getLineAlignment(int) - * - * @since 3.2 - */ -public int getAlignment() { - checkWidget(); - return alignment; -} -int getAvailableHeightAbove(int height) { - int maxHeight = verticalScrollOffset; - if (maxHeight == -1) { - int lineIndex = topIndex - 1; - maxHeight = -topIndexY; - if (topIndexY > 0) { - maxHeight += renderer.getLineHeight(lineIndex--); - } - while (height > maxHeight && lineIndex >= 0) { - maxHeight += renderer.getLineHeight(lineIndex--); - } - } - return Math.min(height, maxHeight); -} -int getAvailableHeightBellow(int height) { - int partialBottomIndex = getPartialBottomIndex(); - int topY = getLinePixel(partialBottomIndex); - int lineHeight = renderer.getLineHeight(partialBottomIndex); - int availableHeight = 0; - int clientAreaHeight = this.clientAreaHeight - topMargin - bottomMargin; - if (topY + lineHeight > clientAreaHeight) { - availableHeight = lineHeight - (clientAreaHeight - topY); - } - int lineIndex = partialBottomIndex + 1; - int lineCount = content.getLineCount(); - while (height > availableHeight && lineIndex < lineCount) { - availableHeight += renderer.getLineHeight(lineIndex++); - } - return Math.min(height, availableHeight); -} -/** - * Returns the color of the margins. - * - * @return the color of the margins. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public Color getMarginColor() { - checkWidget(); - return marginColor != null ? marginColor : getBackground(); -} -/** - * Returns a string that uses only the line delimiter specified by the - * StyledTextContent implementation. - *

    - * Returns only the first line if the widget has the SWT.SINGLE style. - *

    - * - * @param text the text that may have line delimiters that don't - * match the model line delimiter. Possible line delimiters - * are CR ('\r'), LF ('\n'), CR/LF ("\r\n") - * @return the converted text that only uses the line delimiter - * specified by the model. Returns only the first line if the widget - * has the SWT.SINGLE style. - */ -String getModelDelimitedText(String text) { - int length = text.length(); - if (length == 0) { - return text; - } - int crIndex = 0; - int lfIndex = 0; - int i = 0; - StringBuffer convertedText = new StringBuffer(length); - String delimiter = getLineDelimiter(); - while (i < length) { - if (crIndex != -1) { - crIndex = text.indexOf(SWT.CR, i); - } - if (lfIndex != -1) { - lfIndex = text.indexOf(SWT.LF, i); - } - if (lfIndex == -1 && crIndex == -1) { // no more line breaks? - break; - } else if ((crIndex < lfIndex && crIndex != -1) || lfIndex == -1) { - convertedText.append(text.substring(i, crIndex)); - if (lfIndex == crIndex + 1) { // CR/LF combination? - i = lfIndex + 1; - } else { - i = crIndex + 1; - } - } else { // LF occurs before CR! - convertedText.append(text.substring(i, lfIndex)); - i = lfIndex + 1; - } - if (isSingleLine()) { - break; - } - convertedText.append(delimiter); - } - // copy remaining text if any and if not in single line mode or no - // text copied thus far (because there only is one line) - if (i < length && (!isSingleLine() || convertedText.length() == 0)) { - convertedText.append(text.substring(i)); - } - return convertedText.toString(); -} -boolean checkDragDetect(Event event) { - if (!isListening(SWT.DragDetect)) return false; - if (IS_MOTIF) { - if (event.button != 2) return false; - } else { - if (event.button != 1) return false; - } - if (blockSelection && blockXLocation != -1) { - Rectangle rect = getBlockSelectionRectangle(); - if (rect.contains(event.x, event.y)) { - return dragDetect(event); - } - } else { - if (selection.x == selection.y) return false; - int offset = getOffsetAtPoint(event.x, event.y, null, true); - if (selection.x <= offset && offset < selection.y) { - return dragDetect(event); - } - } - return false; -} -/** - * Creates default key bindings. - */ -void createKeyBindings() { - int nextKey = isMirrored() ? SWT.ARROW_LEFT : SWT.ARROW_RIGHT; - int previousKey = isMirrored() ? SWT.ARROW_RIGHT : SWT.ARROW_LEFT; - - // Navigation - setKeyBinding(SWT.ARROW_UP, ST.LINE_UP); - setKeyBinding(SWT.ARROW_DOWN, ST.LINE_DOWN); - if (IS_MAC) { - setKeyBinding(previousKey | SWT.MOD1, ST.LINE_START); - setKeyBinding(nextKey | SWT.MOD1, ST.LINE_END); - setKeyBinding(SWT.HOME, ST.TEXT_START); - setKeyBinding(SWT.END, ST.TEXT_END); - setKeyBinding(SWT.ARROW_UP | SWT.MOD1, ST.TEXT_START); - setKeyBinding(SWT.ARROW_DOWN | SWT.MOD1, ST.TEXT_END); - setKeyBinding(nextKey | SWT.MOD3, ST.WORD_NEXT); - setKeyBinding(previousKey | SWT.MOD3, ST.WORD_PREVIOUS); - } else { - setKeyBinding(SWT.HOME, ST.LINE_START); - setKeyBinding(SWT.END, ST.LINE_END); - setKeyBinding(SWT.HOME | SWT.MOD1, ST.TEXT_START); - setKeyBinding(SWT.END | SWT.MOD1, ST.TEXT_END); - setKeyBinding(nextKey | SWT.MOD1, ST.WORD_NEXT); - setKeyBinding(previousKey | SWT.MOD1, ST.WORD_PREVIOUS); - } - setKeyBinding(SWT.PAGE_UP, ST.PAGE_UP); - setKeyBinding(SWT.PAGE_DOWN, ST.PAGE_DOWN); - setKeyBinding(SWT.PAGE_UP | SWT.MOD1, ST.WINDOW_START); - setKeyBinding(SWT.PAGE_DOWN | SWT.MOD1, ST.WINDOW_END); - setKeyBinding(nextKey, ST.COLUMN_NEXT); - setKeyBinding(previousKey, ST.COLUMN_PREVIOUS); - - // Selection - setKeyBinding(SWT.ARROW_UP | SWT.MOD2, ST.SELECT_LINE_UP); - setKeyBinding(SWT.ARROW_DOWN | SWT.MOD2, ST.SELECT_LINE_DOWN); - if (IS_MAC) { - setKeyBinding(previousKey | SWT.MOD1 | SWT.MOD2, ST.SELECT_LINE_START); - setKeyBinding(nextKey | SWT.MOD1 | SWT.MOD2, ST.SELECT_LINE_END); - setKeyBinding(SWT.HOME | SWT.MOD2, ST.SELECT_TEXT_START); - setKeyBinding(SWT.END | SWT.MOD2, ST.SELECT_TEXT_END); - setKeyBinding(SWT.ARROW_UP | SWT.MOD1 | SWT.MOD2, ST.SELECT_TEXT_START); - setKeyBinding(SWT.ARROW_DOWN | SWT.MOD1 | SWT.MOD2, ST.SELECT_TEXT_END); - setKeyBinding(nextKey | SWT.MOD2 | SWT.MOD3, ST.SELECT_WORD_NEXT); - setKeyBinding(previousKey | SWT.MOD2 | SWT.MOD3, ST.SELECT_WORD_PREVIOUS); - } else { - setKeyBinding(SWT.HOME | SWT.MOD2, ST.SELECT_LINE_START); - setKeyBinding(SWT.END | SWT.MOD2, ST.SELECT_LINE_END); - setKeyBinding(SWT.HOME | SWT.MOD1 | SWT.MOD2, ST.SELECT_TEXT_START); - setKeyBinding(SWT.END | SWT.MOD1 | SWT.MOD2, ST.SELECT_TEXT_END); - setKeyBinding(nextKey | SWT.MOD1 | SWT.MOD2, ST.SELECT_WORD_NEXT); - setKeyBinding(previousKey | SWT.MOD1 | SWT.MOD2, ST.SELECT_WORD_PREVIOUS); - } - setKeyBinding(SWT.PAGE_UP | SWT.MOD2, ST.SELECT_PAGE_UP); - setKeyBinding(SWT.PAGE_DOWN | SWT.MOD2, ST.SELECT_PAGE_DOWN); - setKeyBinding(SWT.PAGE_UP | SWT.MOD1 | SWT.MOD2, ST.SELECT_WINDOW_START); - setKeyBinding(SWT.PAGE_DOWN | SWT.MOD1 | SWT.MOD2, ST.SELECT_WINDOW_END); - setKeyBinding(nextKey | SWT.MOD2, ST.SELECT_COLUMN_NEXT); - setKeyBinding(previousKey | SWT.MOD2, ST.SELECT_COLUMN_PREVIOUS); - - // Modification - // Cut, Copy, Paste - setKeyBinding('X' | SWT.MOD1, ST.CUT); - setKeyBinding('C' | SWT.MOD1, ST.COPY); - setKeyBinding('V' | SWT.MOD1, ST.PASTE); - if (IS_MAC) { - setKeyBinding(SWT.DEL | SWT.MOD2, ST.DELETE_NEXT); - setKeyBinding(SWT.BS | SWT.MOD3, ST.DELETE_WORD_PREVIOUS); - setKeyBinding(SWT.DEL | SWT.MOD3, ST.DELETE_WORD_NEXT); - } else { - // Cut, Copy, Paste Wordstar style - setKeyBinding(SWT.DEL | SWT.MOD2, ST.CUT); - setKeyBinding(SWT.INSERT | SWT.MOD1, ST.COPY); - setKeyBinding(SWT.INSERT | SWT.MOD2, ST.PASTE); - } - setKeyBinding(SWT.BS | SWT.MOD2, ST.DELETE_PREVIOUS); - setKeyBinding(SWT.BS, ST.DELETE_PREVIOUS); - setKeyBinding(SWT.DEL, ST.DELETE_NEXT); - setKeyBinding(SWT.BS | SWT.MOD1, ST.DELETE_WORD_PREVIOUS); - setKeyBinding(SWT.DEL | SWT.MOD1, ST.DELETE_WORD_NEXT); - - // Miscellaneous - setKeyBinding(SWT.INSERT, ST.TOGGLE_OVERWRITE); -} -/** - * Create the bitmaps to use for the caret in bidi mode. This - * method only needs to be called upon widget creation and when the - * font changes (the caret bitmap height needs to match font height). - */ -void createCaretBitmaps() { - int caretWidth = BIDI_CARET_WIDTH; - Display display = getDisplay(); - if (leftCaretBitmap != null) { - if (defaultCaret != null && leftCaretBitmap.equals(defaultCaret.getImage())) { - defaultCaret.setImage(null); - } - leftCaretBitmap.dispose(); - } - int lineHeight = renderer.getLineHeight(); - leftCaretBitmap = new Image(display, caretWidth, lineHeight); - GC gc = new GC (leftCaretBitmap); - gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK)); - gc.fillRectangle(0, 0, caretWidth, lineHeight); - gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE)); - gc.drawLine(0,0,0,lineHeight); - gc.drawLine(0,0,caretWidth-1,0); - gc.drawLine(0,1,1,1); - gc.dispose(); - - if (rightCaretBitmap != null) { - if (defaultCaret != null && rightCaretBitmap.equals(defaultCaret.getImage())) { - defaultCaret.setImage(null); - } - rightCaretBitmap.dispose(); - } - rightCaretBitmap = new Image(display, caretWidth, lineHeight); - gc = new GC (rightCaretBitmap); - gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK)); - gc.fillRectangle(0, 0, caretWidth, lineHeight); - gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE)); - gc.drawLine(caretWidth-1,0,caretWidth-1,lineHeight); - gc.drawLine(0,0,caretWidth-1,0); - gc.drawLine(caretWidth-1,1,1,1); - gc.dispose(); -} -/** - * Moves the selected text to the clipboard. The text will be put in the - * clipboard in plain text format and RTF format. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void cut() { - checkWidget(); - // Abort cut operation if copy to clipboard fails. - // Fixes bug 21030. - if (copySelection(DND.CLIPBOARD)) { - if (blockSelection && blockXLocation != -1) { - insertBlockSelectionText((char)0, SWT.NULL); - } else { - doDelete(); - } - } -} -/** - * A mouse move event has occurred. See if we should start autoscrolling. If - * the move position is outside of the client area, initiate autoscrolling. - * Otherwise, we've moved back into the widget so end autoscrolling. - */ -void doAutoScroll(Event event) { - int caretLine = getCaretLine(); - if (event.y > clientAreaHeight - bottomMargin && caretLine != content.getLineCount() - 1) { - doAutoScroll(SWT.DOWN, event.y - (clientAreaHeight - bottomMargin)); - } else if (event.y < topMargin && caretLine != 0) { - doAutoScroll(SWT.UP, topMargin - event.y); - } else if (event.x < leftMargin && !wordWrap) { - doAutoScroll(ST.COLUMN_PREVIOUS, leftMargin - event.x); - } else if (event.x > clientAreaWidth - rightMargin && !wordWrap) { - doAutoScroll(ST.COLUMN_NEXT, event.x - (clientAreaWidth - rightMargin)); - } else { - endAutoScroll(); - } -} -/** - * Initiates autoscrolling. - * - * @param direction SWT.UP, SWT.DOWN, SWT.COLUMN_NEXT, SWT.COLUMN_PREVIOUS - */ -void doAutoScroll(int direction, int distance) { - autoScrollDistance = distance; - // If we're already autoscrolling in the given direction do nothing - if (autoScrollDirection == direction) { - return; - } - - Runnable timer = null; - final Display display = getDisplay(); - // Set a timer that will simulate the user pressing and holding - // down a cursor key (i.e., arrowUp, arrowDown). - if (direction == SWT.UP) { - timer = new Runnable() { - public void run() { - if (autoScrollDirection == SWT.UP) { - if (blockSelection) { - int verticalScrollOffset = getVerticalScrollOffset(); - int y = blockYLocation - verticalScrollOffset; - int pixels = Math.max(-autoScrollDistance, -verticalScrollOffset); - if (pixels != 0) { - setBlockSelectionLocation(blockXLocation - horizontalScrollOffset, y + pixels, true); - scrollVertical(pixels, true); - } - } else { - doSelectionPageUp(autoScrollDistance); - } - display.timerExec(V_SCROLL_RATE, this); - } - } - }; - autoScrollDirection = direction; - display.timerExec(V_SCROLL_RATE, timer); - } else if (direction == SWT.DOWN) { - timer = new Runnable() { - public void run() { - if (autoScrollDirection == SWT.DOWN) { - if (blockSelection) { - int verticalScrollOffset = getVerticalScrollOffset(); - int y = blockYLocation - verticalScrollOffset; - int max = renderer.getHeight() - verticalScrollOffset - clientAreaHeight; - int pixels = Math.min(autoScrollDistance, Math.max(0,max)); - if (pixels != 0) { - setBlockSelectionLocation(blockXLocation - horizontalScrollOffset, y + pixels, true); - scrollVertical(pixels, true); - } - } else { - doSelectionPageDown(autoScrollDistance); - } - display.timerExec(V_SCROLL_RATE, this); - } - } - }; - autoScrollDirection = direction; - display.timerExec(V_SCROLL_RATE, timer); - } else if (direction == ST.COLUMN_NEXT) { - timer = new Runnable() { - public void run() { - if (autoScrollDirection == ST.COLUMN_NEXT) { - if (blockSelection) { - int x = blockXLocation - horizontalScrollOffset; - int max = renderer.getWidth() - horizontalScrollOffset - clientAreaWidth; - int pixels = Math.min(autoScrollDistance, Math.max(0,max)); - if (pixels != 0) { - setBlockSelectionLocation(x + pixels, blockYLocation - getVerticalScrollOffset(), true); - scrollHorizontal(pixels, true); - } - } else { - doVisualNext(); - setMouseWordSelectionAnchor(); - doMouseSelection(); - } - display.timerExec(H_SCROLL_RATE, this); - } - } - }; - autoScrollDirection = direction; - display.timerExec(H_SCROLL_RATE, timer); - } else if (direction == ST.COLUMN_PREVIOUS) { - timer = new Runnable() { - public void run() { - if (autoScrollDirection == ST.COLUMN_PREVIOUS) { - if (blockSelection) { - int x = blockXLocation - horizontalScrollOffset; - int pixels = Math.max(-autoScrollDistance, -horizontalScrollOffset); - if (pixels != 0) { - setBlockSelectionLocation(x + pixels, blockYLocation - getVerticalScrollOffset(), true); - scrollHorizontal(pixels, true); - } - } else { - doVisualPrevious(); - setMouseWordSelectionAnchor(); - doMouseSelection(); - } - display.timerExec(H_SCROLL_RATE, this); - } - } - }; - autoScrollDirection = direction; - display.timerExec(H_SCROLL_RATE, timer); - } -} -/** - * Deletes the previous character. Delete the selected text if any. - * Move the caret in front of the deleted text. - */ -void doBackspace() { - Event event = new Event(); - event.text = ""; - if (selection.x != selection.y) { - event.start = selection.x; - event.end = selection.y; - sendKeyEvent(event); - } else if (caretOffset > 0) { - int lineIndex = content.getLineAtOffset(caretOffset); - int lineOffset = content.getOffsetAtLine(lineIndex); - if (caretOffset == lineOffset) { - lineOffset = content.getOffsetAtLine(lineIndex - 1); - event.start = lineOffset + content.getLine(lineIndex - 1).length(); - event.end = caretOffset; - } else { - TextLayout layout = renderer.getTextLayout(lineIndex); - int start = layout.getPreviousOffset(caretOffset - lineOffset, SWT.MOVEMENT_CHAR); - renderer.disposeTextLayout(layout); - event.start = start + lineOffset; - event.end = caretOffset; - } - sendKeyEvent(event); - } -} -void doBlockColumn(boolean next) { - if (blockXLocation == -1) setBlockSelectionOffset(caretOffset, false); - int x = blockXLocation - horizontalScrollOffset; - int y = blockYLocation - getVerticalScrollOffset(); - int[] trailing = new int[1]; - int offset = getOffsetAtPoint(x, y, trailing, true); - if (offset != -1) { - offset += trailing[0]; - int lineIndex = content.getLineAtOffset(offset); - int newOffset; - if (next) { - newOffset = getClusterNext(offset, lineIndex); - } else { - newOffset = getClusterPrevious(offset, lineIndex); - } - offset = newOffset != offset ? newOffset : -1; - } - if (offset != -1) { - setBlockSelectionOffset(offset, true); - showCaret(); - } else { - int width = next ? renderer.averageCharWidth : -renderer.averageCharWidth; - int maxWidth = Math.max(clientAreaWidth - rightMargin - leftMargin, renderer.getWidth()); - x = Math.max(0, Math.min(blockXLocation + width, maxWidth)) - horizontalScrollOffset; - setBlockSelectionLocation(x, y, true); - Rectangle rect = new Rectangle(x, y, 0, 0); - showLocation(rect, true); - } -} -void doBlockWord(boolean next) { - if (blockXLocation == -1) setBlockSelectionOffset(caretOffset, false); - int x = blockXLocation - horizontalScrollOffset; - int y = blockYLocation - getVerticalScrollOffset(); - int[] trailing = new int[1]; - int offset = getOffsetAtPoint(x, y, trailing, true); - if (offset != -1) { - offset += trailing[0]; - int lineIndex = content.getLineAtOffset(offset); - int lineOffset = content.getOffsetAtLine(lineIndex); - String lineText = content.getLine(lineIndex); - int lineLength = lineText.length(); - int newOffset = offset; - if (next) { - if (offset < lineOffset + lineLength) { - newOffset = getWordNext(offset, SWT.MOVEMENT_WORD); - } - } else { - if (offset > lineOffset) { - newOffset = getWordPrevious(offset, SWT.MOVEMENT_WORD); - } - } - offset = newOffset != offset ? newOffset : -1; - } - if (offset != -1) { - setBlockSelectionOffset(offset, true); - showCaret(); - } else { - int width = (next ? renderer.averageCharWidth : -renderer.averageCharWidth) * 6; - int maxWidth = Math.max(clientAreaWidth - rightMargin - leftMargin, renderer.getWidth()); - x = Math.max(0, Math.min(blockXLocation + width, maxWidth)) - horizontalScrollOffset; - setBlockSelectionLocation(x, y, true); - Rectangle rect = new Rectangle(x, y, 0, 0); - showLocation(rect, true); - } -} -void doBlockLineVertical(boolean up) { - if (blockXLocation == -1) setBlockSelectionOffset(caretOffset, false); - int y = blockYLocation - getVerticalScrollOffset(); - int lineIndex = getLineIndex(y); - if (up) { - if (lineIndex > 0) { - y = getLinePixel(lineIndex - 1); - setBlockSelectionLocation(blockXLocation - horizontalScrollOffset, y, true); - if (y < topMargin) { - scrollVertical(y - topMargin, true); - } - } - } else { - int lineCount = content.getLineCount(); - if (lineIndex + 1 < lineCount) { - y = getLinePixel(lineIndex + 2) - 1; - setBlockSelectionLocation(blockXLocation - horizontalScrollOffset, y, true); - int bottom = clientAreaHeight - bottomMargin; - if (y > bottom) { - scrollVertical(y - bottom, true); - } - } - } -} -void doBlockLineHorizontal(boolean end) { - if (blockXLocation == -1) setBlockSelectionOffset(caretOffset, false); - int x = blockXLocation - horizontalScrollOffset; - int y = blockYLocation - getVerticalScrollOffset(); - int lineIndex = getLineIndex(y); - int lineOffset = content.getOffsetAtLine(lineIndex); - String lineText = content.getLine(lineIndex); - int lineLength = lineText.length(); - int[] trailing = new int[1]; - int offset = getOffsetAtPoint(x, y, trailing, true); - if (offset != -1) { - offset += trailing[0]; - int newOffset = offset; - if (end) { - if (offset < lineOffset + lineLength) { - newOffset = lineOffset + lineLength; - } - } else { - if (offset > lineOffset) { - newOffset = lineOffset; - } - } - offset = newOffset != offset ? newOffset : -1; - } else { - if (!end) offset = lineOffset + lineLength; - } - if (offset != -1) { - setBlockSelectionOffset(offset, true); - showCaret(); - } else { - int maxWidth = Math.max(clientAreaWidth - rightMargin - leftMargin, renderer.getWidth()); - x = (end ? maxWidth : 0) - horizontalScrollOffset; - setBlockSelectionLocation(x, y, true); - Rectangle rect = new Rectangle(x, y, 0, 0); - showLocation(rect, true); - } -} -void doBlockSelection(boolean sendEvent) { - if (caretOffset > selectionAnchor) { - selection.x = selectionAnchor; - selection.y = caretOffset; - } else { - selection.x = caretOffset; - selection.y = selectionAnchor; - } - updateCaretVisibility(); - setCaretLocation(); - super.redraw(); - if (sendEvent) { - sendSelectionEvent(); - } -} -/** - * Replaces the selection with the character or insert the character at the - * current caret position if no selection exists. - *

    - * If a carriage return was typed replace it with the line break character - * used by the widget on this platform. - *

    - * - * @param key the character typed by the user - */ -void doContent(char key) { - if (blockSelection && blockXLocation != -1) { - insertBlockSelectionText(key, SWT.NULL); - return; - } - - Event event = new Event(); - event.start = selection.x; - event.end = selection.y; - // replace a CR line break with the widget line break - // CR does not make sense on Windows since most (all?) applications - // don't recognize CR as a line break. - if (key == SWT.CR || key == SWT.LF) { - if (!isSingleLine()) { - event.text = getLineDelimiter(); - } - } else if (selection.x == selection.y && overwrite && key != TAB) { - // no selection and overwrite mode is on and the typed key is not a - // tab character (tabs are always inserted without overwriting)? - int lineIndex = content.getLineAtOffset(event.end); - int lineOffset = content.getOffsetAtLine(lineIndex); - String line = content.getLine(lineIndex); - // replace character at caret offset if the caret is not at the - // end of the line - if (event.end < lineOffset + line.length()) { - event.end++; - } - event.text = new String(new char[] {key}); - } else { - event.text = new String(new char[] {key}); - } - if (event.text != null) { - if (textLimit > 0 && content.getCharCount() - (event.end - event.start) >= textLimit) { - return; - } - sendKeyEvent(event); - } -} -/** - * Moves the caret after the last character of the widget content. - */ -void doContentEnd() { - // place caret at end of first line if receiver is in single - // line mode. fixes 4820. - if (isSingleLine()) { - doLineEnd(); - } else { - int length = content.getCharCount(); - if (caretOffset < length) { - setCaretOffset(length, SWT.DEFAULT); - showCaret(); - } - } -} -/** - * Moves the caret in front of the first character of the widget content. - */ -void doContentStart() { - if (caretOffset > 0) { - setCaretOffset(0, SWT.DEFAULT); - showCaret(); - } -} -/** - * Moves the caret to the start of the selection if a selection exists. - * Otherwise, if no selection exists move the cursor according to the - * cursor selection rules. - * - * @see #doSelectionCursorPrevious - */ -void doCursorPrevious() { - if (selection.y - selection.x > 0) { - setCaretOffset(selection.x, OFFSET_LEADING); - showCaret(); - } else { - doSelectionCursorPrevious(); - } -} -/** - * Moves the caret to the end of the selection if a selection exists. - * Otherwise, if no selection exists move the cursor according to the - * cursor selection rules. - * - * @see #doSelectionCursorNext - */ -void doCursorNext() { - if (selection.y - selection.x > 0) { - setCaretOffset(selection.y, PREVIOUS_OFFSET_TRAILING); - showCaret(); - } else { - doSelectionCursorNext(); - } -} -/** - * Deletes the next character. Delete the selected text if any. - */ -void doDelete() { - Event event = new Event(); - event.text = ""; - if (selection.x != selection.y) { - event.start = selection.x; - event.end = selection.y; - sendKeyEvent(event); - } else if (caretOffset < content.getCharCount()) { - int line = content.getLineAtOffset(caretOffset); - int lineOffset = content.getOffsetAtLine(line); - int lineLength = content.getLine(line).length(); - if (caretOffset == lineOffset + lineLength) { - event.start = caretOffset; - event.end = content.getOffsetAtLine(line + 1); - } else { - event.start = caretOffset; - event.end = getClusterNext(caretOffset, line); - } - sendKeyEvent(event); - } -} -/** - * Deletes the next word. - */ -void doDeleteWordNext() { - if (selection.x != selection.y) { - // if a selection exists, treat the as if - // only the delete key was pressed - doDelete(); - } else { - Event event = new Event(); - event.text = ""; - event.start = caretOffset; - event.end = getWordNext(caretOffset, SWT.MOVEMENT_WORD); - sendKeyEvent(event); - } -} -/** - * Deletes the previous word. - */ -void doDeleteWordPrevious() { - if (selection.x != selection.y) { - // if a selection exists, treat as if - // only the backspace key was pressed - doBackspace(); - } else { - Event event = new Event(); - event.text = ""; - event.start = getWordPrevious(caretOffset, SWT.MOVEMENT_WORD); - event.end = caretOffset; - sendKeyEvent(event); - } -} -/** - * Moves the caret one line down and to the same character offset relative - * to the beginning of the line. Move the caret to the end of the new line - * if the new line is shorter than the character offset. - */ -void doLineDown(boolean select) { - int caretLine = getCaretLine(); - int lineCount = content.getLineCount(); - int y = 0; - boolean lastLine = false; - if (wordWrap) { - int lineOffset = content.getOffsetAtLine(caretLine); - int offsetInLine = caretOffset - lineOffset; - TextLayout layout = renderer.getTextLayout(caretLine); - int lineIndex = getVisualLineIndex(layout, offsetInLine); - int layoutLineCount = layout.getLineCount(); - if (lineIndex == layoutLineCount - 1) { - lastLine = caretLine == lineCount - 1; - caretLine++; - } else { - y = layout.getLineBounds(lineIndex + 1).y; - } - renderer.disposeTextLayout(layout); - } else { - lastLine = caretLine == lineCount - 1; - caretLine++; - } - if (lastLine) { - if (select) { - setCaretOffset(content.getCharCount(), SWT.DEFAULT); - } - } else { - int[] alignment = new int[1]; - int offset = getOffsetAtPoint(columnX, y, caretLine, alignment); - setCaretOffset(offset, alignment[0]); - } - int oldColumnX = columnX; - int oldHScrollOffset = horizontalScrollOffset; - if (select) { - setMouseWordSelectionAnchor(); - // select first and then scroll to reduce flash when key - // repeat scrolls lots of lines - doSelection(ST.COLUMN_NEXT); - } - showCaret(); - int hScrollChange = oldHScrollOffset - horizontalScrollOffset; - columnX = oldColumnX + hScrollChange; -} -/** - * Moves the caret to the end of the line. - */ -void doLineEnd() { - int caretLine = getCaretLine(); - int lineOffset = content.getOffsetAtLine(caretLine); - int lineEndOffset; - if (wordWrap) { - TextLayout layout = renderer.getTextLayout(caretLine); - int offsetInLine = caretOffset - lineOffset; - int lineIndex = getVisualLineIndex(layout, offsetInLine); - int[] offsets = layout.getLineOffsets(); - lineEndOffset = lineOffset + offsets[lineIndex + 1]; - renderer.disposeTextLayout(layout); - } else { - int lineLength = content.getLine(caretLine).length(); - lineEndOffset = lineOffset + lineLength; - } - if (caretOffset < lineEndOffset) { - setCaretOffset(lineEndOffset, PREVIOUS_OFFSET_TRAILING); - showCaret(); - } -} -/** - * Moves the caret to the beginning of the line. - */ -void doLineStart() { - int caretLine = getCaretLine(); - int lineOffset = content.getOffsetAtLine(caretLine); - if (wordWrap) { - TextLayout layout = renderer.getTextLayout(caretLine); - int offsetInLine = caretOffset - lineOffset; - int lineIndex = getVisualLineIndex(layout, offsetInLine); - int[] offsets = layout.getLineOffsets(); - lineOffset += offsets[lineIndex]; - renderer.disposeTextLayout(layout); - } - if (caretOffset > lineOffset) { - setCaretOffset(lineOffset, OFFSET_LEADING); - showCaret(); - } -} -/** - * Moves the caret one line up and to the same character offset relative - * to the beginning of the line. Move the caret to the end of the new line - * if the new line is shorter than the character offset. - */ -void doLineUp(boolean select) { - int caretLine = getCaretLine(), y = 0; - boolean firstLine = false; - if (wordWrap) { - int lineOffset = content.getOffsetAtLine(caretLine); - int offsetInLine = caretOffset - lineOffset; - TextLayout layout = renderer.getTextLayout(caretLine); - int lineIndex = getVisualLineIndex(layout, offsetInLine); - if (lineIndex == 0) { - firstLine = caretLine == 0; - if (!firstLine) { - caretLine--; - y = renderer.getLineHeight(caretLine) - 1; - } - } else { - y = layout.getLineBounds(lineIndex - 1).y; - } - renderer.disposeTextLayout(layout); - } else { - firstLine = caretLine == 0; - caretLine--; - } - if (firstLine) { - if (select) { - setCaretOffset(0, SWT.DEFAULT); - } - } else { - int[] alignment = new int[1]; - int offset = getOffsetAtPoint(columnX, y, caretLine, alignment); - setCaretOffset(offset, alignment[0]); - } - int oldColumnX = columnX; - int oldHScrollOffset = horizontalScrollOffset; - if (select) setMouseWordSelectionAnchor(); - showCaret(); - if (select) doSelection(ST.COLUMN_PREVIOUS); - int hScrollChange = oldHScrollOffset - horizontalScrollOffset; - columnX = oldColumnX + hScrollChange; -} -void doMouseLinkCursor() { - Display display = getDisplay(); - Point point = display.getCursorLocation(); - point = display.map(null, this, point); - doMouseLinkCursor(point.x, point.y); -} -void doMouseLinkCursor(int x, int y) { - int offset = getOffsetAtPoint(x, y, null, true); - Display display = getDisplay(); - Cursor newCursor = cursor; - if (renderer.hasLink(offset)) { - newCursor = display.getSystemCursor(SWT.CURSOR_HAND); - } else { - if (cursor == null) { - int type = blockSelection ? SWT.CURSOR_CROSS : SWT.CURSOR_IBEAM; - newCursor = display.getSystemCursor(type); - } - } - if (newCursor != getCursor()) super.setCursor(newCursor); -} -/** - * Moves the caret to the specified location. - * - * @param x x location of the new caret position - * @param y y location of the new caret position - * @param select the location change is a selection operation. - * include the line delimiter in the selection - */ -void doMouseLocationChange(int x, int y, boolean select) { - int line = getLineIndex(y); - - updateCaretDirection = true; - - if (blockSelection) { - x = Math.max(leftMargin, Math.min(x, clientAreaWidth - rightMargin)); - y = Math.max(topMargin, Math.min(y, clientAreaHeight - bottomMargin)); - if (doubleClickEnabled && clickCount > 1) { - boolean wordSelect = (clickCount & 1) == 0; - if (wordSelect) { - Point left = getPointAtOffset(doubleClickSelection.x); - int[] trailing = new int[1]; - int offset = getOffsetAtPoint(x, y, trailing, true); - if (offset != -1) { - if (x > left.x) { - offset = getWordNext(offset + trailing[0], SWT.MOVEMENT_WORD_END); - setBlockSelectionOffset(doubleClickSelection.x, offset, true); - } else { - offset = getWordPrevious(offset + trailing[0], SWT.MOVEMENT_WORD_START); - setBlockSelectionOffset(doubleClickSelection.y, offset, true); - } - } else { - if (x > left.x) { - setBlockSelectionLocation(left.x, left.y, x, y, true); - } else { - Point right = getPointAtOffset(doubleClickSelection.y); - setBlockSelectionLocation(right.x, right.y, x, y, true); - } - } - } else { - setBlockSelectionLocation(blockXLocation, y, true); - } - return; - } else { - if (select) { - if (blockXLocation == -1) { - setBlockSelectionOffset(caretOffset, false); - } - } else { - clearBlockSelection(true, false); - } - int[] trailing = new int[1]; - int offset = getOffsetAtPoint(x, y, trailing, true); - if (offset != -1) { - if (select) { - setBlockSelectionOffset(offset + trailing[0], true); - return; - } - } else { - if (isFixedLineHeight() && renderer.fixedPitch) { - int avg = renderer.averageCharWidth; - x = ((x + avg / 2 - leftMargin + horizontalScrollOffset) / avg * avg) + leftMargin - horizontalScrollOffset; - } - setBlockSelectionLocation(x, y, true); - return; - } - } - } - - // allow caret to be placed below first line only if receiver is - // not in single line mode. fixes 4820. - if (line < 0 || (isSingleLine() && line > 0)) { - return; - } - int[] alignment = new int[1]; - int newCaretOffset = getOffsetAtPoint(x, y, alignment); - int newCaretAlignemnt = alignment[0]; - - if (doubleClickEnabled && clickCount > 1) { - newCaretOffset = doMouseWordSelect(x, newCaretOffset, line); - } - - int newCaretLine = content.getLineAtOffset(newCaretOffset); - - // Is the mouse within the left client area border or on - // a different line? If not the autoscroll selection - // could be incorrectly reset. Fixes 1GKM3XS - boolean vchange = 0 <= y && y < clientAreaHeight || newCaretLine == 0 || newCaretLine == content.getLineCount() - 1; - boolean hchange = 0 <= x && x < clientAreaWidth || wordWrap || newCaretLine != content.getLineAtOffset(caretOffset); - if (vchange && hchange && (newCaretOffset != caretOffset || newCaretAlignemnt != caretAlignment)) { - setCaretOffset(newCaretOffset, newCaretAlignemnt); - if (select) doMouseSelection(); - showCaret(); - } - if (!select) { - setCaretOffset(newCaretOffset, newCaretAlignemnt); - clearSelection(true); - } -} -/** - * Updates the selection based on the caret position - */ -void doMouseSelection() { - if (caretOffset <= selection.x || - (caretOffset > selection.x && - caretOffset < selection.y && selectionAnchor == selection.x)) { - doSelection(ST.COLUMN_PREVIOUS); - } else { - doSelection(ST.COLUMN_NEXT); - } -} -/** - * Returns the offset of the word at the specified offset. - * If the current selection extends from high index to low index - * (i.e., right to left, or caret is at left border of selection on - * non-bidi platforms) the start offset of the word preceding the - * selection is returned. If the current selection extends from - * low index to high index the end offset of the word following - * the selection is returned. - * - * @param x mouse x location - * @param newCaretOffset caret offset of the mouse cursor location - * @param line line index of the mouse cursor location - */ -int doMouseWordSelect(int x, int newCaretOffset, int line) { - // flip selection anchor based on word selection direction from - // base double click. Always do this here (and don't rely on doAutoScroll) - // because auto scroll only does not cover all possible mouse selections - // (e.g., mouse x < 0 && mouse y > caret line y) - if (newCaretOffset < selectionAnchor && selectionAnchor == selection.x) { - selectionAnchor = doubleClickSelection.y; - } else if (newCaretOffset > selectionAnchor && selectionAnchor == selection.y) { - selectionAnchor = doubleClickSelection.x; - } - if (0 <= x && x < clientAreaWidth) { - boolean wordSelect = (clickCount & 1) == 0; - if (caretOffset == selection.x) { - if (wordSelect) { - newCaretOffset = getWordPrevious(newCaretOffset, SWT.MOVEMENT_WORD_START); - } else { - newCaretOffset = content.getOffsetAtLine(line); - } - } else { - if (wordSelect) { - newCaretOffset = getWordNext(newCaretOffset, SWT.MOVEMENT_WORD_END); - } else { - int lineEnd = content.getCharCount(); - if (line + 1 < content.getLineCount()) { - lineEnd = content.getOffsetAtLine(line + 1); - } - newCaretOffset = lineEnd; - } - } - } - return newCaretOffset; -} -/** - * Scrolls one page down so that the last line (truncated or whole) - * of the current page becomes the fully visible top line. - *

    - * The caret is scrolled the same number of lines so that its location - * relative to the top line remains the same. The exception is the end - * of the text where a full page scroll is not possible. In this case - * the caret is moved after the last character. - *

    - * - * @param select whether or not to select the page - */ -void doPageDown(boolean select, int height) { - if (isSingleLine()) return; - int oldColumnX = columnX; - int oldHScrollOffset = horizontalScrollOffset; - if (isFixedLineHeight()) { - int lineCount = content.getLineCount(); - int caretLine = getCaretLine(); - if (caretLine < lineCount - 1) { - int lineHeight = renderer.getLineHeight(); - int lines = (height == -1 ? clientAreaHeight : height) / lineHeight; - int scrollLines = Math.min(lineCount - caretLine - 1, lines); - // ensure that scrollLines never gets negative and at least one - // line is scrolled. fixes bug 5602. - scrollLines = Math.max(1, scrollLines); - int[] alignment = new int[1]; - int offset = getOffsetAtPoint(columnX, getLinePixel(caretLine + scrollLines), alignment); - setCaretOffset(offset, alignment[0]); - if (select) { - doSelection(ST.COLUMN_NEXT); - } - // scroll one page down or to the bottom - int verticalMaximum = lineCount * getVerticalIncrement(); - int pageSize = clientAreaHeight; - int verticalScrollOffset = getVerticalScrollOffset(); - int scrollOffset = verticalScrollOffset + scrollLines * getVerticalIncrement(); - if (scrollOffset + pageSize > verticalMaximum) { - scrollOffset = verticalMaximum - pageSize; - } - if (scrollOffset > verticalScrollOffset) { - scrollVertical(scrollOffset - verticalScrollOffset, true); - } - } - } else { - int lineCount = content.getLineCount(); - int caretLine = getCaretLine(); - int lineIndex, lineHeight; - if (height == -1) { - lineIndex = getPartialBottomIndex(); - int topY = getLinePixel(lineIndex); - lineHeight = renderer.getLineHeight(lineIndex); - height = topY; - if (topY + lineHeight <= clientAreaHeight) { - height += lineHeight; - } else { - if (wordWrap) { - TextLayout layout = renderer.getTextLayout(lineIndex); - int y = clientAreaHeight - topY; - for (int i = 0; i < layout.getLineCount(); i++) { - Rectangle bounds = layout.getLineBounds(i); - if (bounds.contains(bounds.x, y)) { - height += bounds.y; - break; - } - } - renderer.disposeTextLayout(layout); - } - } - } else { - lineIndex = getLineIndex(height); - int topLineY = getLinePixel(lineIndex); - if (wordWrap) { - TextLayout layout = renderer.getTextLayout(lineIndex); - int y = height - topLineY; - for (int i = 0; i < layout.getLineCount(); i++) { - Rectangle bounds = layout.getLineBounds(i); - if (bounds.contains(bounds.x, y)) { - height = topLineY + bounds.y + bounds.height; - break; - } - } - renderer.disposeTextLayout(layout); - } else { - height = topLineY + renderer.getLineHeight(lineIndex); - } - } - int caretHeight = height; - if (wordWrap) { - TextLayout layout = renderer.getTextLayout(caretLine); - int offsetInLine = caretOffset - content.getOffsetAtLine(caretLine); - lineIndex = getVisualLineIndex(layout, offsetInLine); - caretHeight += layout.getLineBounds(lineIndex).y; - renderer.disposeTextLayout(layout); - } - lineIndex = caretLine; - lineHeight = renderer.getLineHeight(lineIndex); - while (caretHeight - lineHeight >= 0 && lineIndex < lineCount - 1) { - caretHeight -= lineHeight; - lineHeight = renderer.getLineHeight(++lineIndex); - } - int[] alignment = new int[1]; - int offset = getOffsetAtPoint(columnX, caretHeight, lineIndex, alignment); - setCaretOffset(offset, alignment[0]); - if (select) doSelection(ST.COLUMN_NEXT); - height = getAvailableHeightBellow(height); - scrollVertical(height, true); - if (height == 0) setCaretLocation(); - } - showCaret(); - int hScrollChange = oldHScrollOffset - horizontalScrollOffset; - columnX = oldColumnX + hScrollChange; -} -/** - * Moves the cursor to the end of the last fully visible line. - */ -void doPageEnd() { - // go to end of line if in single line mode. fixes 5673 - if (isSingleLine()) { - doLineEnd(); - } else { - int bottomOffset; - if (wordWrap) { - int lineIndex = getPartialBottomIndex(); - TextLayout layout = renderer.getTextLayout(lineIndex); - int y = (clientAreaHeight - bottomMargin) - getLinePixel(lineIndex); - int index = layout.getLineCount() - 1; - while (index >= 0) { - Rectangle bounds = layout.getLineBounds(index); - if (y >= bounds.y + bounds.height) break; - index--; - } - if (index == -1 && lineIndex > 0) { - bottomOffset = content.getOffsetAtLine(lineIndex - 1) + content.getLine(lineIndex - 1).length(); - } else { - bottomOffset = content.getOffsetAtLine(lineIndex) + Math.max(0, layout.getLineOffsets()[index + 1] - 1); - } - renderer.disposeTextLayout(layout); - } else { - int lineIndex = getBottomIndex(); - bottomOffset = content.getOffsetAtLine(lineIndex) + content.getLine(lineIndex).length(); - } - if (caretOffset < bottomOffset) { - setCaretOffset(bottomOffset, OFFSET_LEADING); - showCaret(); - } - } -} -/** - * Moves the cursor to the beginning of the first fully visible line. - */ -void doPageStart() { - int topOffset; - if (wordWrap) { - int y, lineIndex; - if (topIndexY > 0) { - lineIndex = topIndex - 1; - y = renderer.getLineHeight(lineIndex) - topIndexY; - } else { - lineIndex = topIndex; - y = -topIndexY; - } - TextLayout layout = renderer.getTextLayout(lineIndex); - int index = 0; - int lineCount = layout.getLineCount(); - while (index < lineCount) { - Rectangle bounds = layout.getLineBounds(index); - if (y <= bounds.y) break; - index++; - } - if (index == lineCount) { - topOffset = content.getOffsetAtLine(lineIndex + 1); - } else { - topOffset = content.getOffsetAtLine(lineIndex) + layout.getLineOffsets()[index]; - } - renderer.disposeTextLayout(layout); - } else { - topOffset = content.getOffsetAtLine(topIndex); - } - if (caretOffset > topOffset) { - setCaretOffset(topOffset, OFFSET_LEADING); - showCaret(); - } -} -/** - * Scrolls one page up so that the first line (truncated or whole) - * of the current page becomes the fully visible last line. - * The caret is scrolled the same number of lines so that its location - * relative to the top line remains the same. The exception is the beginning - * of the text where a full page scroll is not possible. In this case the - * caret is moved in front of the first character. - */ -void doPageUp(boolean select, int height) { - if (isSingleLine()) return; - int oldHScrollOffset = horizontalScrollOffset; - int oldColumnX = columnX; - if (isFixedLineHeight()) { - int caretLine = getCaretLine(); - if (caretLine > 0) { - int lineHeight = renderer.getLineHeight(); - int lines = (height == -1 ? clientAreaHeight : height) / lineHeight; - int scrollLines = Math.max(1, Math.min(caretLine, lines)); - caretLine -= scrollLines; - int[] alignment = new int[1]; - int offset = getOffsetAtPoint(columnX, getLinePixel(caretLine), alignment); - setCaretOffset(offset, alignment[0]); - if (select) { - doSelection(ST.COLUMN_PREVIOUS); - } - int verticalScrollOffset = getVerticalScrollOffset(); - int scrollOffset = Math.max(0, verticalScrollOffset - scrollLines * getVerticalIncrement()); - if (scrollOffset < verticalScrollOffset) { - scrollVertical(scrollOffset - verticalScrollOffset, true); - } - } - } else { - int caretLine = getCaretLine(); - int lineHeight, lineIndex; - if (height == -1) { - if (topIndexY == 0) { - height = clientAreaHeight; - } else { - int y; - if (topIndex > 0) { - lineIndex = topIndex - 1; - lineHeight = renderer.getLineHeight(lineIndex); - height = clientAreaHeight - topIndexY; - y = lineHeight - topIndexY; - } else { - lineIndex = topIndex; - lineHeight = renderer.getLineHeight(lineIndex); - height = clientAreaHeight - (lineHeight + topIndexY); - y = -topIndexY; - } - if (wordWrap) { - TextLayout layout = renderer.getTextLayout(lineIndex); - for (int i = 0; i < layout.getLineCount(); i++) { - Rectangle bounds = layout.getLineBounds(i); - if (bounds.contains(bounds.x, y)) { - height += lineHeight - (bounds.y + bounds.height); - break; - } - } - renderer.disposeTextLayout(layout); - } - } - } else { - lineIndex = getLineIndex(clientAreaHeight - height); - int topLineY = getLinePixel(lineIndex); - if (wordWrap) { - TextLayout layout = renderer.getTextLayout(lineIndex); - int y = topLineY; - for (int i = 0; i < layout.getLineCount(); i++) { - Rectangle bounds = layout.getLineBounds(i); - if (bounds.contains(bounds.x, y)) { - height = clientAreaHeight - (topLineY + bounds.y); - break; - } - } - renderer.disposeTextLayout(layout); - } else { - height = clientAreaHeight - topLineY; - } - } - int caretHeight = height; - if (wordWrap) { - TextLayout layout = renderer.getTextLayout(caretLine); - int offsetInLine = caretOffset - content.getOffsetAtLine(caretLine); - lineIndex = getVisualLineIndex(layout, offsetInLine); - caretHeight += layout.getBounds().height - layout.getLineBounds(lineIndex).y; - renderer.disposeTextLayout(layout); - } - lineIndex = caretLine; - lineHeight = renderer.getLineHeight(lineIndex); - while (caretHeight - lineHeight >= 0 && lineIndex > 0) { - caretHeight -= lineHeight; - lineHeight = renderer.getLineHeight(--lineIndex); - } - lineHeight = renderer.getLineHeight(lineIndex); - int[] alignment = new int[1]; - int offset = getOffsetAtPoint(columnX, lineHeight - caretHeight, lineIndex, alignment); - setCaretOffset(offset, alignment[0]); - if (select) doSelection(ST.COLUMN_PREVIOUS); - height = getAvailableHeightAbove(height); - scrollVertical(-height, true); - if (height == 0) setCaretLocation(); - } - showCaret(); - int hScrollChange = oldHScrollOffset - horizontalScrollOffset; - columnX = oldColumnX + hScrollChange; -} -/** - * Updates the selection to extend to the current caret position. - */ -void doSelection(int direction) { - int redrawStart = -1; - int redrawEnd = -1; - if (selectionAnchor == -1) { - selectionAnchor = selection.x; - } - if (direction == ST.COLUMN_PREVIOUS) { - if (caretOffset < selection.x) { - // grow selection - redrawEnd = selection.x; - redrawStart = selection.x = caretOffset; - // check if selection has reversed direction - if (selection.y != selectionAnchor) { - redrawEnd = selection.y; - selection.y = selectionAnchor; - } - // test whether selection actually changed. Fixes 1G71EO1 - } else if (selectionAnchor == selection.x && caretOffset < selection.y) { - // caret moved towards selection anchor (left side of selection). - // shrink selection - redrawEnd = selection.y; - redrawStart = selection.y = caretOffset; - } - } else { - if (caretOffset > selection.y) { - // grow selection - redrawStart = selection.y; - redrawEnd = selection.y = caretOffset; - // check if selection has reversed direction - if (selection.x != selectionAnchor) { - redrawStart = selection.x; - selection.x = selectionAnchor; - } - // test whether selection actually changed. Fixes 1G71EO1 - } else if (selectionAnchor == selection.y && caretOffset > selection.x) { - // caret moved towards selection anchor (right side of selection). - // shrink selection - redrawStart = selection.x; - redrawEnd = selection.x = caretOffset; - } - } - if (redrawStart != -1 && redrawEnd != -1) { - internalRedrawRange(redrawStart, redrawEnd - redrawStart); - sendSelectionEvent(); - } -} -/** - * Moves the caret to the next character or to the beginning of the - * next line if the cursor is at the end of a line. - */ -void doSelectionCursorNext() { - int caretLine = getCaretLine(); - int lineOffset = content.getOffsetAtLine(caretLine); - int offsetInLine = caretOffset - lineOffset; - int offset, alignment; - if (offsetInLine < content.getLine(caretLine).length()) { - TextLayout layout = renderer.getTextLayout(caretLine); - offsetInLine = layout.getNextOffset(offsetInLine, SWT.MOVEMENT_CLUSTER); - int lineStart = layout.getLineOffsets()[layout.getLineIndex(offsetInLine)]; - renderer.disposeTextLayout(layout); - offset = offsetInLine + lineOffset; - alignment = offsetInLine == lineStart ? OFFSET_LEADING : PREVIOUS_OFFSET_TRAILING; - setCaretOffset(offset, alignment); - showCaret(); - } else if (caretLine < content.getLineCount() - 1 && !isSingleLine()) { - caretLine++; - offset = content.getOffsetAtLine(caretLine); - alignment = PREVIOUS_OFFSET_TRAILING; - setCaretOffset(offset, alignment); - showCaret(); - } -} -/** - * Moves the caret to the previous character or to the end of the previous - * line if the cursor is at the beginning of a line. - */ -void doSelectionCursorPrevious() { - int caretLine = getCaretLine(); - int lineOffset = content.getOffsetAtLine(caretLine); - int offsetInLine = caretOffset - lineOffset; - if (offsetInLine > 0) { - int offset = getClusterPrevious(caretOffset, caretLine); - setCaretOffset(offset, OFFSET_LEADING); - showCaret(); - } else if (caretLine > 0) { - caretLine--; - lineOffset = content.getOffsetAtLine(caretLine); - int offset = lineOffset + content.getLine(caretLine).length(); - setCaretOffset(offset, OFFSET_LEADING); - showCaret(); - } -} -/** - * Moves the caret one line down and to the same character offset relative - * to the beginning of the line. Moves the caret to the end of the new line - * if the new line is shorter than the character offset. - * Moves the caret to the end of the text if the caret already is on the - * last line. - * Adjusts the selection according to the caret change. This can either add - * to or subtract from the old selection, depending on the previous selection - * direction. - */ -void doSelectionLineDown() { - int oldColumnX = columnX = getPointAtOffset(caretOffset).x; - doLineDown(true); - columnX = oldColumnX; -} -/** - * Moves the caret one line up and to the same character offset relative - * to the beginning of the line. Moves the caret to the end of the new line - * if the new line is shorter than the character offset. - * Moves the caret to the beginning of the document if it is already on the - * first line. - * Adjusts the selection according to the caret change. This can either add - * to or subtract from the old selection, depending on the previous selection - * direction. - */ -void doSelectionLineUp() { - int oldColumnX = columnX = getPointAtOffset(caretOffset).x; - doLineUp(true); - columnX = oldColumnX; -} -/** - * Scrolls one page down so that the last line (truncated or whole) - * of the current page becomes the fully visible top line. - *

    - * The caret is scrolled the same number of lines so that its location - * relative to the top line remains the same. The exception is the end - * of the text where a full page scroll is not possible. In this case - * the caret is moved after the last character. - *

    - * Adjusts the selection according to the caret change. This can either add - * to or subtract from the old selection, depending on the previous selection - * direction. - *

    - */ -void doSelectionPageDown(int pixels) { - int oldColumnX = columnX = getPointAtOffset(caretOffset).x; - doPageDown(true, pixels); - columnX = oldColumnX; -} -/** - * Scrolls one page up so that the first line (truncated or whole) - * of the current page becomes the fully visible last line. - *

    - * The caret is scrolled the same number of lines so that its location - * relative to the top line remains the same. The exception is the beginning - * of the text where a full page scroll is not possible. In this case the - * caret is moved in front of the first character. - *

    - * Adjusts the selection according to the caret change. This can either add - * to or subtract from the old selection, depending on the previous selection - * direction. - *

    - */ -void doSelectionPageUp(int pixels) { - int oldColumnX = columnX = getPointAtOffset(caretOffset).x; - doPageUp(true, pixels); - columnX = oldColumnX; -} -/** - * Moves the caret to the end of the next word . - */ -void doSelectionWordNext() { - int offset = getWordNext(caretOffset, SWT.MOVEMENT_WORD); - // don't change caret position if in single line mode and the cursor - // would be on a different line. fixes 5673 - if (!isSingleLine() || - content.getLineAtOffset(caretOffset) == content.getLineAtOffset(offset)) { - // Force symmetrical movement for word next and previous. Fixes 14536 - setCaretOffset(offset, OFFSET_LEADING); - showCaret(); - } -} -/** - * Moves the caret to the start of the previous word. - */ -void doSelectionWordPrevious() { - int offset = getWordPrevious(caretOffset, SWT.MOVEMENT_WORD); - setCaretOffset(offset, OFFSET_LEADING); - showCaret(); -} -/** - * Moves the caret one character to the left. Do not go to the previous line. - * When in a bidi locale and at a R2L character the caret is moved to the - * beginning of the R2L segment (visually right) and then one character to the - * left (visually left because it's now in a L2R segment). - */ -void doVisualPrevious() { - int offset = getClusterPrevious(caretOffset, getCaretLine()); - setCaretOffset(offset, SWT.DEFAULT); - showCaret(); -} -/** - * Moves the caret one character to the right. Do not go to the next line. - * When in a bidi locale and at a R2L character the caret is moved to the - * end of the R2L segment (visually left) and then one character to the - * right (visually right because it's now in a L2R segment). - */ -void doVisualNext() { - int offset = getClusterNext(caretOffset, getCaretLine()); - setCaretOffset(offset, SWT.DEFAULT); - showCaret(); -} -/** - * Moves the caret to the end of the next word. - * If a selection exists, move the caret to the end of the selection - * and remove the selection. - */ -void doWordNext() { - if (selection.y - selection.x > 0) { - setCaretOffset(selection.y, SWT.DEFAULT); - showCaret(); - } else { - doSelectionWordNext(); - } -} -/** - * Moves the caret to the start of the previous word. - * If a selection exists, move the caret to the start of the selection - * and remove the selection. - */ -void doWordPrevious() { - if (selection.y - selection.x > 0) { - setCaretOffset(selection.x, SWT.DEFAULT); - showCaret(); - } else { - doSelectionWordPrevious(); - } -} -/** - * Ends the autoscroll process. - */ -void endAutoScroll() { - autoScrollDirection = SWT.NULL; -} -public Color getBackground() { - checkWidget(); - if (background == null) { - return getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND); - } - return background; -} -/** - * Returns the baseline, in pixels. - * - * Note: this API should not be used if a StyleRange attribute causes lines to - * have different heights (i.e. different fonts, rise, etc). - * - * @return baseline the baseline - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @since 3.0 - * - * @see #getBaseline(int) - */ -public int getBaseline() { - checkWidget(); - return renderer.getBaseline(); -} -/** - * Returns the baseline at the given offset, in pixels. - * - * @param offset the offset - * - * @return baseline the baseline - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when the offset is outside the valid range (< 0 or > getCharCount())
    • - *
    - * - * @since 3.2 - */ -public int getBaseline(int offset) { - checkWidget(); - if (!(0 <= offset && offset <= content.getCharCount())) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - if (isFixedLineHeight()) { - return renderer.getBaseline(); - } - int lineIndex = content.getLineAtOffset(offset); - int lineOffset = content.getOffsetAtLine(lineIndex); - TextLayout layout = renderer.getTextLayout(lineIndex); - int lineInParagraph = layout.getLineIndex(Math.min(offset - lineOffset, layout.getText().length())); - FontMetrics metrics = layout.getLineMetrics(lineInParagraph); - renderer.disposeTextLayout(layout); - return metrics.getAscent() + metrics.getLeading(); -} -/** - * Gets the BIDI coloring mode. When true the BIDI text display - * algorithm is applied to segments of text that are the same - * color. - * - * @return the current coloring mode - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @deprecated use BidiSegmentListener instead. - */ -public boolean getBidiColoring() { - checkWidget(); - return bidiColoring; -} -/** - * Returns whether the widget is in block selection mode. - * - * @return true if widget is in block selection mode, false otherwise - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public boolean getBlockSelection() { - checkWidget(); - return blockSelection; -} -Rectangle getBlockSelectonPosition() { - int firstLine = getLineIndex(blockYAnchor - getVerticalScrollOffset()); - int lastLine = getLineIndex(blockYLocation - getVerticalScrollOffset()); - if (firstLine > lastLine) { - int temp = firstLine; - firstLine = lastLine; - lastLine = temp; - } - int left = blockXAnchor; - int right = blockXLocation; - if (left > right) { - left = blockXLocation; - right = blockXAnchor; - } - return new Rectangle (left - horizontalScrollOffset, firstLine, right - horizontalScrollOffset, lastLine); -} -/** - * Returns the block selection bounds. The bounds is - * relative to the upper left corner of the document. - * - * @return the block selection bounds - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public Rectangle getBlockSelectionBounds() { - Rectangle rect; - if (blockSelection && blockXLocation != -1) { - rect = getBlockSelectionRectangle(); - } else { - Point startPoint = getPointAtOffset(selection.x); - Point endPoint = getPointAtOffset(selection.y); - int height = getLineHeight(selection.y); - rect = new Rectangle(startPoint.x, startPoint.y, endPoint.x - startPoint.x, endPoint.y + height - startPoint.y); - if (selection.x == selection.y) { - rect.width = getCaretWidth(); - } - } - rect.x += horizontalScrollOffset; - rect.y += getVerticalScrollOffset(); - return rect; -} -Rectangle getBlockSelectionRectangle() { - Rectangle rect = getBlockSelectonPosition(); - rect.y = getLinePixel(rect.y); - rect.width = rect.width - rect.x; - rect.height = getLinePixel(rect.height + 1) - rect.y; - return rect; -} -String getBlockSelectionText(String delimiter) { - Rectangle rect = getBlockSelectonPosition(); - int firstLine = rect.y; - int lastLine = rect.height; - int left = rect.x; - int right = rect.width; - StringBuffer buffer = new StringBuffer(); - for (int lineIndex = firstLine; lineIndex <= lastLine; lineIndex++) { - int start = getOffsetAtPoint(left, 0, lineIndex, null); - int end = getOffsetAtPoint(right, 0, lineIndex, null); - if (start > end) { - int temp = start; - start = end; - end = temp; - } - String text = content.getTextRange(start, end - start); - buffer.append(text); - if (lineIndex < lastLine) buffer.append(delimiter); - } - return buffer.toString(); -} -/** - * Returns the index of the last fully visible line. - * - * @return index of the last fully visible line. - */ -int getBottomIndex() { - int bottomIndex; - if (isFixedLineHeight()) { - int lineCount = 1; - int lineHeight = renderer.getLineHeight(); - if (lineHeight != 0) { - // calculate the number of lines that are fully visible - int partialTopLineHeight = topIndex * lineHeight - getVerticalScrollOffset(); - lineCount = (clientAreaHeight - partialTopLineHeight) / lineHeight; - } - bottomIndex = Math.min(content.getLineCount() - 1, topIndex + Math.max(0, lineCount - 1)); - } else { - int clientAreaHeight = this.clientAreaHeight - bottomMargin; - bottomIndex = getLineIndex(clientAreaHeight); - if (bottomIndex > 0) { - int linePixel = getLinePixel(bottomIndex); - int lineHeight = renderer.getLineHeight(bottomIndex); - if (linePixel + lineHeight > clientAreaHeight) { - if (getLinePixel(bottomIndex - 1) >= topMargin) { - bottomIndex--; - } - } - } - } - return bottomIndex; -} -/** - * Returns the bottom margin. - * - * @return the bottom margin. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public int getBottomMargin() { - checkWidget(); - return bottomMargin; -} -Rectangle getBoundsAtOffset(int offset) { - int lineIndex = content.getLineAtOffset(offset); - int lineOffset = content.getOffsetAtLine(lineIndex); - String line = content.getLine(lineIndex); - Rectangle bounds; - if (line.length() != 0) { - int offsetInLine = offset - lineOffset; - TextLayout layout = renderer.getTextLayout(lineIndex); - bounds = layout.getBounds(offsetInLine, offsetInLine); - renderer.disposeTextLayout(layout); - } else { - bounds = new Rectangle (0, 0, 0, renderer.getLineHeight()); - } - if (offset == caretOffset) { - int lineEnd = lineOffset + line.length(); - if (offset == lineEnd) { - bounds.width += getCaretWidth(); - } - } - bounds.x += leftMargin - horizontalScrollOffset; - bounds.y += getLinePixel(lineIndex); - return bounds; -} -/** - * Returns the caret position relative to the start of the text. - * - * @return the caret position relative to the start of the text. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getCaretOffset() { - checkWidget(); - return caretOffset; -} -/** - * Returns the caret width. - * - * @return the caret width, 0 if caret is null. - */ -int getCaretWidth() { - Caret caret = getCaret(); - if (caret == null) return 0; - return caret.getSize().x; -} -Object getClipboardContent(int clipboardType) { - TextTransfer plainTextTransfer = TextTransfer.getInstance(); - return clipboard.getContents(plainTextTransfer, clipboardType); -} -int getClusterNext(int offset, int lineIndex) { - int lineOffset = content.getOffsetAtLine(lineIndex); - TextLayout layout = renderer.getTextLayout(lineIndex); - offset -= lineOffset; - offset = layout.getNextOffset(offset, SWT.MOVEMENT_CLUSTER); - offset += lineOffset; - renderer.disposeTextLayout(layout); - return offset; -} -int getClusterPrevious(int offset, int lineIndex) { - int lineOffset = content.getOffsetAtLine(lineIndex); - TextLayout layout = renderer.getTextLayout(lineIndex); - offset -= lineOffset; - offset = layout.getPreviousOffset(offset, SWT.MOVEMENT_CLUSTER); - offset += lineOffset; - renderer.disposeTextLayout(layout); - return offset; -} -/** - * Returns the content implementation that is used for text storage. - * - * @return content the user defined content implementation that is used for - * text storage or the default content implementation if no user defined - * content implementation has been set. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public StyledTextContent getContent() { - checkWidget(); - return content; -} -public boolean getDragDetect () { - checkWidget (); - return dragDetect; -} -/** - * Returns whether the widget implements double click mouse behavior. - * - * @return true if double clicking a word selects the word, false if double clicks - * have the same effect as regular mouse clicks - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public boolean getDoubleClickEnabled() { - checkWidget(); - return doubleClickEnabled; -} -/** - * Returns whether the widget content can be edited. - * - * @return true if content can be edited, false otherwise - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public boolean getEditable() { - checkWidget(); - return editable; -} -public Color getForeground() { - checkWidget(); - if (foreground == null) { - return getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND); - } - return foreground; -} -/** - * Returns the horizontal scroll increment. - * - * @return horizontal scroll increment. - */ -int getHorizontalIncrement() { - return renderer.averageCharWidth; -} -/** - * Returns the horizontal scroll offset relative to the start of the line. - * - * @return horizontal scroll offset relative to the start of the line, - * measured in character increments starting at 0, if > 0 the content is scrolled - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getHorizontalIndex() { - checkWidget(); - return horizontalScrollOffset / getHorizontalIncrement(); -} -/** - * Returns the horizontal scroll offset relative to the start of the line. - * - * @return the horizontal scroll offset relative to the start of the line, - * measured in pixel starting at 0, if > 0 the content is scrolled. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getHorizontalPixel() { - checkWidget(); - return horizontalScrollOffset; -} -/** - * Returns the line indentation of the widget. - * - * @return the line indentation - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see #getLineIndent(int) - * - * @since 3.2 - */ -public int getIndent() { - checkWidget(); - return indent; -} -/** - * Returns whether the widget justifies lines. - * - * @return whether lines are justified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see #getLineJustify(int) - * - * @since 3.2 - */ -public boolean getJustify() { - checkWidget(); - return justify; -} -/** - * Returns the action assigned to the key. - * Returns SWT.NULL if there is no action associated with the key. - * - * @param key a key code defined in SWT.java or a character. - * Optionally ORd with a state mask. Preferred state masks are one or more of - * SWT.MOD1, SWT.MOD2, SWT.MOD3, since these masks account for modifier platform - * differences. However, there may be cases where using the specific state masks - * (i.e., SWT.CTRL, SWT.SHIFT, SWT.ALT, SWT.COMMAND) makes sense. - * @return one of the predefined actions defined in ST.java or SWT.NULL - * if there is no action associated with the key. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getKeyBinding(int key) { - checkWidget(); - Integer action = (Integer) keyActionMap.get(new Integer(key)); - return action == null ? SWT.NULL : action.intValue(); -} -/** - * Gets the number of characters. - * - * @return number of characters in the widget - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getCharCount() { - checkWidget(); - return content.getCharCount(); -} -/** - * Returns the line at the given line index without delimiters. - * Index 0 is the first line of the content. When there are not - * any lines, getLine(0) is a valid call that answers an empty string. - *

    - * - * @param lineIndex index of the line to return. - * @return the line text without delimiters - * - * @exception SWTException

      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when the line index is outside the valid range (< 0 or >= getLineCount())
    • - *
    - * @since 3.4 - */ -public String getLine(int lineIndex) { - checkWidget(); - if (lineIndex < 0 || - (lineIndex > 0 && lineIndex >= content.getLineCount())) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - return content.getLine(lineIndex); -} -/** - * Returns the alignment of the line at the given index. - * - * @param index the index of the line - * - * @return the line alignment - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when the index is invalid
    • - *
    - * - * @see #getAlignment() - * - * @since 3.2 - */ -public int getLineAlignment(int index) { - checkWidget(); - if (index < 0 || index > content.getLineCount()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - return renderer.getLineAlignment(index, alignment); -} -/** - * Returns the line at the specified offset in the text - * where 0 < offset < getCharCount() so that getLineAtOffset(getCharCount()) - * returns the line of the insert location. - * - * @param offset offset relative to the start of the content. - * 0 <= offset <= getCharCount() - * @return line at the specified offset in the text - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when the offset is outside the valid range (< 0 or > getCharCount())
    • - *
    - */ -public int getLineAtOffset(int offset) { - checkWidget(); - if (offset < 0 || offset > getCharCount()) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - return content.getLineAtOffset(offset); -} -/** - * Returns the background color of the line at the given index. - * Returns null if a LineBackgroundListener has been set or if no background - * color has been specified for the line. Should not be called if a - * LineBackgroundListener has been set since the listener maintains the - * line background colors. - * - * @param index the index of the line - * @return the background color of the line at the given index. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when the index is invalid
    • - *
    - */ -public Color getLineBackground(int index) { - checkWidget(); - if (index < 0 || index > content.getLineCount()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - return isListening(LineGetBackground) ? null : renderer.getLineBackground(index, null); -} -/** - * Returns the bullet of the line at the given index. - * - * @param index the index of the line - * - * @return the line bullet - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when the index is invalid
    • - *
    - * - * @since 3.2 - */ -public Bullet getLineBullet(int index) { - checkWidget(); - if (index < 0 || index > content.getLineCount()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - return isListening(LineGetStyle) ? null : renderer.getLineBullet(index, null); -} -/** - * Returns the line background data for the given line or null if - * there is none. - * - * @param lineOffset offset of the line start relative to the start - * of the content. - * @param line line to get line background data for - * @return line background data for the given line. - */ -StyledTextEvent getLineBackgroundData(int lineOffset, String line) { - return sendLineEvent(LineGetBackground, lineOffset, line); -} -/** - * Gets the number of text lines. - * - * @return the number of lines in the widget - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getLineCount() { - checkWidget(); - return content.getLineCount(); -} -/** - * Returns the number of lines that can be completely displayed in the - * widget client area. - * - * @return number of lines that can be completely displayed in the widget - * client area. - */ -int getLineCountWhole() { - if (isFixedLineHeight()) { - int lineHeight = renderer.getLineHeight(); - return lineHeight != 0 ? clientAreaHeight / lineHeight : 1; - } - return getBottomIndex() - topIndex + 1; -} -/** - * Returns the line delimiter used for entering new lines by key down - * or paste operation. - * - * @return line delimiter used for entering new lines by key down - * or paste operation. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public String getLineDelimiter() { - checkWidget(); - return content.getLineDelimiter(); -} -/** - * Returns the line height. - *

    - * Note: this API should not be used if a StyleRange attribute causes lines to - * have different heights (i.e. different fonts, rise, etc). - *

    - * - * @return line height in pixel. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @see #getLineHeight(int) - */ -public int getLineHeight() { - checkWidget(); - return renderer.getLineHeight(); -} -/** - * Returns the line height at the given offset. - * - * @param offset the offset - * - * @return line height in pixels - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when the offset is outside the valid range (< 0 or > getCharCount())
    • - *
    - * - * @since 3.2 - */ -public int getLineHeight(int offset) { - checkWidget(); - if (!(0 <= offset && offset <= content.getCharCount())) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - if (isFixedLineHeight()) { - return renderer.getLineHeight(); - } - int lineIndex = content.getLineAtOffset(offset); - int lineOffset = content.getOffsetAtLine(lineIndex); - TextLayout layout = renderer.getTextLayout(lineIndex); - int lineInParagraph = layout.getLineIndex(Math.min(offset - lineOffset, layout.getText().length())); - int height = layout.getLineBounds(lineInParagraph).height; - renderer.disposeTextLayout(layout); - return height; -} -/** - * Returns the indentation of the line at the given index. - * - * @param index the index of the line - * - * @return the line indentation - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when the index is invalid
    • - *
    - * - * @see #getIndent() - * - * @since 3.2 - */ -public int getLineIndent(int index) { - checkWidget(); - if (index < 0 || index > content.getLineCount()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - return isListening(LineGetStyle) ? 0 : renderer.getLineIndent(index, indent); -} -/** - * Returns whether the line at the given index is justified. - * - * @param index the index of the line - * - * @return whether the line is justified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when the index is invalid
    • - *
    - * - * @see #getJustify() - * - * @since 3.2 - */ -public boolean getLineJustify(int index) { - checkWidget(); - if (index < 0 || index > content.getLineCount()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - return isListening(LineGetStyle) ? false : renderer.getLineJustify(index, justify); -} -/** - * Returns the line spacing of the widget. - * - * @return the line spacing - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.2 - */ -public int getLineSpacing() { - checkWidget(); - return lineSpacing; -} -/** - * Returns the line style data for the given line or null if there is - * none. - *

    - * If there is a LineStyleListener but it does not set any styles, - * the StyledTextEvent.styles field will be initialized to an empty - * array. - *

    - * - * @param lineOffset offset of the line start relative to the start of - * the content. - * @param line line to get line styles for - * @return line style data for the given line. Styles may start before - * line start and end after line end - */ -StyledTextEvent getLineStyleData(int lineOffset, String line) { - return sendLineEvent(LineGetStyle, lineOffset, line); -} -/** - * Returns the top pixel, relative to the client area, of a given line. - * Clamps out of ranges index. - * - * @param lineIndex the line index, the max value is lineCount. If - * lineIndex == lineCount it returns the bottom pixel of the last line. - * It means this function can be used to retrieve the bottom pixel of any line. - * - * @return the top pixel of a given line index - * - * @since 3.2 - */ -public int getLinePixel(int lineIndex) { - checkWidget(); - int lineCount = content.getLineCount(); - lineIndex = Math.max(0, Math.min(lineCount, lineIndex)); - if (isFixedLineHeight()) { - int lineHeight = renderer.getLineHeight(); - return lineIndex * lineHeight - getVerticalScrollOffset() + topMargin; - } - if (lineIndex == topIndex) return topIndexY + topMargin; - int height = topIndexY; - if (lineIndex > topIndex) { - for (int i = topIndex; i < lineIndex; i++) { - height += renderer.getLineHeight(i); - } - } else { - for (int i = topIndex - 1; i >= lineIndex; i--) { - height -= renderer.getLineHeight(i); - } - } - return height + topMargin; -} -/** - * Returns the line index for a y, relative to the client area. - * The line index returned is always in the range 0..lineCount - 1. - * - * @param y the y-coordinate pixel - * - * @return the line index for a given y-coordinate pixel - * - * @since 3.2 - */ -public int getLineIndex(int y) { - checkWidget(); - y -= topMargin; - if (isFixedLineHeight()) { - int lineHeight = renderer.getLineHeight(); - int lineIndex = (y + getVerticalScrollOffset()) / lineHeight; - int lineCount = content.getLineCount(); - lineIndex = Math.max(0, Math.min(lineCount - 1, lineIndex)); - return lineIndex; - } - if (y == topIndexY) return topIndex; - int line = topIndex; - if (y < topIndexY) { - while (y < topIndexY && line > 0) { - y += renderer.getLineHeight(--line); - } - } else { - int lineCount = content.getLineCount(); - int lineHeight = renderer.getLineHeight(line); - while (y - lineHeight >= topIndexY && line < lineCount - 1) { - y -= lineHeight; - lineHeight = renderer.getLineHeight(++line); - } - } - return line; -} -/** - * Returns the left margin. - * - * @return the left margin. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public int getLeftMargin() { - checkWidget(); - return leftMargin - alignmentMargin; -} -/** - * Returns the x, y location of the upper left corner of the character - * bounding box at the specified offset in the text. The point is - * relative to the upper left corner of the widget client area. - * - * @param offset offset relative to the start of the content. - * 0 <= offset <= getCharCount() - * @return x, y location of the upper left corner of the character - * bounding box at the specified offset in the text. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when the offset is outside the valid range (< 0 or > getCharCount())
    • - *
    - */ -public Point getLocationAtOffset(int offset) { - checkWidget(); - if (offset < 0 || offset > getCharCount()) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - return getPointAtOffset(offset); -} -/** - * Returns the character offset of the first character of the given line. - * - * @param lineIndex index of the line, 0 based relative to the first - * line in the content. 0 <= lineIndex < getLineCount(), except - * lineIndex may always be 0 - * @return offset offset of the first character of the line, relative to - * the beginning of the document. The first character of the document is - * at offset 0. - * When there are not any lines, getOffsetAtLine(0) is a valid call that - * answers 0. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when the line index is outside the valid range (< 0 or >= getLineCount())
    • - *
    - * @since 2.0 - */ -public int getOffsetAtLine(int lineIndex) { - checkWidget(); - if (lineIndex < 0 || - (lineIndex > 0 && lineIndex >= content.getLineCount())) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - return content.getOffsetAtLine(lineIndex); -} -/** - * Returns the offset of the character at the given location relative - * to the first character in the document. - *

    - * The return value reflects the character offset that the caret will - * be placed at if a mouse click occurred at the specified location. - * If the x coordinate of the location is beyond the center of a character - * the returned offset will be behind the character. - *

    - * - * @param point the origin of character bounding box relative to - * the origin of the widget client area. - * @return offset of the character at the given location relative - * to the first character in the document. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when point is null
    • - *
    • ERROR_INVALID_ARGUMENT when there is no character at the specified location
    • - *
    - */ -public int getOffsetAtLocation(Point point) { - checkWidget(); - if (point == null) { - SWT.error(SWT.ERROR_NULL_ARGUMENT); - } - int[] trailing = new int[1]; - int offset = getOffsetAtPoint(point.x, point.y, trailing, true); - if (offset == -1) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - return offset + trailing[0]; -} -int getOffsetAtPoint(int x, int y, int[] alignment) { - int lineIndex = getLineIndex(y); - y -= getLinePixel(lineIndex); - return getOffsetAtPoint(x, y, lineIndex, alignment); -} -int getOffsetAtPoint(int x, int y, int lineIndex, int[] alignment) { - TextLayout layout = renderer.getTextLayout(lineIndex); - x += horizontalScrollOffset - leftMargin; - int[] trailing = new int[1]; - int offsetInLine = layout.getOffset(x, y, trailing); - if (alignment != null) alignment[0] = OFFSET_LEADING; - if (trailing[0] != 0) { - int lineInParagraph = layout.getLineIndex(offsetInLine + trailing[0]); - int lineStart = layout.getLineOffsets()[lineInParagraph]; - if (offsetInLine + trailing[0] == lineStart) { - offsetInLine += trailing[0]; - if (alignment != null) alignment[0] = PREVIOUS_OFFSET_TRAILING; - } else { - String line = content.getLine(lineIndex); - int level = 0; - if (alignment != null) { - int offset = offsetInLine; - while (offset > 0 && Character.isDigit(line.charAt(offset))) offset--; - if (offset == 0 && Character.isDigit(line.charAt(offset))) { - level = isMirrored() ? 1 : 0; - } else { - level = layout.getLevel(offset) & 0x1; - } - } - offsetInLine += trailing[0]; - if (alignment != null) { - int trailingLevel = layout.getLevel(offsetInLine) & 0x1; - if ((level ^ trailingLevel) != 0) { - alignment[0] = PREVIOUS_OFFSET_TRAILING; - } else { - alignment[0] = OFFSET_LEADING; - } - } - } - } - renderer.disposeTextLayout(layout); - return offsetInLine + content.getOffsetAtLine(lineIndex); -} -int getOffsetAtPoint(int x, int y, int[] trailing, boolean inTextOnly) { - if (inTextOnly && y + getVerticalScrollOffset() < 0 || x + horizontalScrollOffset < 0) { - return -1; - } - int bottomIndex = getPartialBottomIndex(); - int height = getLinePixel(bottomIndex + 1); - if (inTextOnly && y > height) { - return -1; - } - int lineIndex = getLineIndex(y); - int lineOffset = content.getOffsetAtLine(lineIndex); - TextLayout layout = renderer.getTextLayout(lineIndex); - x += horizontalScrollOffset - leftMargin; - y -= getLinePixel(lineIndex); - int offset = layout.getOffset(x, y, trailing); - Rectangle rect = layout.getLineBounds(layout.getLineIndex(offset)); - renderer.disposeTextLayout(layout); - if (inTextOnly && !(rect.x <= x && x <= rect.x + rect.width)) { - return -1; - } - return offset + lineOffset; -} -/** - * Returns the orientation of the receiver. - * - * @return the orientation style - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 2.1.2 - */ -public int getOrientation () { - checkWidget(); - return isMirrored() ? SWT.RIGHT_TO_LEFT : SWT.LEFT_TO_RIGHT; -} -/** - * Returns the index of the last partially visible line. - * - * @return index of the last partially visible line. - */ -int getPartialBottomIndex() { - if (isFixedLineHeight()) { - int lineHeight = renderer.getLineHeight(); - int partialLineCount = Compatibility.ceil(clientAreaHeight, lineHeight); - return Math.max(0, Math.min(content.getLineCount(), topIndex + partialLineCount) - 1); - } - return getLineIndex(clientAreaHeight - bottomMargin); -} -/** - * Returns the index of the first partially visible line. - * - * @return index of the first partially visible line. - */ -int getPartialTopIndex() { - if (isFixedLineHeight()) { - int lineHeight = renderer.getLineHeight(); - return getVerticalScrollOffset() / lineHeight; - } - return topIndexY <= 0 ? topIndex : topIndex - 1; -} -/** - * Returns the content in the specified range using the platform line - * delimiter to separate lines. - * - * @param writer the TextWriter to write line text into - * @return the content in the specified range using the platform line - * delimiter to separate lines as written by the specified TextWriter. - */ -String getPlatformDelimitedText(TextWriter writer) { - int end = writer.getStart() + writer.getCharCount(); - int startLine = content.getLineAtOffset(writer.getStart()); - int endLine = content.getLineAtOffset(end); - String endLineText = content.getLine(endLine); - int endLineOffset = content.getOffsetAtLine(endLine); - - for (int i = startLine; i <= endLine; i++) { - writer.writeLine(content.getLine(i), content.getOffsetAtLine(i)); - if (i < endLine) { - writer.writeLineDelimiter(PlatformLineDelimiter); - } - } - if (end > endLineOffset + endLineText.length()) { - writer.writeLineDelimiter(PlatformLineDelimiter); - } - writer.close(); - return writer.toString(); -} -/** - * Returns all the ranges of text that have an associated StyleRange. - * Returns an empty array if a LineStyleListener has been set. - * Should not be called if a LineStyleListener has been set since the - * listener maintains the styles. - *

    - * The ranges array contains start and length pairs. Each pair refers to - * the corresponding style in the styles array. For example, the pair - * that starts at ranges[n] with length ranges[n+1] uses the style - * at styles[n/2] returned by getStyleRanges(int, int, boolean). - *

    - * - * @return the ranges or an empty array if a LineStyleListener has been set. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.2 - * - * @see #getStyleRanges(boolean) - */ -public int[] getRanges() { - checkWidget(); - if (!isListening(LineGetStyle)) { - int[] ranges = renderer.getRanges(0, content.getCharCount()); - if (ranges != null) return ranges; - } - return new int[0]; -} -/** - * Returns the ranges of text that have an associated StyleRange. - * Returns an empty array if a LineStyleListener has been set. - * Should not be called if a LineStyleListener has been set since the - * listener maintains the styles. - *

    - * The ranges array contains start and length pairs. Each pair refers to - * the corresponding style in the styles array. For example, the pair - * that starts at ranges[n] with length ranges[n+1] uses the style - * at styles[n/2] returned by getStyleRanges(int, int, boolean). - *

    - * - * @param start the start offset of the style ranges to return - * @param length the number of style ranges to return - * - * @return the ranges or an empty array if a LineStyleListener has been set. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE if start or length are outside the widget content
    • - *
    - * - * @since 3.2 - * - * @see #getStyleRanges(int, int, boolean) - */ -public int[] getRanges(int start, int length) { - checkWidget(); - int contentLength = getCharCount(); - int end = start + length; - if (start > end || start < 0 || end > contentLength) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - if (!isListening(LineGetStyle)) { - int[] ranges = renderer.getRanges(start, length); - if (ranges != null) return ranges; - } - return new int[0]; -} -/** - * Returns the right margin. - * - * @return the right margin. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public int getRightMargin() { - checkWidget(); - return rightMargin; -} -/** - * Returns the selection. - *

    - * Text selections are specified in terms of caret positions. In a text - * widget that contains N characters, there are N+1 caret positions, - * ranging from 0..N - *

    - * - * @return start and end of the selection, x is the offset of the first - * selected character, y is the offset after the last selected character. - * The selection values returned are visual (i.e., x will always always be - * <= y). To determine if a selection is right-to-left (RtoL) vs. left-to-right - * (LtoR), compare the caretOffset to the start and end of the selection - * (e.g., caretOffset == start of selection implies that the selection is RtoL). - * @see #getSelectionRange - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public Point getSelection() { - checkWidget(); - return new Point(selection.x, selection.y); -} -/** - * Returns the selection. - * - * @return start and length of the selection, x is the offset of the - * first selected character, relative to the first character of the - * widget content. y is the length of the selection. - * The selection values returned are visual (i.e., length will always always be - * positive). To determine if a selection is right-to-left (RtoL) vs. left-to-right - * (LtoR), compare the caretOffset to the start and end of the selection - * (e.g., caretOffset == start of selection implies that the selection is RtoL). - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public Point getSelectionRange() { - checkWidget(); - return new Point(selection.x, selection.y - selection.x); -} -/** - * Returns the ranges of text that are inside the block selection rectangle. - *

    - * The ranges array contains start and length pairs. When the receiver is not - * in block selection mode the return arrays contains the start and length of - * the regular selection. - * - * @return the ranges array - * - * @exception SWTException

      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public int[] getSelectionRanges() { - checkWidget(); - if (blockSelection && blockXLocation != -1) { - Rectangle rect = getBlockSelectonPosition(); - int firstLine = rect.y; - int lastLine = rect.height; - int left = rect.x; - int right = rect.width; - int[] ranges = new int[(lastLine - firstLine + 1) * 2]; - int index = 0; - for (int lineIndex = firstLine; lineIndex <= lastLine; lineIndex++) { - int start = getOffsetAtPoint(left, 0, lineIndex, null); - int end = getOffsetAtPoint(right, 0, lineIndex, null); - if (start > end) { - int temp = start; - start = end; - end = temp; - } - ranges[index++] = start; - ranges[index++] = end - start; - } - return ranges; - } - return new int[] {selection.x, selection.y - selection.x}; -} -/** - * Returns the receiver's selection background color. - * - * @return the selection background color - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @since 2.1 - */ -public Color getSelectionBackground() { - checkWidget(); - if (selectionBackground == null) { - return getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION); - } - return selectionBackground; -} -/** - * Gets the number of selected characters. - * - * @return the number of selected characters. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getSelectionCount() { - checkWidget(); - if (blockSelection && blockXLocation != -1) { - return getBlockSelectionText(content.getLineDelimiter()).length(); - } - return getSelectionRange().y; -} -/** - * Returns the receiver's selection foreground color. - * - * @return the selection foreground color - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @since 2.1 - */ -public Color getSelectionForeground() { - checkWidget(); - if (selectionForeground == null) { - return getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT); - } - return selectionForeground; -} -/** - * Returns the selected text. - * - * @return selected text, or an empty String if there is no selection. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public String getSelectionText() { - checkWidget(); - if (blockSelection && blockXLocation != -1) { - return getBlockSelectionText(content.getLineDelimiter()); - } - return content.getTextRange(selection.x, selection.y - selection.x); -} -public int getStyle() { - int style = super.getStyle(); - style &= ~(SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT | SWT.MIRRORED); - if (isMirrored()) { - style |= SWT.RIGHT_TO_LEFT | SWT.MIRRORED; - } else { - style |= SWT.LEFT_TO_RIGHT; - } - return style; -} - -/** - * Returns the text segments that should be treated as if they - * had a different direction than the surrounding text. - * - * @param lineOffset offset of the first character in the line. - * 0 based from the beginning of the document. - * @param line text of the line to specify bidi segments for - * @return text segments that should be treated as if they had a - * different direction than the surrounding text. Only the start - * index of a segment is specified, relative to the start of the - * line. Always starts with 0 and ends with the line length. - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT - if the segment indices returned - * by the listener do not start with 0, are not in ascending order, - * exceed the line length or have duplicates
    • - *
    - */ -int [] getBidiSegments(int lineOffset, String line) { - if (!isBidi()) return null; - if (!isListening(LineGetSegments)) { - return getBidiSegmentsCompatibility(line, lineOffset); - } - StyledTextEvent event = sendLineEvent(LineGetSegments, lineOffset, line); - int lineLength = line.length(); - int[] segments; - if (event == null || event.segments == null || event.segments.length == 0) { - segments = new int[] {0, lineLength}; - } else { - int segmentCount = event.segments.length; - - // test segment index consistency - if (event.segments[0] != 0) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - for (int i = 1; i < segmentCount; i++) { - if (event.segments[i] <= event.segments[i - 1] || event.segments[i] > lineLength) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - } - // ensure that last segment index is line end offset - if (event.segments[segmentCount - 1] != lineLength) { - segments = new int[segmentCount + 1]; - System.arraycopy(event.segments, 0, segments, 0, segmentCount); - segments[segmentCount] = lineLength; - } else { - segments = event.segments; - } - } - return segments; -} -/** - * @see #getBidiSegments - * Supports deprecated setBidiColoring API. Remove when API is removed. - */ -int [] getBidiSegmentsCompatibility(String line, int lineOffset) { - int lineLength = line.length(); - if (!bidiColoring) { - return new int[] {0, lineLength}; - } - StyleRange [] styles = null; - StyledTextEvent event = getLineStyleData(lineOffset, line); - if (event != null) { - styles = event.styles; - } else { - styles = renderer.getStyleRanges(lineOffset, lineLength, true); - } - if (styles == null || styles.length == 0) { - return new int[] {0, lineLength}; - } - int k=0, count = 1; - while (k < styles.length && styles[k].start == 0 && styles[k].length == lineLength) { - k++; - } - int[] offsets = new int[(styles.length - k) * 2 + 2]; - for (int i = k; i < styles.length; i++) { - StyleRange style = styles[i]; - int styleLineStart = Math.max(style.start - lineOffset, 0); - int styleLineEnd = Math.max(style.start + style.length - lineOffset, styleLineStart); - styleLineEnd = Math.min (styleLineEnd, line.length ()); - if (i > 0 && count > 1 && - ((styleLineStart >= offsets[count-2] && styleLineStart <= offsets[count-1]) || - (styleLineEnd >= offsets[count-2] && styleLineEnd <= offsets[count-1])) && - style.similarTo(styles[i-1])) { - offsets[count-2] = Math.min(offsets[count-2], styleLineStart); - offsets[count-1] = Math.max(offsets[count-1], styleLineEnd); - } else { - if (styleLineStart > offsets[count - 1]) { - offsets[count] = styleLineStart; - count++; - } - offsets[count] = styleLineEnd; - count++; - } - } - // add offset for last non-colored segment in line, if any - if (lineLength > offsets[count-1]) { - offsets [count] = lineLength; - count++; - } - if (count == offsets.length) { - return offsets; - } - int [] result = new int [count]; - System.arraycopy (offsets, 0, result, 0, count); - return result; -} -/** - * Returns the style range at the given offset. - *

    - * Returns null if a LineStyleListener has been set or if a style is not set - * for the offset. - * Should not be called if a LineStyleListener has been set since the - * listener maintains the styles. - *

    - * - * @param offset the offset to return the style for. - * 0 <= offset < getCharCount() must be true. - * @return a StyleRange with start == offset and length == 1, indicating - * the style at the given offset. null if a LineStyleListener has been set - * or if a style is not set for the given offset. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when the offset is invalid
    • - *
    - */ -public StyleRange getStyleRangeAtOffset(int offset) { - checkWidget(); - if (offset < 0 || offset >= getCharCount()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (!isListening(LineGetStyle)) { - StyleRange[] ranges = renderer.getStyleRanges(offset, 1, true); - if (ranges != null) return ranges[0]; - } - return null; -} -/** - * Returns the styles. - *

    - * Returns an empty array if a LineStyleListener has been set. - * Should not be called if a LineStyleListener has been set since the - * listener maintains the styles. - *

    - * Note: Because a StyleRange includes the start and length, the - * same instance cannot occur multiple times in the array of styles. - * If the same style attributes, such as font and color, occur in - * multiple StyleRanges, getStyleRanges(boolean) - * can be used to get the styles without the ranges. - *

    - * - * @return the styles or an empty array if a LineStyleListener has been set. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see #getStyleRanges(boolean) - */ -public StyleRange[] getStyleRanges() { - checkWidget(); - return getStyleRanges(0, content.getCharCount(), true); -} -/** - * Returns the styles. - *

    - * Returns an empty array if a LineStyleListener has been set. - * Should not be called if a LineStyleListener has been set since the - * listener maintains the styles. - *

    - * Note: When includeRanges is true, the start and length - * fields of each StyleRange will be valid, however the StyleRange - * objects may need to be cloned. When includeRanges is - * false, getRanges(int, int) can be used to get the - * associated ranges. - *

    - * - * @param includeRanges whether the start and length field of the StyleRanges should be set. - * - * @return the styles or an empty array if a LineStyleListener has been set. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.2 - * - * @see #getRanges(int, int) - * @see #setStyleRanges(int[], StyleRange[]) - */ -public StyleRange[] getStyleRanges(boolean includeRanges) { - checkWidget(); - return getStyleRanges(0, content.getCharCount(), includeRanges); -} -/** - * Returns the styles for the given text range. - *

    - * Returns an empty array if a LineStyleListener has been set. - * Should not be called if a LineStyleListener has been set since the - * listener maintains the styles. - *

    - * Note: Because the StyleRange includes the start and length, the - * same instance cannot occur multiple times in the array of styles. - * If the same style attributes, such as font and color, occur in - * multiple StyleRanges, getStyleRanges(int, int, boolean) - * can be used to get the styles without the ranges. - *

    - * @param start the start offset of the style ranges to return - * @param length the number of style ranges to return - * - * @return the styles or an empty array if a LineStyleListener has - * been set. The returned styles will reflect the given range. The first - * returned StyleRange will have a starting offset >= start - * and the last returned StyleRange will have an ending - * offset <= start + length - 1 - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when start and/or end are outside the widget content
    • - *
    - * - * @see #getStyleRanges(int, int, boolean) - * - * @since 3.0 - */ -public StyleRange[] getStyleRanges(int start, int length) { - checkWidget(); - return getStyleRanges(start, length, true); -} -/** - * Returns the styles for the given text range. - *

    - * Returns an empty array if a LineStyleListener has been set. - * Should not be called if a LineStyleListener has been set since the - * listener maintains the styles. - *

    - * Note: When includeRanges is true, the start and length - * fields of each StyleRange will be valid, however the StyleRange - * objects may need to be cloned. When includeRanges is - * false, getRanges(int, int) can be used to get the - * associated ranges. - *

    - * - * @param start the start offset of the style ranges to return - * @param length the number of style ranges to return - * @param includeRanges whether the start and length field of the StyleRanges should be set. - * - * @return the styles or an empty array if a LineStyleListener has - * been set. The returned styles will reflect the given range. The first - * returned StyleRange will have a starting offset >= start - * and the last returned StyleRange will have an ending - * offset <= start + length - 1 - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when start and/or end are outside the widget content
    • - *
    - * - * @since 3.2 - * - * @see #getRanges(int, int) - * @see #setStyleRanges(int[], StyleRange[]) - */ -public StyleRange[] getStyleRanges(int start, int length, boolean includeRanges) { - checkWidget(); - int contentLength = getCharCount(); - int end = start + length; - if (start > end || start < 0 || end > contentLength) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - if (!isListening(LineGetStyle)) { - StyleRange[] ranges = renderer.getStyleRanges(start, length, includeRanges); - if (ranges != null) return ranges; - } - return new StyleRange[0]; -} -/** - * Returns the tab width measured in characters. - * - * @return tab width measured in characters - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getTabs() { - checkWidget(); - return tabLength; -} -/** - * Returns a copy of the widget content. - * - * @return copy of the widget content - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public String getText() { - checkWidget(); - return content.getTextRange(0, getCharCount()); -} -/** - * Returns the widget content between the two offsets. - * - * @param start offset of the first character in the returned String - * @param end offset of the last character in the returned String - * @return widget content starting at start and ending at end - * @see #getTextRange(int,int) - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when start and/or end are outside the widget content
    • - *
    - */ -public String getText(int start, int end) { - checkWidget(); - int contentLength = getCharCount(); - if (start < 0 || start >= contentLength || end < 0 || end >= contentLength || start > end) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - return content.getTextRange(start, end - start + 1); -} -/** - * Returns the smallest bounding rectangle that includes the characters between two offsets. - * - * @param start offset of the first character included in the bounding box - * @param end offset of the last character included in the bounding box - * @return bounding box of the text between start and end - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when start and/or end are outside the widget content
    • - *
    - * @since 3.1 - */ -public Rectangle getTextBounds(int start, int end) { - checkWidget(); - int contentLength = getCharCount(); - if (start < 0 || start >= contentLength || end < 0 || end >= contentLength || start > end) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - int lineStart = content.getLineAtOffset(start); - int lineEnd = content.getLineAtOffset(end); - Rectangle rect; - int y = getLinePixel(lineStart); - int height = 0; - int left = 0x7fffffff, right = 0; - for (int i = lineStart; i <= lineEnd; i++) { - int lineOffset = content.getOffsetAtLine(i); - TextLayout layout = renderer.getTextLayout(i); - int length = layout.getText().length(); - if (length > 0) { - if (i == lineStart) { - if (i == lineEnd) { - rect = layout.getBounds(start - lineOffset, end - lineOffset); - } else { - rect = layout.getBounds(start - lineOffset, length); - } - y += rect.y; - } else if (i == lineEnd) { - rect = layout.getBounds(0, end - lineOffset); - } else { - rect = layout.getBounds(); - } - left = Math.min(left, rect.x); - right = Math.max(right, rect.x + rect.width); - height += rect.height; - } else { - height += renderer.getLineHeight(); - } - renderer.disposeTextLayout(layout); - } - rect = new Rectangle (left, y, right-left, height); - rect.x += leftMargin - horizontalScrollOffset; - return rect; -} -/** - * Returns the widget content starting at start for length characters. - * - * @param start offset of the first character in the returned String - * @param length number of characters to return - * @return widget content starting at start and extending length characters. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when start and/or length are outside the widget content
    • - *
    - */ -public String getTextRange(int start, int length) { - checkWidget(); - int contentLength = getCharCount(); - int end = start + length; - if (start > end || start < 0 || end > contentLength) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - return content.getTextRange(start, length); -} -/** - * Returns the maximum number of characters that the receiver is capable of holding. - * - * @return the text limit - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getTextLimit() { - checkWidget(); - return textLimit; -} -/** - * Gets the top index. - *

    - * The top index is the index of the fully visible line that is currently - * at the top of the widget or the topmost partially visible line if no line is fully visible. - * The top index changes when the widget is scrolled. Indexing is zero based. - *

    - * - * @return the index of the top line - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getTopIndex() { - checkWidget(); - return topIndex; -} -/** - * Returns the top margin. - * - * @return the top margin. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public int getTopMargin() { - checkWidget(); - return topMargin; -} -/** - * Gets the top pixel. - *

    - * The top pixel is the pixel position of the line that is - * currently at the top of the widget. The text widget can be scrolled by pixels - * by dragging the scroll thumb so that a partial line may be displayed at the top - * the widget. The top pixel changes when the widget is scrolled. The top pixel - * does not include the widget trimming. - *

    - * - * @return pixel position of the top line - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getTopPixel() { - checkWidget(); - return getVerticalScrollOffset(); -} -/** - * Returns the vertical scroll increment. - * - * @return vertical scroll increment. - */ -int getVerticalIncrement() { - return renderer.getLineHeight(); -} -int getVerticalScrollOffset() { - if (verticalScrollOffset == -1) { - renderer.calculate(0, topIndex); - int height = 0; - for (int i = 0; i < topIndex; i++) { - height += renderer.getLineHeight(i); - } - height -= topIndexY; - verticalScrollOffset = height; - } - return verticalScrollOffset; -} -int getVisualLineIndex(TextLayout layout, int offsetInLine) { - int lineIndex = layout.getLineIndex(offsetInLine); - int[] offsets = layout.getLineOffsets(); - if (lineIndex != 0 && offsetInLine == offsets[lineIndex]) { - int lineY = layout.getLineBounds(lineIndex).y; - int caretY = getCaret().getLocation().y - topMargin - getLinePixel(getCaretLine()); - if (lineY > caretY) lineIndex--; - } - return lineIndex; -} -int getCaretDirection() { - if (!isBidiCaret()) return SWT.DEFAULT; - if (ime.getCompositionOffset() != -1) return SWT.DEFAULT; - if (!updateCaretDirection && caretDirection != SWT.NULL) return caretDirection; - updateCaretDirection = false; - int caretLine = getCaretLine(); - int lineOffset = content.getOffsetAtLine(caretLine); - String line = content.getLine(caretLine); - int offset = caretOffset - lineOffset; - int lineLength = line.length(); - if (lineLength == 0) return isMirrored() ? SWT.RIGHT : SWT.LEFT; - if (caretAlignment == PREVIOUS_OFFSET_TRAILING && offset > 0) offset--; - if (offset == lineLength && offset > 0) offset--; - while (offset > 0 && Character.isDigit(line.charAt(offset))) offset--; - if (offset == 0 && Character.isDigit(line.charAt(offset))) { - return isMirrored() ? SWT.RIGHT : SWT.LEFT; - } - TextLayout layout = renderer.getTextLayout(caretLine); - int level = layout.getLevel(offset); - renderer.disposeTextLayout(layout); - return ((level & 1) != 0) ? SWT.RIGHT : SWT.LEFT; -} -/* - * Returns the index of the line the caret is on. - */ -int getCaretLine() { - return content.getLineAtOffset(caretOffset); -} -int getWrapWidth () { - if (wordWrap && !isSingleLine()) { - int width = clientAreaWidth - leftMargin - rightMargin - getCaretWidth(); - return width > 0 ? width : 1; - } - return -1; -} -int getWordNext (int offset, int movement) { - int newOffset, lineOffset; - String lineText; - if (offset >= getCharCount()) { - newOffset = offset; - int lineIndex = content.getLineCount() - 1; - lineOffset = content.getOffsetAtLine(lineIndex); - lineText = content.getLine(lineIndex); - } else { - int lineIndex = content.getLineAtOffset(offset); - lineOffset = content.getOffsetAtLine(lineIndex); - lineText = content.getLine(lineIndex); - int lineLength = lineText.length(); - if (offset == lineOffset + lineLength) { - newOffset = content.getOffsetAtLine(lineIndex + 1); - } else { - TextLayout layout = renderer.getTextLayout(lineIndex); - newOffset = lineOffset + layout.getNextOffset(offset - lineOffset, movement); - renderer.disposeTextLayout(layout); - } - } - return sendWordBoundaryEvent(WordNext, movement, offset, newOffset, lineText, lineOffset); -} -int getWordPrevious(int offset, int movement) { - int newOffset, lineOffset; - String lineText; - if (offset <= 0) { - newOffset = 0; - int lineIndex = content.getLineAtOffset(newOffset); - lineOffset = content.getOffsetAtLine(lineIndex); - lineText = content.getLine(lineIndex); - } else { - int lineIndex = content.getLineAtOffset(offset); - lineOffset = content.getOffsetAtLine(lineIndex); - lineText = content.getLine(lineIndex); - if (offset == lineOffset) { - String nextLineText = content.getLine(lineIndex - 1); - int nextLineOffset = content.getOffsetAtLine(lineIndex - 1); - newOffset = nextLineOffset + nextLineText.length(); - } else { - TextLayout layout = renderer.getTextLayout(lineIndex); - newOffset = lineOffset + layout.getPreviousOffset(offset - lineOffset, movement); - renderer.disposeTextLayout(layout); - } - } - return sendWordBoundaryEvent(WordPrevious, movement, offset, newOffset, lineText, lineOffset); -} -/** - * Returns whether the widget wraps lines. - * - * @return true if widget wraps lines, false otherwise - * @since 2.0 - */ -public boolean getWordWrap() { - checkWidget(); - return wordWrap; -} -/** - * Returns the location of the given offset. - *

    - * NOTE: Does not return correct values for true italic fonts (vs. slanted fonts). - *

    - * - * @return location of the character at the given offset in the line. - */ -Point getPointAtOffset(int offset) { - int lineIndex = content.getLineAtOffset(offset); - String line = content.getLine(lineIndex); - int lineOffset = content.getOffsetAtLine(lineIndex); - int offsetInLine = offset - lineOffset; - int lineLength = line.length(); - if (lineIndex < content.getLineCount() - 1) { - int endLineOffset = content.getOffsetAtLine(lineIndex + 1) - 1; - if (lineLength < offsetInLine && offsetInLine <= endLineOffset) { - offsetInLine = lineLength; - } - } - Point point; - TextLayout layout = renderer.getTextLayout(lineIndex); - if (lineLength != 0 && offsetInLine <= lineLength) { - if (offsetInLine == lineLength) { - point = layout.getLocation(offsetInLine - 1, true); - } else { - switch (caretAlignment) { - case OFFSET_LEADING: - point = layout.getLocation(offsetInLine, false); - break; - case PREVIOUS_OFFSET_TRAILING: - default: - if (offsetInLine == 0) { - point = layout.getLocation(offsetInLine, false); - } else { - point = layout.getLocation(offsetInLine - 1, true); - } - break; - } - } - } else { - point = new Point(layout.getIndent(), 0); - } - renderer.disposeTextLayout(layout); - point.x += leftMargin - horizontalScrollOffset; - point.y += getLinePixel(lineIndex); - return point; -} -/** - * Inserts a string. The old selection is replaced with the new text. - * - * @param string the string - * @see #replaceTextRange(int,int,String) - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when string is null
    • - *
    - */ -public void insert(String string) { - checkWidget(); - if (string == null) { - SWT.error(SWT.ERROR_NULL_ARGUMENT); - } - if (blockSelection) { - insertBlockSelectionText(string, false); - } else { - Point sel = getSelectionRange(); - replaceTextRange(sel.x, sel.y, string); - } -} -int insertBlockSelectionText(String text, boolean fillWithSpaces) { - int lineCount = 1; - for (int i = 0; i < text.length(); i++) { - char ch = text.charAt(i); - if (ch == '\n' || ch == '\r') { - lineCount++; - if (ch == '\r' && i + 1 < text.length() && text.charAt(i + 1) == '\n') { - i++; - } - } - } - String[] lines = new String[lineCount]; - int start = 0; - lineCount = 0; - for (int i = 0; i < text.length(); i++) { - char ch = text.charAt(i); - if (ch == '\n' || ch == '\r') { - lines[lineCount++] = text.substring(start, i); - if (ch == '\r' && i + 1 < text.length() && text.charAt(i + 1) == '\n') { - i++; - } - start = i + 1; - } - } - lines[lineCount++] = text.substring(start); - if (fillWithSpaces) { - int maxLength = 0; - for (int i = 0; i < lines.length; i++) { - int length = lines[i].length(); - maxLength = Math.max(maxLength, length); - } - for (int i = 0; i < lines.length; i++) { - String line = lines[i]; - int length = line.length(); - if (length < maxLength) { - int numSpaces = maxLength - length;; - StringBuffer buffer = new StringBuffer(length + numSpaces); - buffer.append(line); - for (int j = 0; j < numSpaces; j++) buffer.append(' '); - lines[i] = buffer.toString(); - } - } - } - int firstLine, lastLine, left, right; - if (blockXLocation != -1) { - Rectangle rect = getBlockSelectonPosition(); - firstLine = rect.y; - lastLine = rect.height; - left = rect.x; - right = rect.width; - } else { - firstLine = lastLine = getCaretLine(); - left = right = getPointAtOffset(caretOffset).x; - } - start = caretOffset; - int caretLine = getCaretLine(); - int index = 0, lineIndex = firstLine; - while (lineIndex <= lastLine) { - String string = index < lineCount ? lines[index++] : ""; - int lineStart = sendTextEvent(left, right, lineIndex, string, fillWithSpaces); - if (lineIndex == caretLine) start = lineStart; - lineIndex++; - } - while (index < lineCount) { - int lineStart = sendTextEvent(left, left, lineIndex, lines[index++], fillWithSpaces); - if (lineIndex == caretLine) start = lineStart; - lineIndex++; - } - return start; -} -void insertBlockSelectionText(char key, int action) { - if (key == SWT.CR || key == SWT.LF) return; - Rectangle rect = getBlockSelectonPosition(); - int firstLine = rect.y; - int lastLine = rect.height; - int left = rect.x; - int right = rect.width; - int[] trailing = new int[1]; - int offset = 0, delta = 0; - String text = key != 0 ? new String(new char[] {key}) : ""; - int length = text.length(); - for (int lineIndex = firstLine; lineIndex <= lastLine; lineIndex++) { - String line = content.getLine(lineIndex); - int lineOffset = content.getOffsetAtLine(lineIndex); - int lineEndOffset = lineOffset + line.length(); - int linePixel = getLinePixel(lineIndex); - int start = getOffsetAtPoint(left, linePixel, trailing, true); - boolean outOfLine = start == -1; - if (outOfLine) { - start = left < leftMargin ? lineOffset : lineEndOffset; - } else { - start += trailing[0]; - } - int end = getOffsetAtPoint(right, linePixel, trailing, true); - if (end == -1) { - end = right < leftMargin ? lineOffset : lineEndOffset; - } else { - end += trailing[0]; - } - if (start > end) { - int temp = start; - start = end; - end = temp; - } - if (start == end && !outOfLine) { - switch (action) { - case ST.DELETE_PREVIOUS: - if (start > lineOffset) start = getClusterPrevious(start, lineIndex); - break; - case ST.DELETE_NEXT: - if (end < lineEndOffset) end = getClusterNext(end, lineIndex); - break; - } - } - if (outOfLine) { - if (line.length() >= delta) { - delta = line.length(); - offset = lineEndOffset + length; - } - } else { - offset = start + length; - delta = content.getCharCount(); - } - Event event = new Event(); - event.text = text; - event.start = start; - event.end = end; - sendKeyEvent(event); - } - int x = getPointAtOffset(offset).x; - int verticalScrollOffset = getVerticalScrollOffset(); - setBlockSelectionLocation(x, blockYAnchor - verticalScrollOffset, x, blockYLocation - verticalScrollOffset, false); -} -/** - * Creates content change listeners and set the default content model. - */ -void installDefaultContent() { - textChangeListener = new TextChangeListener() { - public void textChanging(TextChangingEvent event) { - handleTextChanging(event); - } - public void textChanged(TextChangedEvent event) { - handleTextChanged(event); - } - public void textSet(TextChangedEvent event) { - handleTextSet(event); - } - }; - content = new DefaultContent(); - content.addTextChangeListener(textChangeListener); -} -/** - * Adds event listeners - */ -void installListeners() { - ScrollBar verticalBar = getVerticalBar(); - ScrollBar horizontalBar = getHorizontalBar(); - - listener = new Listener() { - public void handleEvent(Event event) { - switch (event.type) { - case SWT.Dispose: handleDispose(event); break; - case SWT.KeyDown: handleKeyDown(event); break; - case SWT.KeyUp: handleKeyUp(event); break; - case SWT.MouseDown: handleMouseDown(event); break; - case SWT.MouseUp: handleMouseUp(event); break; - case SWT.MouseMove: handleMouseMove(event); break; - case SWT.Paint: handlePaint(event); break; - case SWT.Resize: handleResize(event); break; - case SWT.Traverse: handleTraverse(event); break; - } - } - }; - addListener(SWT.Dispose, listener); - addListener(SWT.KeyDown, listener); - addListener(SWT.KeyUp, listener); - addListener(SWT.MouseDown, listener); - addListener(SWT.MouseUp, listener); - addListener(SWT.MouseMove, listener); - addListener(SWT.Paint, listener); - addListener(SWT.Resize, listener); - addListener(SWT.Traverse, listener); - ime.addListener(SWT.ImeComposition, new Listener() { - public void handleEvent(Event event) { - switch (event.detail) { - case SWT.COMPOSITION_SELECTION: handleCompositionSelection(event); break; - case SWT.COMPOSITION_CHANGED: handleCompositionChanged(event); break; - case SWT.COMPOSITION_OFFSET: handleCompositionOffset(event); break; - } - } - }); - if (verticalBar != null) { - verticalBar.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - handleVerticalScroll(event); - } - }); - } - if (horizontalBar != null) { - horizontalBar.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - handleHorizontalScroll(event); - } - }); - } -} -void internalRedrawRange(int start, int length) { - if (length <= 0) return; - int end = start + length; - int startLine = content.getLineAtOffset(start); - int endLine = content.getLineAtOffset(end); - int partialBottomIndex = getPartialBottomIndex(); - int partialTopIndex = getPartialTopIndex(); - if (startLine > partialBottomIndex || endLine < partialTopIndex) { - return; - } - if (partialTopIndex > startLine) { - startLine = partialTopIndex; - start = 0; - } else { - start -= content.getOffsetAtLine(startLine); - } - if (partialBottomIndex < endLine) { - endLine = partialBottomIndex + 1; - end = 0; - } else { - end -= content.getOffsetAtLine(endLine); - } - - TextLayout layout = renderer.getTextLayout(startLine); - int lineX = leftMargin - horizontalScrollOffset, startLineY = getLinePixel(startLine); - int[] offsets = layout.getLineOffsets(); - int startIndex = layout.getLineIndex(Math.min(start, layout.getText().length())); - - /* Redraw end of line before start line if wrapped and start offset is first char */ - if (wordWrap && startIndex > 0 && offsets[startIndex] == start) { - Rectangle rect = layout.getLineBounds(startIndex - 1); - rect.x = rect.width; - rect.width = clientAreaWidth - rightMargin - rect.x; - rect.x += lineX; - rect.y += startLineY; - super.redraw(rect.x, rect.y, rect.width, rect.height, false); - } - - if (startLine == endLine) { - int endIndex = layout.getLineIndex(Math.min(end, layout.getText().length())); - if (startIndex == endIndex) { - /* Redraw rect between start and end offset if start and end offsets are in same wrapped line */ - Rectangle rect = layout.getBounds(start, end - 1); - rect.x += lineX; - rect.y += startLineY; - super.redraw(rect.x, rect.y, rect.width, rect.height, false); - renderer.disposeTextLayout(layout); - return; - } - } - - /* Redraw start line from the start offset to the end of client area */ - Rectangle startRect = layout.getBounds(start, offsets[startIndex + 1] - 1); - if (startRect.height == 0) { - Rectangle bounds = layout.getLineBounds(startIndex); - startRect.x = bounds.width; - startRect.y = bounds.y; - startRect.height = bounds.height; - } - startRect.x += lineX; - startRect.y += startLineY; - startRect.width = clientAreaWidth - rightMargin - startRect.x; - super.redraw(startRect.x, startRect.y, startRect.width, startRect.height, false); - - /* Redraw end line from the beginning of the line to the end offset */ - if (startLine != endLine) { - renderer.disposeTextLayout(layout); - layout = renderer.getTextLayout(endLine); - offsets = layout.getLineOffsets(); - } - int endIndex = layout.getLineIndex(Math.min(end, layout.getText().length())); - Rectangle endRect = layout.getBounds(offsets[endIndex], end - 1); - if (endRect.height == 0) { - Rectangle bounds = layout.getLineBounds(endIndex); - endRect.y = bounds.y; - endRect.height = bounds.height; - } - endRect.x += lineX; - endRect.y += getLinePixel(endLine); - super.redraw(endRect.x, endRect.y, endRect.width, endRect.height, false); - renderer.disposeTextLayout(layout); - - /* Redraw all lines in between start and end line */ - int y = startRect.y + startRect.height; - if (endRect.y > y) { - super.redraw(leftMargin, y, clientAreaWidth - rightMargin - leftMargin, endRect.y - y, false); - } -} -void handleCompositionOffset (Event event) { - int[] trailing = new int [1]; - event.index = getOffsetAtPoint(event.x, event.y, trailing, true); - event.count = trailing[0]; -} -void handleCompositionSelection (Event event) { - event.start = selection.x; - event.end = selection.y; - event.text = getSelectionText(); -} -void handleCompositionChanged(Event event) { - String text = event.text; - int start = event.start; - int end = event.end; - int length = text.length(); - if (length == ime.getCommitCount()) { - content.replaceTextRange(start, end - start, ""); - setCaretOffset(ime.getCompositionOffset(), SWT.DEFAULT); - caretWidth = 0; - caretDirection = SWT.NULL; - } else { - content.replaceTextRange(start, end - start, text); - setCaretOffset(ime.getCaretOffset(), SWT.DEFAULT); - if (ime.getWideCaret()) { - start = ime.getCompositionOffset(); - int lineIndex = getCaretLine(); - int lineOffset = content.getOffsetAtLine(lineIndex); - TextLayout layout = renderer.getTextLayout(lineIndex); - caretWidth = layout.getBounds(start - lineOffset, start + length - 1 - lineOffset).width; - renderer.disposeTextLayout(layout); - } - } - showCaret(); -} -/** - * Frees resources. - */ -void handleDispose(Event event) { - removeListener(SWT.Dispose, listener); - notifyListeners(SWT.Dispose, event); - event.type = SWT.None; - - clipboard.dispose(); - if (renderer != null) { - renderer.dispose(); - renderer = null; - } - if (content != null) { - content.removeTextChangeListener(textChangeListener); - content = null; - } - if (defaultCaret != null) { - defaultCaret.dispose(); - defaultCaret = null; - } - if (leftCaretBitmap != null) { - leftCaretBitmap.dispose(); - leftCaretBitmap = null; - } - if (rightCaretBitmap != null) { - rightCaretBitmap.dispose(); - rightCaretBitmap = null; - } - if (isBidiCaret()) { - BidiUtil.removeLanguageListener(this); - } - selectionBackground = null; - selectionForeground = null; - marginColor = null; - textChangeListener = null; - selection = null; - doubleClickSelection = null; - keyActionMap = null; - background = null; - foreground = null; - clipboard = null; -} -/** - * Scrolls the widget horizontally. - */ -void handleHorizontalScroll(Event event) { - int scrollPixel = getHorizontalBar().getSelection() - horizontalScrollOffset; - scrollHorizontal(scrollPixel, false); -} -/** - * If an action has been registered for the key stroke execute the action. - * Otherwise, if a character has been entered treat it as new content. - * - * @param event keyboard event - */ -void handleKey(Event event) { - int action; - caretAlignment = PREVIOUS_OFFSET_TRAILING; - if (event.keyCode != 0) { - // special key pressed (e.g., F1) - action = getKeyBinding(event.keyCode | event.stateMask); - } else { - // character key pressed - action = getKeyBinding(event.character | event.stateMask); - if (action == SWT.NULL) { - // see if we have a control character - if ((event.stateMask & SWT.CTRL) != 0 && event.character <= 31) { - // get the character from the CTRL+char sequence, the control - // key subtracts 64 from the value of the key that it modifies - int c = event.character + 64; - action = getKeyBinding(c | event.stateMask); - } - } - } - if (action == SWT.NULL) { - boolean ignore = false; - - if (IS_MAC) { - // Ignore accelerator key combinations (we do not want to - // insert a character in the text in this instance). Do not - // ignore COMMAND+ALT combinations since that key sequence - // produces characters on the mac. - ignore = (event.stateMask ^ SWT.COMMAND) == 0 || - (event.stateMask ^ (SWT.COMMAND | SWT.SHIFT)) == 0; - } else if (IS_MOTIF) { - // Ignore accelerator key combinations (we do not want to - // insert a character in the text in this instance). Do not - // ignore ALT combinations since this key sequence - // produces characters on motif. - ignore = (event.stateMask ^ SWT.CTRL) == 0 || - (event.stateMask ^ (SWT.CTRL | SWT.SHIFT)) == 0; - } else { - // Ignore accelerator key combinations (we do not want to - // insert a character in the text in this instance). Don't - // ignore CTRL+ALT combinations since that is the Alt Gr - // key on some keyboards. See bug 20953. - ignore = (event.stateMask ^ SWT.ALT) == 0 || - (event.stateMask ^ SWT.CTRL) == 0 || - (event.stateMask ^ (SWT.ALT | SWT.SHIFT)) == 0 || - (event.stateMask ^ (SWT.CTRL | SWT.SHIFT)) == 0; - } - // -ignore anything below SPACE except for line delimiter keys and tab. - // -ignore DEL - if (!ignore && event.character > 31 && event.character != SWT.DEL || - event.character == SWT.CR || event.character == SWT.LF || - event.character == TAB) { - doContent(event.character); - update(); - } - } else { - invokeAction(action); - } -} -/** - * If a VerifyKey listener exists, verify that the key that was entered - * should be processed. - * - * @param event keyboard event - */ -void handleKeyDown(Event event) { - if (clipboardSelection == null) { - clipboardSelection = new Point(selection.x, selection.y); - } - - Event verifyEvent = new Event(); - verifyEvent.character = event.character; - verifyEvent.keyCode = event.keyCode; - verifyEvent.stateMask = event.stateMask; - verifyEvent.doit = true; - notifyListeners(VerifyKey, verifyEvent); - if (verifyEvent.doit) { - handleKey(event); - } -} -/** - * Update the Selection Clipboard. - * - * @param event keyboard event - */ -void handleKeyUp(Event event) { - if (clipboardSelection != null) { - if (clipboardSelection.x != selection.x || clipboardSelection.y != selection.y) { - copySelection(DND.SELECTION_CLIPBOARD); - } - } - clipboardSelection = null; -} -/** - * Updates the caret location and selection if mouse button 1 has been - * pressed. - */ -void handleMouseDown(Event event) { - //force focus (object support) - forceFocus(); - - //drag detect - if (dragDetect && checkDragDetect(event)) return; - - //paste clipboard selection - if (event.button == 2) { - String text = (String)getClipboardContent(DND.SELECTION_CLIPBOARD); - if (text != null && text.length() > 0) { - // position cursor - doMouseLocationChange(event.x, event.y, false); - // insert text - Event e = new Event(); - e.start = selection.x; - e.end = selection.y; - e.text = getModelDelimitedText(text); - sendKeyEvent(e); - } - } - - //set selection - if ((event.button != 1) || (IS_MAC && (event.stateMask & SWT.MOD4) != 0)) { - return; - } - clickCount = event.count; - if (clickCount == 1) { - boolean select = (event.stateMask & SWT.MOD2) != 0; - doMouseLocationChange(event.x, event.y, select); - } else { - if (doubleClickEnabled) { - boolean wordSelect = (clickCount & 1) == 0; - int offset = getOffsetAtPoint(event.x, event.y, null); - int lineIndex = content.getLineAtOffset(offset); - int lineOffset = content.getOffsetAtLine(lineIndex); - if (wordSelect) { - int min = blockSelection ? lineOffset : 0; - int max = blockSelection ? lineOffset + content.getLine(lineIndex).length() : content.getCharCount(); - int start = Math.max(min, getWordPrevious(offset, SWT.MOVEMENT_WORD_START)); - int end = Math.min(max, getWordNext(start, SWT.MOVEMENT_WORD_END)); - setSelection(start, end - start, false, true); - sendSelectionEvent(); - } else { - if (blockSelection) { - setBlockSelectionLocation(leftMargin, event.y, clientAreaWidth - rightMargin, event.y, true); - } else { - int lineEnd = content.getCharCount(); - if (lineIndex + 1 < content.getLineCount()) { - lineEnd = content.getOffsetAtLine(lineIndex + 1); - } - setSelection(lineOffset, lineEnd - lineOffset, false, false); - sendSelectionEvent(); - } - } - doubleClickSelection = new Point(selection.x, selection.y); - showCaret(); - } - } -} -/** - * Updates the caret location and selection if mouse button 1 is pressed - * during the mouse move. - */ -void handleMouseMove(Event event) { - if (clickCount > 0) { - update(); - doAutoScroll(event); - doMouseLocationChange(event.x, event.y, true); - } - if (renderer.hasLinks) { - doMouseLinkCursor(event.x, event.y); - } -} -/** - * Autoscrolling ends when the mouse button is released. - */ -void handleMouseUp(Event event) { - clickCount = 0; - endAutoScroll(); - if (event.button == 1) { - copySelection(DND.SELECTION_CLIPBOARD); - } -} -/** - * Renders the invalidated area specified in the paint event. - * - * @param event paint event - */ -void handlePaint(Event event) { - if (event.width == 0 || event.height == 0) return; - if (clientAreaWidth == 0 || clientAreaHeight == 0) return; - - int startLine = getLineIndex(event.y); - int y = getLinePixel(startLine); - int endY = event.y + event.height; - GC gc = event.gc; - Color background = getBackground(); - Color foreground = getForeground(); - if (endY > 0) { - int lineCount = isSingleLine() ? 1 : content.getLineCount(); - int x = leftMargin - horizontalScrollOffset; - for (int i = startLine; y < endY && i < lineCount; i++) { - y += renderer.drawLine(i, x, y, gc, background, foreground); - } - if (y < endY) { - gc.setBackground(background); - drawBackground(gc, 0, y, clientAreaWidth, endY - y); - } - } - if (blockSelection && blockXLocation != -1) { - gc.setBackground(getSelectionBackground()); - Rectangle rect = getBlockSelectionRectangle(); - gc.drawRectangle(rect.x, rect.y, Math.max(1, rect.width - 1), Math.max(1, rect.height - 1)); - gc.setAdvanced(true); - if (gc.getAdvanced()) { - gc.setAlpha(100); - gc.fillRectangle(rect); - gc.setAdvanced(false); - } - } - - // fill the margin background - gc.setBackground(marginColor != null ? marginColor : background); - if (topMargin > 0) { - drawBackground(gc, 0, 0, clientAreaWidth, topMargin); - } - if (bottomMargin > 0) { - drawBackground(gc, 0, clientAreaHeight - bottomMargin, clientAreaWidth, bottomMargin); - } - if (leftMargin - alignmentMargin > 0) { - drawBackground(gc, 0, 0, leftMargin - alignmentMargin, clientAreaHeight); - } - if (rightMargin > 0) { - drawBackground(gc, clientAreaWidth - rightMargin, 0, rightMargin, clientAreaHeight); - } -} -/** - * Recalculates the scroll bars. Rewraps all lines when in word - * wrap mode. - * - * @param event resize event - */ -void handleResize(Event event) { - int oldHeight = clientAreaHeight; - int oldWidth = clientAreaWidth; - Rectangle clientArea = getClientArea(); - clientAreaHeight = clientArea.height; - clientAreaWidth = clientArea.width; - /* Redraw the old or new right/bottom margin if needed */ - if (oldWidth != clientAreaWidth) { - if (rightMargin > 0) { - int x = (oldWidth < clientAreaWidth ? oldWidth : clientAreaWidth) - rightMargin; - super.redraw(x, 0, rightMargin, oldHeight, false); - } - } - if (oldHeight != clientAreaHeight) { - if (bottomMargin > 0) { - int y = (oldHeight < clientAreaHeight ? oldHeight : clientAreaHeight) - bottomMargin; - super.redraw(0, y, oldWidth, bottomMargin, false); - } - } - if (wordWrap) { - if (oldWidth != clientAreaWidth) { - renderer.reset(0, content.getLineCount()); - verticalScrollOffset = -1; - renderer.calculateIdle(); - super.redraw(); - } - if (oldHeight != clientAreaHeight) { - if (oldHeight == 0) topIndexY = 0; - setScrollBars(true); - } - setCaretLocation(); - } else { - renderer.calculateClientArea(); - setScrollBars(true); - claimRightFreeSpace(); - // StyledText allows any value for horizontalScrollOffset when clientArea is zero - // in setHorizontalPixel() and setHorisontalOffset(). Fixes bug 168429. - if (clientAreaWidth != 0) { - ScrollBar horizontalBar = getHorizontalBar(); - if (horizontalBar != null && horizontalBar.getVisible()) { - if (horizontalScrollOffset != horizontalBar.getSelection()) { - horizontalBar.setSelection(horizontalScrollOffset); - horizontalScrollOffset = horizontalBar.getSelection(); - } - } - } - } - updateCaretVisibility(); - claimBottomFreeSpace(); - setAlignment(); - //TODO FIX TOP INDEX DURING RESIZE -// if (oldHeight != clientAreaHeight || wordWrap) { -// calculateTopIndex(0); -// } -} -/** - * Updates the caret position and selection and the scroll bars to reflect - * the content change. - */ -void handleTextChanged(TextChangedEvent event) { - int offset = ime.getCompositionOffset(); - if (offset != -1 && lastTextChangeStart < offset) { - ime.setCompositionOffset(offset + lastTextChangeNewCharCount - lastTextChangeReplaceCharCount); - } - int firstLine = content.getLineAtOffset(lastTextChangeStart); - resetCache(firstLine, 0); - if (!isFixedLineHeight() && topIndex > firstLine) { - topIndex = firstLine; - topIndexY = 0; - super.redraw(); - } else { - int lastLine = firstLine + lastTextChangeNewLineCount; - int firstLineTop = getLinePixel(firstLine); - int newLastLineBottom = getLinePixel(lastLine + 1); - if (lastLineBottom != newLastLineBottom) { - super.redraw(); - } else { - super.redraw(0, firstLineTop, clientAreaWidth, newLastLineBottom - firstLineTop, false); - redrawLinesBullet(renderer.redrawLines); - } - } - renderer.redrawLines = null; - // update selection/caret location after styles have been changed. - // otherwise any text measuring could be incorrect - // - // also, this needs to be done after all scrolling. Otherwise, - // selection redraw would be flushed during scroll which is wrong. - // in some cases new text would be drawn in scroll source area even - // though the intent is to scroll it. - if (!(blockSelection && blockXLocation != -1)) { - updateSelection(lastTextChangeStart, lastTextChangeReplaceCharCount, lastTextChangeNewCharCount); - } - if (lastTextChangeReplaceLineCount > 0 || wordWrap) { - claimBottomFreeSpace(); - } - if (lastTextChangeReplaceCharCount > 0) { - claimRightFreeSpace(); - } - - sendAccessibleTextChanged(lastTextChangeStart, lastTextChangeNewCharCount, lastTextChangeReplaceCharCount); - lastCharCount += lastTextChangeNewCharCount; - lastCharCount -= lastTextChangeReplaceCharCount; - setAlignment(); -} -/** - * Updates the screen to reflect a pending content change. - * - * @param event .start the start offset of the change - * @param event .newText text that is going to be inserted or empty String - * if no text will be inserted - * @param event .replaceCharCount length of text that is going to be replaced - * @param event .newCharCount length of text that is going to be inserted - * @param event .replaceLineCount number of lines that are going to be replaced - * @param event .newLineCount number of new lines that are going to be inserted - */ -void handleTextChanging(TextChangingEvent event) { - if (event.replaceCharCount < 0) { - event.start += event.replaceCharCount; - event.replaceCharCount *= -1; - } - lastTextChangeStart = event.start; - lastTextChangeNewLineCount = event.newLineCount; - lastTextChangeNewCharCount = event.newCharCount; - lastTextChangeReplaceLineCount = event.replaceLineCount; - lastTextChangeReplaceCharCount = event.replaceCharCount; - int lineIndex = content.getLineAtOffset(event.start); - int srcY = getLinePixel(lineIndex + event.replaceLineCount + 1); - int destY = getLinePixel(lineIndex + 1) + event.newLineCount * renderer.getLineHeight(); - lastLineBottom = destY; - if (srcY < 0 && destY < 0) { - lastLineBottom += srcY - destY; - verticalScrollOffset += destY - srcY; - calculateTopIndex(destY - srcY); - setScrollBars(true); - } else { - scrollText(srcY, destY); - } - - renderer.textChanging(event); - - // Update the caret offset if it is greater than the length of the content. - // This is necessary since style range API may be called between the - // handleTextChanging and handleTextChanged events and this API sets the - // caretOffset. - int newEndOfText = content.getCharCount() - event.replaceCharCount + event.newCharCount; - if (caretOffset > newEndOfText) setCaretOffset(newEndOfText, SWT.DEFAULT); -} -/** - * Called when the widget content is set programmatically, overwriting - * the old content. Resets the caret position, selection and scroll offsets. - * Recalculates the content width and scroll bars. Redraws the widget. - * - * @param event text change event. - */ -void handleTextSet(TextChangedEvent event) { - reset(); - int newCharCount = getCharCount(); - sendAccessibleTextChanged(0, newCharCount, lastCharCount); - lastCharCount = newCharCount; - setAlignment(); -} -/** - * Called when a traversal key is pressed. - * Allow tab next traversal to occur when the widget is in single - * line mode or in multi line and non-editable mode . - * When in editable multi line mode we want to prevent the tab - * traversal and receive the tab key event instead. - * - * @param event the event - */ -void handleTraverse(Event event) { - switch (event.detail) { - case SWT.TRAVERSE_ESCAPE: - case SWT.TRAVERSE_PAGE_NEXT: - case SWT.TRAVERSE_PAGE_PREVIOUS: - event.doit = true; - break; - case SWT.TRAVERSE_RETURN: - case SWT.TRAVERSE_TAB_NEXT: - case SWT.TRAVERSE_TAB_PREVIOUS: - if ((getStyle() & SWT.SINGLE) != 0) { - event.doit = true; - } else { - if (!editable || (event.stateMask & SWT.MODIFIER_MASK) != 0) { - event.doit = true; - } - } - break; - } -} -/** - * Scrolls the widget vertically. - */ -void handleVerticalScroll(Event event) { - int scrollPixel = getVerticalBar().getSelection() - getVerticalScrollOffset(); - scrollVertical(scrollPixel, false); -} -/** - * Add accessibility support for the widget. - */ -void initializeAccessible() { - final Accessible accessible = getAccessible(); - accessible.addAccessibleListener(new AccessibleAdapter() { - public void getName (AccessibleEvent e) { - String name = null; - Label label = getAssociatedLabel (); - if (label != null) { - name = stripMnemonic (label.getText()); - } - e.result = name; - } - public void getHelp(AccessibleEvent e) { - e.result = getToolTipText(); - } - public void getKeyboardShortcut(AccessibleEvent e) { - String shortcut = null; - Label label = getAssociatedLabel (); - if (label != null) { - String text = label.getText (); - if (text != null) { - char mnemonic = _findMnemonic (text); - if (mnemonic != '\0') { - shortcut = "Alt+"+mnemonic; //$NON-NLS-1$ - } - } - } - e.result = shortcut; - } - }); - accessible.addAccessibleTextListener(new AccessibleTextAdapter() { - public void getCaretOffset(AccessibleTextEvent e) { - e.offset = StyledText.this.getCaretOffset(); - } - public void getSelectionRange(AccessibleTextEvent e) { - Point selection = StyledText.this.getSelectionRange(); - e.offset = selection.x; - e.length = selection.y; - } - }); - accessible.addAccessibleControlListener(new AccessibleControlAdapter() { - public void getRole(AccessibleControlEvent e) { - e.detail = ACC.ROLE_TEXT; - } - public void getState(AccessibleControlEvent e) { - int state = 0; - if (isEnabled()) state |= ACC.STATE_FOCUSABLE; - if (isFocusControl()) state |= ACC.STATE_FOCUSED; - if (!isVisible()) state |= ACC.STATE_INVISIBLE; - if (!getEditable()) state |= ACC.STATE_READONLY; - e.detail = state; - } - public void getValue(AccessibleControlEvent e) { - e.result = StyledText.this.getText(); - } - }); - addListener(SWT.FocusIn, new Listener() { - public void handleEvent(Event event) { - accessible.setFocus(ACC.CHILDID_SELF); - } - }); -} -/* - * Return the Label immediately preceding the receiver in the z-order, - * or null if none. - */ -Label getAssociatedLabel () { - Control[] siblings = getParent ().getChildren (); - for (int i = 0; i < siblings.length; i++) { - if (siblings [i] == StyledText.this) { - if (i > 0 && siblings [i-1] instanceof Label) { - return (Label) siblings [i-1]; - } - } - } - return null; -} -String stripMnemonic (String string) { - int index = 0; - int length = string.length (); - do { - while ((index < length) && (string.charAt (index) != '&')) index++; - if (++index >= length) return string; - if (string.charAt (index) != '&') { - return string.substring(0, index-1) + string.substring(index, length); - } - index++; - } while (index < length); - return string; -} -/* - * Return the lowercase of the first non-'&' character following - * an '&' character in the given string. If there are no '&' - * characters in the given string, return '\0'. - */ -char _findMnemonic (String string) { - if (string == null) return '\0'; - int index = 0; - int length = string.length (); - do { - while (index < length && string.charAt (index) != '&') index++; - if (++index >= length) return '\0'; - if (string.charAt (index) != '&') return Character.toLowerCase (string.charAt (index)); - index++; - } while (index < length); - return '\0'; -} -/** - * Executes the action. - * - * @param action one of the actions defined in ST.java - */ -public void invokeAction(int action) { - checkWidget(); - if (blockSelection && invokeBlockAction(action)) return; - updateCaretDirection = true; - switch (action) { - // Navigation - case ST.LINE_UP: - doLineUp(false); - clearSelection(true); - break; - case ST.LINE_DOWN: - doLineDown(false); - clearSelection(true); - break; - case ST.LINE_START: - doLineStart(); - clearSelection(true); - break; - case ST.LINE_END: - doLineEnd(); - clearSelection(true); - break; - case ST.COLUMN_PREVIOUS: - doCursorPrevious(); - clearSelection(true); - break; - case ST.COLUMN_NEXT: - doCursorNext(); - clearSelection(true); - break; - case ST.PAGE_UP: - doPageUp(false, -1); - clearSelection(true); - break; - case ST.PAGE_DOWN: - doPageDown(false, -1); - clearSelection(true); - break; - case ST.WORD_PREVIOUS: - doWordPrevious(); - clearSelection(true); - break; - case ST.WORD_NEXT: - doWordNext(); - clearSelection(true); - break; - case ST.TEXT_START: - doContentStart(); - clearSelection(true); - break; - case ST.TEXT_END: - doContentEnd(); - clearSelection(true); - break; - case ST.WINDOW_START: - doPageStart(); - clearSelection(true); - break; - case ST.WINDOW_END: - doPageEnd(); - clearSelection(true); - break; - // Selection - case ST.SELECT_LINE_UP: - doSelectionLineUp(); - break; - case ST.SELECT_ALL: - selectAll(); - break; - case ST.SELECT_LINE_DOWN: - doSelectionLineDown(); - break; - case ST.SELECT_LINE_START: - doLineStart(); - doSelection(ST.COLUMN_PREVIOUS); - break; - case ST.SELECT_LINE_END: - doLineEnd(); - doSelection(ST.COLUMN_NEXT); - break; - case ST.SELECT_COLUMN_PREVIOUS: - doSelectionCursorPrevious(); - doSelection(ST.COLUMN_PREVIOUS); - break; - case ST.SELECT_COLUMN_NEXT: - doSelectionCursorNext(); - doSelection(ST.COLUMN_NEXT); - break; - case ST.SELECT_PAGE_UP: - doSelectionPageUp(-1); - break; - case ST.SELECT_PAGE_DOWN: - doSelectionPageDown(-1); - break; - case ST.SELECT_WORD_PREVIOUS: - doSelectionWordPrevious(); - doSelection(ST.COLUMN_PREVIOUS); - break; - case ST.SELECT_WORD_NEXT: - doSelectionWordNext(); - doSelection(ST.COLUMN_NEXT); - break; - case ST.SELECT_TEXT_START: - doContentStart(); - doSelection(ST.COLUMN_PREVIOUS); - break; - case ST.SELECT_TEXT_END: - doContentEnd(); - doSelection(ST.COLUMN_NEXT); - break; - case ST.SELECT_WINDOW_START: - doPageStart(); - doSelection(ST.COLUMN_PREVIOUS); - break; - case ST.SELECT_WINDOW_END: - doPageEnd(); - doSelection(ST.COLUMN_NEXT); - break; - // Modification - case ST.CUT: - cut(); - break; - case ST.COPY: - copy(); - break; - case ST.PASTE: - paste(); - break; - case ST.DELETE_PREVIOUS: - doBackspace(); - break; - case ST.DELETE_NEXT: - doDelete(); - break; - case ST.DELETE_WORD_PREVIOUS: - doDeleteWordPrevious(); - break; - case ST.DELETE_WORD_NEXT: - doDeleteWordNext(); - break; - // Miscellaneous - case ST.TOGGLE_OVERWRITE: - overwrite = !overwrite; // toggle insert/overwrite mode - break; - case ST.TOGGLE_BLOCKSELECTION: - setBlockSelection(!blockSelection); - break; - } -} -/** -* Returns true if an action should not be performed when block -* selection in active -*/ -boolean invokeBlockAction(int action) { - switch (action) { - // Navigation - case ST.LINE_UP: - case ST.LINE_DOWN: - case ST.LINE_START: - case ST.LINE_END: - case ST.COLUMN_PREVIOUS: - case ST.COLUMN_NEXT: - case ST.PAGE_UP: - case ST.PAGE_DOWN: - case ST.WORD_PREVIOUS: - case ST.WORD_NEXT: - case ST.TEXT_START: - case ST.TEXT_END: - case ST.WINDOW_START: - case ST.WINDOW_END: - clearBlockSelection(false, false); - return false; - // Selection - case ST.SELECT_LINE_UP: - doBlockLineVertical(true); - return true; - case ST.SELECT_LINE_DOWN: - doBlockLineVertical(false); - return true; - case ST.SELECT_LINE_START: - doBlockLineHorizontal(false); - return true; - case ST.SELECT_LINE_END: - doBlockLineHorizontal(true); - return false; - case ST.SELECT_COLUMN_PREVIOUS: - doBlockColumn(false); - return true; - case ST.SELECT_COLUMN_NEXT: - doBlockColumn(true); - return true; - case ST.SELECT_WORD_PREVIOUS: - doBlockWord(false); - return true; - case ST.SELECT_WORD_NEXT: - doBlockWord(true); - return true; - case ST.SELECT_ALL: - return false; - case ST.SELECT_PAGE_UP: - case ST.SELECT_PAGE_DOWN: - case ST.SELECT_TEXT_START: - case ST.SELECT_TEXT_END: - case ST.SELECT_WINDOW_START: - case ST.SELECT_WINDOW_END: - //blocked actions - return true; - // Modification - case ST.CUT: - case ST.COPY: - case ST.PASTE: - return false; - case ST.DELETE_PREVIOUS: - case ST.DELETE_NEXT: - if (blockXLocation != -1) { - insertBlockSelectionText((char)0, action); - return true; - } - return false; - case ST.DELETE_WORD_PREVIOUS: - case ST.DELETE_WORD_NEXT: - //blocked actions - return blockXLocation != -1; - } - return false; -} -/** - * Temporary until SWT provides this - */ -boolean isBidi() { - return IS_GTK || IS_MAC || BidiUtil.isBidiPlatform() || isMirrored; -} -boolean isBidiCaret() { - return BidiUtil.isBidiPlatform(); -} -boolean isFixedLineHeight() { - return fixedLineHeight; -} -/** - * Returns whether the given offset is inside a multi byte line delimiter. - * Example: - * "Line1\r\n" isLineDelimiter(5) == false but isLineDelimiter(6) == true - * - * @return true if the given offset is inside a multi byte line delimiter. - * false if the given offset is before or after a line delimiter. - */ -boolean isLineDelimiter(int offset) { - int line = content.getLineAtOffset(offset); - int lineOffset = content.getOffsetAtLine(line); - int offsetInLine = offset - lineOffset; - // offsetInLine will be greater than line length if the line - // delimiter is longer than one character and the offset is set - // in between parts of the line delimiter. - return offsetInLine > content.getLine(line).length(); -} -/** - * Returns whether the widget is mirrored (right oriented/right to left - * writing order). - * - * @return isMirrored true=the widget is right oriented, false=the widget - * is left oriented - */ -boolean isMirrored() { - return isMirrored; -} -/** - * Returns whether the widget can have only one line. - * - * @return true if widget can have only one line, false if widget can have - * multiple lines - */ -boolean isSingleLine() { - return (getStyle() & SWT.SINGLE) != 0; -} -/** - * Sends the specified verify event, replace/insert text as defined by - * the event and send a modify event. - * - * @param event the text change event. - *
      - *
    • event.start - the replace start offset
    • - *
    • event.end - the replace end offset
    • - *
    • event.text - the new text
    • - *
    - * @param updateCaret whether or not he caret should be set behind - * the new text - */ -void modifyContent(Event event, boolean updateCaret) { - event.doit = true; - notifyListeners(SWT.Verify, event); - if (event.doit) { - StyledTextEvent styledTextEvent = null; - int replacedLength = event.end - event.start; - if (isListening(ExtendedModify)) { - styledTextEvent = new StyledTextEvent(content); - styledTextEvent.start = event.start; - styledTextEvent.end = event.start + event.text.length(); - styledTextEvent.text = content.getTextRange(event.start, replacedLength); - } - if (updateCaret) { - //Fix advancing flag for delete/backspace key on direction boundary - if (event.text.length() == 0) { - int lineIndex = content.getLineAtOffset(event.start); - int lineOffset = content.getOffsetAtLine(lineIndex); - TextLayout layout = renderer.getTextLayout(lineIndex); - int levelStart = layout.getLevel(event.start - lineOffset); - int lineIndexEnd = content.getLineAtOffset(event.end); - if (lineIndex != lineIndexEnd) { - renderer.disposeTextLayout(layout); - lineOffset = content.getOffsetAtLine(lineIndexEnd); - layout = renderer.getTextLayout(lineIndexEnd); - } - int levelEnd = layout.getLevel(event.end - lineOffset); - renderer.disposeTextLayout(layout); - if (levelStart != levelEnd) { - caretAlignment = PREVIOUS_OFFSET_TRAILING; - } else { - caretAlignment = OFFSET_LEADING; - } - } - } - content.replaceTextRange(event.start, replacedLength, event.text); - // set the caret position prior to sending the modify event. - // fixes 1GBB8NJ - if (updateCaret && !(blockSelection && blockXLocation != -1)) { - // always update the caret location. fixes 1G8FODP - setSelection(event.start + event.text.length(), 0, true, false); - showCaret(); - } - notifyListeners(SWT.Modify, event); - if (isListening(ExtendedModify)) { - notifyListeners(ExtendedModify, styledTextEvent); - } - } -} -void paintObject(GC gc, int x, int y, int ascent, int descent, StyleRange style, Bullet bullet, int bulletIndex) { - if (isListening(PaintObject)) { - StyledTextEvent event = new StyledTextEvent (content) ; - event.gc = gc; - event.x = x; - event.y = y; - event.ascent = ascent; - event.descent = descent; - event.style = style; - event.bullet = bullet; - event.bulletIndex = bulletIndex; - notifyListeners(PaintObject, event); - } -} -/** - * Replaces the selection with the text on the DND.CLIPBOARD - * clipboard or, if there is no selection, inserts the text at the current - * caret offset. If the widget has the SWT.SINGLE style and the - * clipboard text contains more than one line, only the first line without - * line delimiters is inserted in the widget. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void paste(){ - checkWidget(); - String text = (String) getClipboardContent(DND.CLIPBOARD); - if (text != null && text.length() > 0) { - if (blockSelection) { - boolean fillWithSpaces = isFixedLineHeight() && renderer.fixedPitch; - int offset = insertBlockSelectionText(text, fillWithSpaces); - setCaretOffset(offset, SWT.DEFAULT); - clearBlockSelection(true, true); - setCaretLocation(); - return; - } - Event event = new Event(); - event.start = selection.x; - event.end = selection.y; - event.text = getModelDelimitedText(text); - sendKeyEvent(event); - } -} -/** - * Prints the widget's text to the default printer. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void print() { - checkWidget(); - Printer printer = new Printer(); - StyledTextPrintOptions options = new StyledTextPrintOptions(); - options.printTextForeground = true; - options.printTextBackground = true; - options.printTextFontStyle = true; - options.printLineBackground = true; - new Printing(this, printer, options).run(); - printer.dispose(); -} -/** - * Returns a runnable that will print the widget's text - * to the specified printer. - *

    - * The runnable may be run in a non-UI thread. - *

    - * - * @param printer the printer to print to - * - * @return a Runnable for printing the receiver's text - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when printer is null
    • - *
    - */ -public Runnable print(Printer printer) { - checkWidget(); - if (printer == null) { - SWT.error(SWT.ERROR_NULL_ARGUMENT); - } - StyledTextPrintOptions options = new StyledTextPrintOptions(); - options.printTextForeground = true; - options.printTextBackground = true; - options.printTextFontStyle = true; - options.printLineBackground = true; - return print(printer, options); -} -/** - * Returns a runnable that will print the widget's text - * to the specified printer. - *

    - * The runnable may be run in a non-UI thread. - *

    - * - * @param printer the printer to print to - * @param options print options to use during printing - * - * @return a Runnable for printing the receiver's text - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when printer or options is null
    • - *
    - * @since 2.1 - */ -public Runnable print(Printer printer, StyledTextPrintOptions options) { - checkWidget(); - if (printer == null || options == null) { - SWT.error(SWT.ERROR_NULL_ARGUMENT); - } - return new Printing(this, printer, options); -} -/** - * Causes the entire bounds of the receiver to be marked - * as needing to be redrawn. The next time a paint request - * is processed, the control will be completely painted. - *

    - * Recalculates the content width for all lines in the bounds. - * When a LineStyleListener is used a redraw call - * is the only notification to the widget that styles have changed - * and that the content width may have changed. - *

    - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see Control#update() - */ -public void redraw() { - super.redraw(); - int itemCount = getPartialBottomIndex() - topIndex + 1; - renderer.reset(topIndex, itemCount); - renderer.calculate(topIndex, itemCount); - setScrollBars(false); - doMouseLinkCursor(); -} -/** - * Causes the rectangular area of the receiver specified by - * the arguments to be marked as needing to be redrawn. - * The next time a paint request is processed, that area of - * the receiver will be painted. If the all flag - * is true, any children of the receiver which - * intersect with the specified area will also paint their - * intersecting areas. If the all flag is - * false, the children will not be painted. - *

    - * Marks the content width of all lines in the specified rectangle - * as unknown. Recalculates the content width of all visible lines. - * When a LineStyleListener is used a redraw call - * is the only notification to the widget that styles have changed - * and that the content width may have changed. - *

    - * - * @param x the x coordinate of the area to draw - * @param y the y coordinate of the area to draw - * @param width the width of the area to draw - * @param height the height of the area to draw - * @param all true if children should redraw, and false otherwise - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see Control#update() - */ -public void redraw(int x, int y, int width, int height, boolean all) { - super.redraw(x, y, width, height, all); - if (height > 0) { - int firstLine = getLineIndex(y); - int lastLine = getLineIndex(y + height); - resetCache(firstLine, lastLine - firstLine + 1); - doMouseLinkCursor(); - } -} -void redrawLines(int startLine, int lineCount, boolean bottomChanged) { - // do nothing if redraw range is completely invisible - int endLine = startLine + lineCount - 1; - int partialBottomIndex = getPartialBottomIndex(); - int partialTopIndex = getPartialTopIndex(); - if (startLine > partialBottomIndex || endLine < partialTopIndex) { - return; - } - // only redraw visible lines - if (startLine < partialTopIndex) { - startLine = partialTopIndex; - } - if (endLine > partialBottomIndex) { - endLine = partialBottomIndex;; - } - int redrawTop = getLinePixel(startLine); - int redrawBottom = getLinePixel(endLine + 1); - if (bottomChanged) redrawBottom = clientAreaHeight - bottomMargin; - int redrawWidth = clientAreaWidth - leftMargin - rightMargin; - super.redraw(leftMargin, redrawTop, redrawWidth, redrawBottom - redrawTop, true); -} -void redrawLinesBullet (int[] redrawLines) { - if (redrawLines == null) return; - int topIndex = getPartialTopIndex(); - int bottomIndex = getPartialBottomIndex(); - for (int i = 0; i < redrawLines.length; i++) { - int lineIndex = redrawLines[i]; - if (!(topIndex <= lineIndex && lineIndex <= bottomIndex)) continue; - int width = -1; - Bullet bullet = renderer.getLineBullet(lineIndex, null); - if (bullet != null) { - StyleRange style = bullet.style; - GlyphMetrics metrics = style.metrics; - width = metrics.width; - } - if (width == -1) width = getClientArea().width; - int height = renderer.getLineHeight(lineIndex); - int y = getLinePixel(lineIndex); - super.redraw(0, y, width, height, false); - } -} -/** - * Redraws the specified text range. - * - * @param start offset of the first character to redraw - * @param length number of characters to redraw - * @param clearBackground true if the background should be cleared as - * part of the redraw operation. If true, the entire redraw range will - * be cleared before anything is redrawn. If the redraw range includes - * the last character of a line (i.e., the entire line is redrawn) the - * line is cleared all the way to the right border of the widget. - * The redraw operation will be faster and smoother if clearBackground - * is set to false. Whether or not the flag can be set to false depends - * on the type of change that has taken place. If font styles or - * background colors for the redraw range have changed, clearBackground - * should be set to true. If only foreground colors have changed for - * the redraw range, clearBackground can be set to false. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when start and/or end are outside the widget content
    • - *
    - */ -public void redrawRange(int start, int length, boolean clearBackground) { - checkWidget(); - int end = start + length; - int contentLength = content.getCharCount(); - if (start > end || start < 0 || end > contentLength) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - int firstLine = content.getLineAtOffset(start); - int lastLine = content.getLineAtOffset(end); - resetCache(firstLine, lastLine - firstLine + 1); - internalRedrawRange(start, length); - doMouseLinkCursor(); -} -/** - * Removes the specified bidirectional segment listener. - * - * @param listener the listener which should no longer be notified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - * - * @since 2.0 - */ -public void removeBidiSegmentListener(BidiSegmentListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - removeListener(LineGetSegments, listener); -} -/** - * Removes the specified caret listener. - * - * @param listener the listener which should no longer be notified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - * - * @since 3.5 - */ -public void removeCaretListener(CaretListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - removeListener(CaretMoved, listener); -} -/** - * Removes the specified extended modify listener. - * - * @param extendedModifyListener the listener which should no longer be notified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void removeExtendedModifyListener(ExtendedModifyListener extendedModifyListener) { - checkWidget(); - if (extendedModifyListener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - removeListener(ExtendedModify, extendedModifyListener); -} -/** - * Removes the specified line background listener. - * - * @param listener the listener which should no longer be notified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void removeLineBackgroundListener(LineBackgroundListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - removeListener(LineGetBackground, listener); -} -/** - * Removes the specified line style listener. - * - * @param listener the listener which should no longer be notified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void removeLineStyleListener(LineStyleListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - removeListener(LineGetStyle, listener); - setCaretLocation(); -} -/** - * Removes the specified modify listener. - * - * @param modifyListener the listener which should no longer be notified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void removeModifyListener(ModifyListener modifyListener) { - checkWidget(); - if (modifyListener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - removeListener(SWT.Modify, modifyListener); -} -/** - * Removes the specified listener. - * - * @param listener the listener which should no longer be notified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - * @since 3.2 - */ -public void removePaintObjectListener(PaintObjectListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - removeListener(PaintObject, listener); -} -/** - * Removes the listener from the collection of listeners who will - * be notified when the user changes the receiver's selection. - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see SelectionListener - * @see #addSelectionListener - */ -public void removeSelectionListener(SelectionListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - removeListener(SWT.Selection, listener); -} -/** - * Removes the specified verify listener. - * - * @param verifyListener the listener which should no longer be notified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void removeVerifyListener(VerifyListener verifyListener) { - checkWidget(); - if (verifyListener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - removeListener(SWT.Verify, verifyListener); -} -/** - * Removes the specified key verify listener. - * - * @param listener the listener which should no longer be notified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void removeVerifyKeyListener(VerifyKeyListener listener) { - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - removeListener(VerifyKey, listener); -} -/** - * Removes the specified word movement listener. - * - * @param listener the listener which should no longer be notified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - * - * @see MovementEvent - * @see MovementListener - * @see #addWordMovementListener - * - * @since 3.3 - */ - -public void removeWordMovementListener(MovementListener listener) { - checkWidget(); - if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - removeListener(WordNext, listener); - removeListener(WordPrevious, listener); -} -/** - * Replaces the styles in the given range with new styles. This method - * effectively deletes the styles in the given range and then adds the - * the new styles. - *

    - * Note: Because a StyleRange includes the start and length, the - * same instance cannot occur multiple times in the array of styles. - * If the same style attributes, such as font and color, occur in - * multiple StyleRanges, setStyleRanges(int, int, int[], StyleRange[]) - * can be used to share styles and reduce memory usage. - *

    - * Should not be called if a LineStyleListener has been set since the - * listener maintains the styles. - *

    - * - * @param start offset of first character where styles will be deleted - * @param length length of the range to delete styles in - * @param ranges StyleRange objects containing the new style information. - * The ranges should not overlap and should be within the specified start - * and length. The style rendering is undefined if the ranges do overlap - * or are ill-defined. Must not be null. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when either start or end is outside the valid range (0 <= offset <= getCharCount())
    • - *
    • ERROR_NULL_ARGUMENT when ranges is null
    • - *
    - * - * @since 2.0 - * - * @see #setStyleRanges(int, int, int[], StyleRange[]) - */ -public void replaceStyleRanges(int start, int length, StyleRange[] ranges) { - checkWidget(); - if (isListening(LineGetStyle)) return; - if (ranges == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - setStyleRanges(start, length, null, ranges, false); -} -/** - * Replaces the given text range with new text. - * If the widget has the SWT.SINGLE style and "text" contains more than - * one line, only the first line is rendered but the text is stored - * unchanged. A subsequent call to getText will return the same text - * that was set. Note that only a single line of text should be set when - * the SWT.SINGLE style is used. - *

    - * NOTE: During the replace operation the current selection is - * changed as follows: - *

      - *
    • selection before replaced text: selection unchanged - *
    • selection after replaced text: adjust the selection so that same text - * remains selected - *
    • selection intersects replaced text: selection is cleared and caret - * is placed after inserted text - *
    - *

    - * - * @param start offset of first character to replace - * @param length number of characters to replace. Use 0 to insert text - * @param text new text. May be empty to delete text. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when either start or end is outside the valid range (0 <= offset <= getCharCount())
    • - *
    • ERROR_INVALID_ARGUMENT when either start or end is inside a multi byte line delimiter. - * Splitting a line delimiter for example by inserting text in between the CR and LF and deleting part of a line delimiter is not supported
    • - *
    • ERROR_NULL_ARGUMENT when string is null
    • - *
    - */ -public void replaceTextRange(int start, int length, String text) { - checkWidget(); - if (text == null) { - SWT.error(SWT.ERROR_NULL_ARGUMENT); - } - int contentLength = getCharCount(); - int end = start + length; - if (start > end || start < 0 || end > contentLength) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - Event event = new Event(); - event.start = start; - event.end = end; - event.text = text; - modifyContent(event, false); -} -/** - * Resets the caret position, selection and scroll offsets. Recalculate - * the content width and scroll bars. Redraw the widget. - */ -void reset() { - ScrollBar verticalBar = getVerticalBar(); - ScrollBar horizontalBar = getHorizontalBar(); - setCaretOffset(0, SWT.DEFAULT); - topIndex = 0; - topIndexY = 0; - verticalScrollOffset = 0; - horizontalScrollOffset = 0; - resetSelection(); - renderer.setContent(content); - if (verticalBar != null) { - verticalBar.setSelection(0); - } - if (horizontalBar != null) { - horizontalBar.setSelection(0); - } - resetCache(0, 0); - setCaretLocation(); - super.redraw(); -} -void resetCache(int firstLine, int count) { - int maxLineIndex = renderer.maxWidthLineIndex; - renderer.reset(firstLine, count); - renderer.calculateClientArea(); - if (0 <= maxLineIndex && maxLineIndex < content.getLineCount()) { - renderer.calculate(maxLineIndex, 1); - } - setScrollBars(true); - if (!isFixedLineHeight()) { - if (topIndex > firstLine) { - verticalScrollOffset = -1; - } - renderer.calculateIdle(); - } -} -/** - * Resets the selection. - */ -void resetSelection() { - selection.x = selection.y = caretOffset; - selectionAnchor = -1; -} - -public void scroll(int destX, int destY, int x, int y, int width, int height, boolean all) { - super.scroll(destX, destY, x, y, width, height, false); - if (all) { - int deltaX = destX - x, deltaY = destY - y; - Control[] children = getChildren(); - for (int i=0; i 0 = scroll left, - * < 0 scroll right - * @param adjustScrollBar - * true= the scroll thumb will be moved to reflect the new scroll offset. - * false = the scroll thumb will not be moved - * @return - * true=the widget was scrolled - * false=the widget was not scrolled, the given offset is not valid. - */ -boolean scrollHorizontal(int pixels, boolean adjustScrollBar) { - if (pixels == 0) { - return false; - } - ScrollBar horizontalBar = getHorizontalBar(); - if (horizontalBar != null && adjustScrollBar) { - horizontalBar.setSelection(horizontalScrollOffset + pixels); - } - int scrollHeight = clientAreaHeight - topMargin - bottomMargin; - if (pixels > 0) { - int sourceX = leftMargin + pixels; - int scrollWidth = clientAreaWidth - sourceX - rightMargin; - if (scrollWidth > 0) { - scroll(leftMargin, topMargin, sourceX, topMargin, scrollWidth, scrollHeight, true); - } - if (sourceX > scrollWidth) { - super.redraw(leftMargin + scrollWidth, topMargin, pixels - scrollWidth, scrollHeight, true); - } - } else { - int destinationX = leftMargin - pixels; - int scrollWidth = clientAreaWidth - destinationX - rightMargin; - if (scrollWidth > 0) { - scroll(destinationX, topMargin, leftMargin, topMargin, scrollWidth, scrollHeight, true); - } - if (destinationX > scrollWidth) { - super.redraw(leftMargin + scrollWidth, topMargin, -pixels - scrollWidth, scrollHeight, true); - } - } - horizontalScrollOffset += pixels; - setCaretLocation(); - return true; -} -/** - * Scrolls the widget vertically. - * - * @param pixel the new vertical scroll offset - * @param adjustScrollBar - * true= the scroll thumb will be moved to reflect the new scroll offset. - * false = the scroll thumb will not be moved - * @return - * true=the widget was scrolled - * false=the widget was not scrolled - */ -boolean scrollVertical(int pixels, boolean adjustScrollBar) { - if (pixels == 0) { - return false; - } - if (verticalScrollOffset != -1) { - ScrollBar verticalBar = getVerticalBar(); - if (verticalBar != null && adjustScrollBar) { - verticalBar.setSelection(verticalScrollOffset + pixels); - } - int scrollWidth = clientAreaWidth - leftMargin - rightMargin; - if (pixels > 0) { - int sourceY = topMargin + pixels; - int scrollHeight = clientAreaHeight - sourceY - bottomMargin; - if (scrollHeight > 0) { - scroll(leftMargin, topMargin, leftMargin, sourceY, scrollWidth, scrollHeight, true); - } - if (sourceY > scrollHeight) { - int redrawY = Math.max(0, topMargin + scrollHeight); - int redrawHeight = Math.min(clientAreaHeight, pixels - scrollHeight); - super.redraw(leftMargin, redrawY, scrollWidth, redrawHeight, true); - } - } else { - int destinationY = topMargin - pixels; - int scrollHeight = clientAreaHeight - destinationY - bottomMargin; - if (scrollHeight > 0) { - scroll(leftMargin, destinationY, leftMargin, topMargin, scrollWidth, scrollHeight, true); - } - if (destinationY > scrollHeight) { - int redrawY = Math.max(0, topMargin + scrollHeight); - int redrawHeight = Math.min(clientAreaHeight, -pixels - scrollHeight); - super.redraw(leftMargin, redrawY, scrollWidth, redrawHeight, true); - } - } - verticalScrollOffset += pixels; - calculateTopIndex(pixels); - } else { - calculateTopIndex(pixels); - super.redraw(); - } - setCaretLocation(); - return true; -} -void scrollText(int srcY, int destY) { - if (srcY == destY) return; - int deltaY = destY - srcY; - int scrollWidth = clientAreaWidth - leftMargin - rightMargin, scrollHeight; - if (deltaY > 0) { - scrollHeight = clientAreaHeight - srcY - bottomMargin; - } else { - scrollHeight = clientAreaHeight - destY - bottomMargin; - } - scroll(leftMargin, destY, leftMargin, srcY, scrollWidth, scrollHeight, true); - if ((0 < srcY + scrollHeight) && (topMargin > srcY)) { - super.redraw(leftMargin, deltaY, scrollWidth, topMargin, false); - } - if ((0 < destY + scrollHeight) && (topMargin > destY)) { - super.redraw(leftMargin, 0, scrollWidth, topMargin, false); - } - if ((clientAreaHeight - bottomMargin < srcY + scrollHeight) && (clientAreaHeight > srcY)) { - super.redraw(leftMargin, clientAreaHeight - bottomMargin + deltaY, scrollWidth, bottomMargin, false); - } - if ((clientAreaHeight - bottomMargin < destY + scrollHeight) && (clientAreaHeight > destY)) { - super.redraw(leftMargin, clientAreaHeight - bottomMargin, scrollWidth, bottomMargin, false); - } -} -void sendAccessibleTextChanged(int start, int newCharCount, int replaceCharCount) { - Accessible accessible = getAccessible(); - if (replaceCharCount != 0) { - accessible.textChanged(ACC.TEXT_DELETE, start, replaceCharCount); - } - if (newCharCount != 0) { - accessible.textChanged(ACC.TEXT_INSERT, start, newCharCount); - } -} -/** - * Selects all the text. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void selectAll() { - checkWidget(); - if (blockSelection) { - renderer.calculate(0, content.getLineCount()); - setScrollBars(false); - int verticalScrollOffset = getVerticalScrollOffset(); - int left = leftMargin - horizontalScrollOffset; - int top = topMargin - verticalScrollOffset; - int right = renderer.getWidth() - rightMargin - horizontalScrollOffset; - int bottom = renderer.getHeight() - bottomMargin - verticalScrollOffset; - setBlockSelectionLocation(left, top, right, bottom, false); - return; - } - setSelection(0, Math.max(getCharCount(),0)); -} -/** - * Replaces/inserts text as defined by the event. - * - * @param event the text change event. - *
      - *
    • event.start - the replace start offset
    • - *
    • event.end - the replace end offset
    • - *
    • event.text - the new text
    • - *
    - */ -void sendKeyEvent(Event event) { - if (editable) { - modifyContent(event, true); - } -} -/** - * Returns a StyledTextEvent that can be used to request data such - * as styles and background color for a line. - *

    - * The specified line may be a visual (wrapped) line if in word - * wrap mode. The returned object will always be for a logical - * (unwrapped) line. - *

    - * - * @param lineOffset offset of the line. This may be the offset of - * a visual line if the widget is in word wrap mode. - * @param line line text. This may be the text of a visual line if - * the widget is in word wrap mode. - * @return StyledTextEvent that can be used to request line data - * for the given line. - */ -StyledTextEvent sendLineEvent(int eventType, int lineOffset, String line) { - StyledTextEvent event = null; - if (isListening(eventType)) { - event = new StyledTextEvent(content); - event.detail = lineOffset; - event.text = line; - event.alignment = alignment; - event.indent = indent; - event.justify = justify; - notifyListeners(eventType, event); - } - return event; -} -/** - * Sends the specified selection event. - */ -void sendSelectionEvent() { - getAccessible().textSelectionChanged(); - Event event = new Event(); - event.x = selection.x; - event.y = selection.y; - notifyListeners(SWT.Selection, event); -} -int sendTextEvent(int left, int right, int lineIndex, String text, boolean fillWithSpaces) { - int lineWidth = 0, start, end; - StringBuffer buffer = new StringBuffer(); - if (lineIndex < content.getLineCount()) { - int[] trailing = new int[1]; - start = getOffsetAtPoint(left, getLinePixel(lineIndex), trailing, true); - if (start == -1) { - int lineOffset = content.getOffsetAtLine(lineIndex); - int lineLegth = content.getLine(lineIndex).length(); - start = end = lineOffset + lineLegth; - if (fillWithSpaces) { - TextLayout layout = renderer.getTextLayout(lineIndex); - lineWidth = layout.getBounds().width; - renderer.disposeTextLayout(layout); - } - } else { - start += trailing[0]; - end = left == right ? start : getOffsetAtPoint(right, 0, lineIndex, null); - fillWithSpaces = false; - } - } else { - start = end = content.getCharCount(); - buffer.append(content.getLineDelimiter()); - } - if (start > end) { - int temp = start; - start = end; - end = temp; - } - if (fillWithSpaces) { - int spacesWidth = left - lineWidth + horizontalScrollOffset - leftMargin; - int spacesCount = spacesWidth / renderer.averageCharWidth; - for (int i = 0; i < spacesCount; i++) { - buffer.append(' '); - } - } - buffer.append(text); - Event event = new Event(); - event.start = start; - event.end = end; - event.text = buffer.toString(); - sendKeyEvent(event); - return event.start + event.text.length(); -} -int sendWordBoundaryEvent(int eventType, int movement, int offset, int newOffset, String lineText, int lineOffset) { - if (isListening(eventType)) { - StyledTextEvent event = new StyledTextEvent(content); - event.detail = lineOffset; - event.text = lineText; - event.count = movement; - event.start = offset; - event.end = newOffset; - notifyListeners(eventType, event); - offset = event.end; - if (offset != newOffset) { - int length = getCharCount(); - if (offset < 0) { - offset = 0; - } else if (offset > length) { - offset = length; - } else { - if (isLineDelimiter(offset)) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - } - } - return offset; - } - return newOffset; -} -void setAlignment() { - if ((getStyle() & SWT.SINGLE) == 0) return; - int alignment = renderer.getLineAlignment(0, this.alignment); - int newAlignmentMargin = 0; - if (alignment != SWT.LEFT) { - renderer.calculate(0, 1); - int width = renderer.getWidth() - alignmentMargin; - newAlignmentMargin = clientAreaWidth - width; - if (newAlignmentMargin < 0) newAlignmentMargin = 0; - if (alignment == SWT.CENTER) newAlignmentMargin /= 2; - } - if (alignmentMargin != newAlignmentMargin) { - leftMargin -= alignmentMargin; - leftMargin += newAlignmentMargin; - alignmentMargin = newAlignmentMargin; - resetCache(0, 1); - setCaretLocation(); - super.redraw(); - } -} -/** - * Sets the alignment of the widget. The argument should be one of SWT.LEFT, - * SWT.CENTER or SWT.RIGHT. The alignment applies for all lines. - *

    - * Note that if SWT.MULTI is set, then SWT.WRAP must also be set - * in order to stabilize the right edge before setting alignment. - *

    - * - * @param alignment the new alignment - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see #setLineAlignment(int, int, int) - * - * @since 3.2 - */ -public void setAlignment(int alignment) { - checkWidget(); - alignment &= (SWT.LEFT | SWT.RIGHT | SWT.CENTER); - if (alignment == 0 || this.alignment == alignment) return; - this.alignment = alignment; - resetCache(0, content.getLineCount()); - setCaretLocation(); - setAlignment(); - super.redraw(); -} -/** - * @see Control#setBackground(Color) - */ -public void setBackground(Color color) { - checkWidget(); - background = color; - super.setBackground(color); - resetCache(0, content.getLineCount()); - setCaretLocation(); - super.redraw(); -} -/** - * Sets the block selection mode. - * - * @param blockSelection true=enable block selection, false=disable block selection - * - * @since 3.5 - */ -public void setBlockSelection(boolean blockSelection) { - checkWidget(); - if ((getStyle() & SWT.SINGLE) != 0) return; - if (blockSelection == this.blockSelection) return; - if (wordWrap) return; - this.blockSelection = blockSelection; - if (cursor == null) { - Display display = getDisplay(); - int type = blockSelection ? SWT.CURSOR_CROSS : SWT.CURSOR_IBEAM; - super.setCursor(display.getSystemCursor(type)); - } - if (blockSelection) { - int start = selection.x; - int end = selection.y; - if (start != end) { - setBlockSelectionOffset(start, end, false); - } - } else { - clearBlockSelection(false, false); - } -} -/** - * Sets the block selection bounds. The bounds is - * relative to the upper left corner of the document. - * - * @param rect the new bounds for the block selection - * - * @see #setBlockSelectionBounds(int, int, int, int) - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when point is null
    • - *
    - * - * @since 3.5 - */ -public void setBlockSelectionBounds(Rectangle rect) { - checkWidget(); - if (rect == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - setBlockSelectionBounds(rect.x, rect.y, rect.width, rect.height); -} -/** - * Sets the block selection bounds. The bounds is - * relative to the upper left corner of the document. - * - * @param x the new x coordinate for the block selection - * @param y the new y coordinate for the block selection - * @param width the new width for the block selection - * @param height the new height for the block selection - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public void setBlockSelectionBounds(int x, int y, int width, int height) { - checkWidget(); - int verticalScrollOffset = getVerticalScrollOffset(); - if (!blockSelection) { - x -= horizontalScrollOffset; - y -= verticalScrollOffset; - int start = getOffsetAtPoint(x, y, null); - int end = getOffsetAtPoint(x+width-1, y+height-1, null); - setSelection(start, end - start, false, false); - setCaretLocation(); - return; - } - int minY = topMargin; - int minX = leftMargin; - int maxY = renderer.getHeight() - bottomMargin; - int maxX = Math.max(clientAreaWidth, renderer.getWidth()) - rightMargin; - int anchorX = Math.max(minX, Math.min(maxX, x)) - horizontalScrollOffset; - int anchorY = Math.max(minY, Math.min(maxY, y)) - verticalScrollOffset; - int locationX = Math.max(minX, Math.min(maxX, x + width)) - horizontalScrollOffset; - int locationY = Math.max(minY, Math.min(maxY, y + height - 1)) - verticalScrollOffset; - if (isFixedLineHeight() && renderer.fixedPitch) { - int avg = renderer.averageCharWidth; - anchorX = ((anchorX - leftMargin + horizontalScrollOffset) / avg * avg) + leftMargin - horizontalScrollOffset; - locationX = ((locationX + avg / 2 - leftMargin + horizontalScrollOffset) / avg * avg) + leftMargin - horizontalScrollOffset; - } - setBlockSelectionLocation(anchorX, anchorY, locationX, locationY, false); -} -void setBlockSelectionLocation (int x, int y, boolean sendEvent) { - int verticalScrollOffset = getVerticalScrollOffset(); - blockXLocation = x + horizontalScrollOffset; - blockYLocation = y + verticalScrollOffset; - int[] alignment = new int[1]; - int offset = getOffsetAtPoint(x, y, alignment); - setCaretOffset(offset, alignment[0]); - if (blockXAnchor == -1) { - blockXAnchor = blockXLocation; - blockYAnchor = blockYLocation; - selectionAnchor = caretOffset; - } - doBlockSelection(sendEvent); -} -void setBlockSelectionLocation (int anchorX, int anchorY, int x, int y, boolean sendEvent) { - int verticalScrollOffset = getVerticalScrollOffset(); - blockXAnchor = anchorX + horizontalScrollOffset; - blockYAnchor = anchorY + verticalScrollOffset; - selectionAnchor = getOffsetAtPoint(anchorX, anchorY, null); - setBlockSelectionLocation(x, y, sendEvent); -} -void setBlockSelectionOffset (int offset, boolean sendEvent) { - Point point = getPointAtOffset(offset); - int verticalScrollOffset = getVerticalScrollOffset(); - blockXLocation = point.x + horizontalScrollOffset; - blockYLocation = point.y + verticalScrollOffset; - setCaretOffset(offset, SWT.DEFAULT); - if (blockXAnchor == -1) { - blockXAnchor = blockXLocation; - blockYAnchor = blockYLocation; - selectionAnchor = caretOffset; - } - doBlockSelection(sendEvent); -} -void setBlockSelectionOffset (int anchorOffset, int offset, boolean sendEvent) { - int verticalScrollOffset = getVerticalScrollOffset(); - Point anchorPoint = getPointAtOffset(anchorOffset); - blockXAnchor = anchorPoint.x + horizontalScrollOffset; - blockYAnchor = anchorPoint.y + verticalScrollOffset; - selectionAnchor = anchorOffset; - setBlockSelectionOffset(offset, sendEvent); -} -/** - * Sets the receiver's caret. Set the caret's height and location. - * - *

    - * @param caret the new caret for the receiver - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setCaret(Caret caret) { - checkWidget (); - super.setCaret(caret); - caretDirection = SWT.NULL; - if (caret != null) { - setCaretLocation(); - } -} -/** - * Sets the BIDI coloring mode. When true the BIDI text display - * algorithm is applied to segments of text that are the same - * color. - * - * @param mode the new coloring mode - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @deprecated use BidiSegmentListener instead. - */ -public void setBidiColoring(boolean mode) { - checkWidget(); - bidiColoring = mode; -} -/** - * Sets the bottom margin. - * - * @param bottomMargin the bottom margin. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public void setBottomMargin (int bottomMargin) { - checkWidget(); - setMargins(leftMargin, topMargin, rightMargin, bottomMargin); -} -/** - * Moves the Caret to the current caret offset. - */ -void setCaretLocation() { - Point newCaretPos = getPointAtOffset(caretOffset); - setCaretLocation(newCaretPos, getCaretDirection()); -} -void setCaretLocation(Point location, int direction) { - Caret caret = getCaret(); - if (caret != null) { - boolean isDefaultCaret = caret == defaultCaret; - int lineHeight = renderer.getLineHeight(); - int caretHeight = lineHeight; - if (!isFixedLineHeight() && isDefaultCaret) { - caretHeight = getBoundsAtOffset(caretOffset).height; - if (caretHeight != lineHeight) { - direction = SWT.DEFAULT; - } - } - int imageDirection = direction; - if (isMirrored()) { - if (imageDirection == SWT.LEFT) { - imageDirection = SWT.RIGHT; - } else if (imageDirection == SWT.RIGHT) { - imageDirection = SWT.LEFT; - } - } - if (isDefaultCaret && imageDirection == SWT.RIGHT) { - location.x -= (caret.getSize().x - 1); - } - if (isDefaultCaret) { - caret.setBounds(location.x, location.y, caretWidth, caretHeight); - } else { - caret.setLocation(location); - } - getAccessible().textCaretMoved(getCaretOffset()); - if (direction != caretDirection) { - caretDirection = direction; - if (isDefaultCaret) { - if (imageDirection == SWT.DEFAULT) { - defaultCaret.setImage(null); - } else if (imageDirection == SWT.LEFT) { - defaultCaret.setImage(leftCaretBitmap); - } else if (imageDirection == SWT.RIGHT) { - defaultCaret.setImage(rightCaretBitmap); - } - } - if (caretDirection == SWT.LEFT) { - BidiUtil.setKeyboardLanguage(BidiUtil.KEYBOARD_NON_BIDI); - } else if (caretDirection == SWT.RIGHT) { - BidiUtil.setKeyboardLanguage(BidiUtil.KEYBOARD_BIDI); - } - } - updateCaretVisibility(); - } - columnX = location.x; -} -/** - * Sets the caret offset. - * - * @param offset caret offset, relative to the first character in the text. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when either the start or the end of the selection range is inside a - * multi byte line delimiter (and thus neither clearly in front of or after the line delimiter) - *
    - */ -public void setCaretOffset(int offset) { - checkWidget(); - int length = getCharCount(); - if (length > 0 && offset != caretOffset) { - if (offset < 0) { - offset = 0; - } else if (offset > length) { - offset = length; - } else { - if (isLineDelimiter(offset)) { - // offset is inside a multi byte line delimiter. This is an - // illegal operation and an exception is thrown. Fixes 1GDKK3R - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - } - setCaretOffset(offset, PREVIOUS_OFFSET_TRAILING); - // clear the selection if the caret is moved. - // don't notify listeners about the selection change. - if (blockSelection) { - clearBlockSelection(true, false); - } else { - clearSelection(false); - } - } - setCaretLocation(); -} -void setCaretOffset(int offset, int alignment) { - if (caretOffset != offset) { - caretOffset = offset; - if (isListening(CaretMoved)) { - StyledTextEvent event = new StyledTextEvent(content); - event.end = caretOffset; - notifyListeners(CaretMoved, event); - } - } - if (alignment != SWT.DEFAULT) { - caretAlignment = alignment; - } -} -/** - * Copies the specified text range to the clipboard. The text will be placed - * in the clipboard in plain text format and RTF format. - * - * @param start start index of the text - * @param length length of text to place in clipboard - * - * @exception SWTError, see Clipboard.setContents - * @see org.eclipse.swt.dnd.Clipboard#setContents - */ -void setClipboardContent(int start, int length, int clipboardType) throws SWTError { - if (clipboardType == DND.SELECTION_CLIPBOARD && !(IS_MOTIF || IS_GTK)) return; - TextTransfer plainTextTransfer = TextTransfer.getInstance(); - TextWriter plainTextWriter = new TextWriter(start, length); - String plainText = getPlatformDelimitedText(plainTextWriter); - Object[] data; - Transfer[] types; - if (clipboardType == DND.SELECTION_CLIPBOARD) { - data = new Object[]{plainText}; - types = new Transfer[]{plainTextTransfer}; - } else { - RTFTransfer rtfTransfer = RTFTransfer.getInstance(); - RTFWriter rtfWriter = new RTFWriter(start, length); - String rtfText = getPlatformDelimitedText(rtfWriter); - data = new Object[]{rtfText, plainText}; - types = new Transfer[]{rtfTransfer, plainTextTransfer}; - } - clipboard.setContents(data, types, clipboardType); -} -/** - * Sets the content implementation to use for text storage. - * - * @param newContent StyledTextContent implementation to use for text storage. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void setContent(StyledTextContent newContent) { - checkWidget(); - if (newContent == null) { - SWT.error(SWT.ERROR_NULL_ARGUMENT); - } - if (content != null) { - content.removeTextChangeListener(textChangeListener); - } - content = newContent; - content.addTextChangeListener(textChangeListener); - reset(); -} -/** - * Sets the receiver's cursor to the cursor specified by the - * argument. Overridden to handle the null case since the - * StyledText widget uses an ibeam as its default cursor. - * - * @see Control#setCursor(Cursor) - */ -public void setCursor (Cursor cursor) { - checkWidget(); - if (cursor != null && cursor.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - this.cursor = cursor; - if (cursor == null) { - Display display = getDisplay(); - int type = blockSelection ? SWT.CURSOR_CROSS : SWT.CURSOR_IBEAM; - super.setCursor(display.getSystemCursor(type)); - } else { - super.setCursor(cursor); - } -} -/** - * Sets whether the widget implements double click mouse behavior. - *

    - * - * @param enable if true double clicking a word selects the word, if false - * double clicks have the same effect as regular mouse clicks. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setDoubleClickEnabled(boolean enable) { - checkWidget(); - doubleClickEnabled = enable; -} -public void setDragDetect (boolean dragDetect) { - checkWidget (); - this.dragDetect = dragDetect; -} -/** - * Sets whether the widget content can be edited. - *

    - * - * @param editable if true content can be edited, if false content can not be - * edited - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setEditable(boolean editable) { - checkWidget(); - this.editable = editable; -} -/** - * Sets a new font to render text with. - *

    - * NOTE: Italic fonts are not supported unless they have no overhang - * and the same baseline as regular fonts. - *

    - * - * @param font new font - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setFont(Font font) { - checkWidget(); - int oldLineHeight = renderer.getLineHeight(); - super.setFont(font); - renderer.setFont(getFont(), tabLength); - // keep the same top line visible. fixes 5815 - if (isFixedLineHeight()) { - int lineHeight = renderer.getLineHeight(); - if (lineHeight != oldLineHeight) { - int vscroll = (getVerticalScrollOffset() * lineHeight / oldLineHeight) - getVerticalScrollOffset(); - scrollVertical(vscroll, true); - } - } - resetCache(0, content.getLineCount()); - claimBottomFreeSpace(); - calculateScrollBars(); - if (isBidiCaret()) createCaretBitmaps(); - caretDirection = SWT.NULL; - setCaretLocation(); - super.redraw(); -} -public void setForeground(Color color) { - checkWidget(); - foreground = color; - super.setForeground(getForeground()); - resetCache(0, content.getLineCount()); - setCaretLocation(); - super.redraw(); -} -/** - * Sets the horizontal scroll offset relative to the start of the line. - * Do nothing if there is no text set. - *

    - * NOTE: The horizontal index is reset to 0 when new text is set in the - * widget. - *

    - * - * @param offset horizontal scroll offset relative to the start - * of the line, measured in character increments starting at 0, if - * equal to 0 the content is not scrolled, if > 0 = the content is scrolled. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setHorizontalIndex(int offset) { - checkWidget(); - if (getCharCount() == 0) { - return; - } - if (offset < 0) { - offset = 0; - } - offset *= getHorizontalIncrement(); - // allow any value if client area width is unknown or 0. - // offset will be checked in resize handler. - // don't use isVisible since width is known even if widget - // is temporarily invisible - if (clientAreaWidth > 0) { - int width = renderer.getWidth(); - // prevent scrolling if the content fits in the client area. - // align end of longest line with right border of client area - // if offset is out of range. - if (offset > width - clientAreaWidth) { - offset = Math.max(0, width - clientAreaWidth); - } - } - scrollHorizontal(offset - horizontalScrollOffset, true); -} -/** - * Sets the horizontal pixel offset relative to the start of the line. - * Do nothing if there is no text set. - *

    - * NOTE: The horizontal pixel offset is reset to 0 when new text - * is set in the widget. - *

    - * - * @param pixel horizontal pixel offset relative to the start - * of the line. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @since 2.0 - */ -public void setHorizontalPixel(int pixel) { - checkWidget(); - if (getCharCount() == 0) { - return; - } - if (pixel < 0) { - pixel = 0; - } - // allow any value if client area width is unknown or 0. - // offset will be checked in resize handler. - // don't use isVisible since width is known even if widget - // is temporarily invisible - if (clientAreaWidth > 0) { - int width = renderer.getWidth(); - // prevent scrolling if the content fits in the client area. - // align end of longest line with right border of client area - // if offset is out of range. - if (pixel > width - clientAreaWidth) { - pixel = Math.max(0, width - clientAreaWidth); - } - } - scrollHorizontal(pixel - horizontalScrollOffset, true); -} -/** - * Sets the line indentation of the widget. - *

    - * It is the amount of blank space, in pixels, at the beginning of each line. - * When a line wraps in several lines only the first one is indented. - *

    - * - * @param indent the new indent - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see #setLineIndent(int, int, int) - * - * @since 3.2 - */ -public void setIndent(int indent) { - checkWidget(); - if (this.indent == indent || indent < 0) return; - this.indent = indent; - resetCache(0, content.getLineCount()); - setCaretLocation(); - super.redraw(); -} -/** - * Sets whether the widget should justify lines. - * - * @param justify whether lines should be justified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see #setLineJustify(int, int, boolean) - * - * @since 3.2 - */ -public void setJustify(boolean justify) { - checkWidget(); - if (this.justify == justify) return; - this.justify = justify; - resetCache(0, content.getLineCount()); - setCaretLocation(); - super.redraw(); -} -/** - * Maps a key to an action. - *

    - * One action can be associated with N keys. However, each key can only - * have one action (key:action is N:1 relation). - *

    - * - * @param key a key code defined in SWT.java or a character. - * Optionally ORd with a state mask. Preferred state masks are one or more of - * SWT.MOD1, SWT.MOD2, SWT.MOD3, since these masks account for modifier platform - * differences. However, there may be cases where using the specific state masks - * (i.e., SWT.CTRL, SWT.SHIFT, SWT.ALT, SWT.COMMAND) makes sense. - * @param action one of the predefined actions defined in ST.java. - * Use SWT.NULL to remove a key binding. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setKeyBinding(int key, int action) { - checkWidget(); - int modifierValue = key & SWT.MODIFIER_MASK; - char keyChar = (char)(key & SWT.KEY_MASK); - if (Compatibility.isLetter(keyChar)) { - // make the keybinding case insensitive by adding it - // in its upper and lower case form - char ch = Character.toUpperCase(keyChar); - int newKey = ch | modifierValue; - if (action == SWT.NULL) { - keyActionMap.remove(new Integer(newKey)); - } else { - keyActionMap.put(new Integer(newKey), new Integer(action)); - } - ch = Character.toLowerCase(keyChar); - newKey = ch | modifierValue; - if (action == SWT.NULL) { - keyActionMap.remove(new Integer(newKey)); - } else { - keyActionMap.put(new Integer(newKey), new Integer(action)); - } - } else { - if (action == SWT.NULL) { - keyActionMap.remove(new Integer(key)); - } else { - keyActionMap.put(new Integer(key), new Integer(action)); - } - } -} -/** - * Sets the left margin. - * - * @param leftMargin the left margin. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public void setLeftMargin (int leftMargin) { - checkWidget(); - setMargins(leftMargin, topMargin, rightMargin, bottomMargin); -} -/** - * Sets the alignment of the specified lines. The argument should be one of SWT.LEFT, - * SWT.CENTER or SWT.RIGHT. - *

    - * Note that if SWT.MULTI is set, then SWT.WRAP must also be set - * in order to stabilize the right edge before setting alignment. - *

    - * Should not be called if a LineStyleListener has been set since the listener - * maintains the line attributes. - *

    - * All line attributes are maintained relative to the line text, not the - * line index that is specified in this method call. - * During text changes, when entire lines are inserted or removed, the line - * attributes that are associated with the lines after the change - * will "move" with their respective text. An entire line is defined as - * extending from the first character on a line to the last and including the - * line delimiter. - *

    - * When two lines are joined by deleting a line delimiter, the top line - * attributes take precedence and the attributes of the bottom line are deleted. - * For all other text changes line attributes will remain unchanged. - * - * @param startLine first line the alignment is applied to, 0 based - * @param lineCount number of lines the alignment applies to. - * @param alignment line alignment - * - * @exception SWTException

      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when the specified line range is invalid
    • - *
    - * @see #setAlignment(int) - * @since 3.2 - */ -public void setLineAlignment(int startLine, int lineCount, int alignment) { - checkWidget(); - if (isListening(LineGetStyle)) return; - if (startLine < 0 || startLine + lineCount > content.getLineCount()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - - renderer.setLineAlignment(startLine, lineCount, alignment); - resetCache(startLine, lineCount); - redrawLines(startLine, lineCount, false); - int caretLine = getCaretLine(); - if (startLine <= caretLine && caretLine < startLine + lineCount) { - setCaretLocation(); - } - setAlignment(); -} -/** - * Sets the background color of the specified lines. - *

    - * The background color is drawn for the width of the widget. All - * line background colors are discarded when setText is called. - * The text background color if defined in a StyleRange overlays the - * line background color. - *

    - * Should not be called if a LineBackgroundListener has been set since the - * listener maintains the line backgrounds. - *

    - * All line attributes are maintained relative to the line text, not the - * line index that is specified in this method call. - * During text changes, when entire lines are inserted or removed, the line - * attributes that are associated with the lines after the change - * will "move" with their respective text. An entire line is defined as - * extending from the first character on a line to the last and including the - * line delimiter. - *

    - * When two lines are joined by deleting a line delimiter, the top line - * attributes take precedence and the attributes of the bottom line are deleted. - * For all other text changes line attributes will remain unchanged. - *

    - * - * @param startLine first line the color is applied to, 0 based - * @param lineCount number of lines the color applies to. - * @param background line background color - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when the specified line range is invalid
    • - *
    - */ -public void setLineBackground(int startLine, int lineCount, Color background) { - checkWidget(); - if (isListening(LineGetBackground)) return; - if (startLine < 0 || startLine + lineCount > content.getLineCount()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (background != null) { - renderer.setLineBackground(startLine, lineCount, background); - } else { - renderer.clearLineBackground(startLine, lineCount); - } - redrawLines(startLine, lineCount, false); -} -/** - * Sets the bullet of the specified lines. - *

    - * Should not be called if a LineStyleListener has been set since the listener - * maintains the line attributes. - *

    - * All line attributes are maintained relative to the line text, not the - * line index that is specified in this method call. - * During text changes, when entire lines are inserted or removed, the line - * attributes that are associated with the lines after the change - * will "move" with their respective text. An entire line is defined as - * extending from the first character on a line to the last and including the - * line delimiter. - *

    - * When two lines are joined by deleting a line delimiter, the top line - * attributes take precedence and the attributes of the bottom line are deleted. - * For all other text changes line attributes will remain unchanged. - *

    - * - * @param startLine first line the bullet is applied to, 0 based - * @param lineCount number of lines the bullet applies to. - * @param bullet line bullet - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when the specified line range is invalid
    • - *
    - * @since 3.2 - */ -public void setLineBullet(int startLine, int lineCount, Bullet bullet) { - checkWidget(); - if (isListening(LineGetStyle)) return; - if (startLine < 0 || startLine + lineCount > content.getLineCount()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - int oldBottom = getLinePixel(startLine + lineCount); - renderer.setLineBullet(startLine, lineCount, bullet); - resetCache(startLine, lineCount); - int newBottom = getLinePixel(startLine + lineCount); - redrawLines(startLine, lineCount, oldBottom != newBottom); - int caretLine = getCaretLine(); - if (startLine <= caretLine && caretLine < startLine + lineCount) { - setCaretLocation(); - } -} -void setVariableLineHeight () { - if (!fixedLineHeight) return; - fixedLineHeight = false; - renderer.calculateIdle(); -} -/** - * Sets the indent of the specified lines. - *

    - * Should not be called if a LineStyleListener has been set since the listener - * maintains the line attributes. - *

    - * All line attributes are maintained relative to the line text, not the - * line index that is specified in this method call. - * During text changes, when entire lines are inserted or removed, the line - * attributes that are associated with the lines after the change - * will "move" with their respective text. An entire line is defined as - * extending from the first character on a line to the last and including the - * line delimiter. - *

    - * When two lines are joined by deleting a line delimiter, the top line - * attributes take precedence and the attributes of the bottom line are deleted. - * For all other text changes line attributes will remain unchanged. - *

    - * - * @param startLine first line the indent is applied to, 0 based - * @param lineCount number of lines the indent applies to. - * @param indent line indent - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when the specified line range is invalid
    • - *
    - * @see #setIndent(int) - * @since 3.2 - */ -public void setLineIndent(int startLine, int lineCount, int indent) { - checkWidget(); - if (isListening(LineGetStyle)) return; - if (startLine < 0 || startLine + lineCount > content.getLineCount()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - int oldBottom = getLinePixel(startLine + lineCount); - renderer.setLineIndent(startLine, lineCount, indent); - resetCache(startLine, lineCount); - int newBottom = getLinePixel(startLine + lineCount); - redrawLines(startLine, lineCount, oldBottom != newBottom); - int caretLine = getCaretLine(); - if (startLine <= caretLine && caretLine < startLine + lineCount) { - setCaretLocation(); - } -} -/** - * Sets the justify of the specified lines. - *

    - * Should not be called if a LineStyleListener has been set since the listener - * maintains the line attributes. - *

    - * All line attributes are maintained relative to the line text, not the - * line index that is specified in this method call. - * During text changes, when entire lines are inserted or removed, the line - * attributes that are associated with the lines after the change - * will "move" with their respective text. An entire line is defined as - * extending from the first character on a line to the last and including the - * line delimiter. - *

    - * When two lines are joined by deleting a line delimiter, the top line - * attributes take precedence and the attributes of the bottom line are deleted. - * For all other text changes line attributes will remain unchanged. - *

    - * - * @param startLine first line the justify is applied to, 0 based - * @param lineCount number of lines the justify applies to. - * @param justify true if lines should be justified - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when the specified line range is invalid
    • - *
    - * @see #setJustify(boolean) - * @since 3.2 - */ -public void setLineJustify(int startLine, int lineCount, boolean justify) { - checkWidget(); - if (isListening(LineGetStyle)) return; - if (startLine < 0 || startLine + lineCount > content.getLineCount()) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - - renderer.setLineJustify(startLine, lineCount, justify); - resetCache(startLine, lineCount); - redrawLines(startLine, lineCount, false); - int caretLine = getCaretLine(); - if (startLine <= caretLine && caretLine < startLine + lineCount) { - setCaretLocation(); - } -} -/** - * Sets the line spacing of the widget. The line spacing applies for all lines. - * - * @param lineSpacing the line spacing - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @since 3.2 - */ -public void setLineSpacing(int lineSpacing) { - checkWidget(); - if (this.lineSpacing == lineSpacing || lineSpacing < 0) return; - this.lineSpacing = lineSpacing; - setVariableLineHeight(); - resetCache(0, content.getLineCount()); - setCaretLocation(); - super.redraw(); -} -/** - * Sets the color of the margins. - * - * @param color the new color (or null) - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT - if the argument has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public void setMarginColor(Color color) { - checkWidget(); - if (color != null && color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - marginColor = color; - super.redraw(); -} -/** - * Sets the margins. - * - * @param leftMargin the left margin. - * @param topMargin the top margin. - * @param rightMargin the right margin. - * @param bottomMargin the bottom margin. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public void setMargins (int leftMargin, int topMargin, int rightMargin, int bottomMargin) { - checkWidget(); - this.leftMargin = Math.max(0, leftMargin); - this.topMargin = Math.max(0, topMargin); - this.rightMargin = Math.max(0, rightMargin); - this.bottomMargin = Math.max(0, bottomMargin); - resetCache(0, content.getLineCount()); - setScrollBars(true); - setCaretLocation(); - setAlignment(); - super.redraw(); -} -/** - * Flips selection anchor based on word selection direction. - */ -void setMouseWordSelectionAnchor() { - if (clickCount > 1) { - if (caretOffset < doubleClickSelection.x) { - selectionAnchor = doubleClickSelection.y; - } else if (caretOffset > doubleClickSelection.y) { - selectionAnchor = doubleClickSelection.x; - } - } -} -/** - * Sets the orientation of the receiver, which must be one - * of the constants SWT.LEFT_TO_RIGHT or SWT.RIGHT_TO_LEFT. - * - * @param orientation new orientation style - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 2.1.2 - */ -public void setOrientation(int orientation) { - if ((orientation & (SWT.RIGHT_TO_LEFT | SWT.LEFT_TO_RIGHT)) == 0) { - return; - } - if ((orientation & SWT.RIGHT_TO_LEFT) != 0 && (orientation & SWT.LEFT_TO_RIGHT) != 0) { - return; - } - if ((orientation & SWT.RIGHT_TO_LEFT) != 0 && isMirrored()) { - return; - } - if ((orientation & SWT.LEFT_TO_RIGHT) != 0 && !isMirrored()) { - return; - } - if (!BidiUtil.setOrientation(this, orientation)) { - return; - } - isMirrored = (orientation & SWT.RIGHT_TO_LEFT) != 0; - caretDirection = SWT.NULL; - resetCache(0, content.getLineCount()); - setCaretLocation(); - keyActionMap.clear(); - createKeyBindings(); - super.redraw(); -} -/** - * Sets the right margin. - * - * @param rightMargin the right margin. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public void setRightMargin (int rightMargin) { - checkWidget(); - setMargins(leftMargin, topMargin, rightMargin, bottomMargin); -} -/** - * Adjusts the maximum and the page size of the scroll bars to - * reflect content width/length changes. - * - * @param vertical indicates if the vertical scrollbar also needs to be set - */ -void setScrollBars(boolean vertical) { - int inactive = 1; - if (vertical || !isFixedLineHeight()) { - ScrollBar verticalBar = getVerticalBar(); - if (verticalBar != null) { - int maximum = renderer.getHeight(); - // only set the real values if the scroll bar can be used - // (ie. because the thumb size is less than the scroll maximum) - // avoids flashing on Motif, fixes 1G7RE1J and 1G5SE92 - if (clientAreaHeight < maximum) { - verticalBar.setMaximum(maximum - topMargin - bottomMargin); - verticalBar.setThumb(clientAreaHeight - topMargin - bottomMargin); - verticalBar.setPageIncrement(clientAreaHeight - topMargin - bottomMargin); - } else if (verticalBar.getThumb() != inactive || verticalBar.getMaximum() != inactive) { - verticalBar.setValues( - verticalBar.getSelection(), - verticalBar.getMinimum(), - inactive, - inactive, - verticalBar.getIncrement(), - inactive); - } - } - } - ScrollBar horizontalBar = getHorizontalBar(); - if (horizontalBar != null && horizontalBar.getVisible()) { - int maximum = renderer.getWidth(); - // only set the real values if the scroll bar can be used - // (ie. because the thumb size is less than the scroll maximum) - // avoids flashing on Motif, fixes 1G7RE1J and 1G5SE92 - if (clientAreaWidth < maximum) { - horizontalBar.setMaximum(maximum - leftMargin - rightMargin); - horizontalBar.setThumb(clientAreaWidth - leftMargin - rightMargin); - horizontalBar.setPageIncrement(clientAreaWidth - leftMargin - rightMargin); - } else if (horizontalBar.getThumb() != inactive || horizontalBar.getMaximum() != inactive) { - horizontalBar.setValues( - horizontalBar.getSelection(), - horizontalBar.getMinimum(), - inactive, - inactive, - horizontalBar.getIncrement(), - inactive); - } - } -} -/** - * Sets the selection to the given position and scrolls it into view. Equivalent to setSelection(start,start). - * - * @param start new caret position - * @see #setSelection(int,int) - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when either the start or the end of the selection range is inside a - * multi byte line delimiter (and thus neither clearly in front of or after the line delimiter) - *
    - */ -public void setSelection(int start) { - // checkWidget test done in setSelectionRange - setSelection(start, start); -} -/** - * Sets the selection and scrolls it into view. - *

    - * Indexing is zero based. Text selections are specified in terms of - * caret positions. In a text widget that contains N characters, there are - * N+1 caret positions, ranging from 0..N - *

    - * - * @param point x=selection start offset, y=selection end offset - * The caret will be placed at the selection start when x > y. - * @see #setSelection(int,int) - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when point is null
    • - *
    • ERROR_INVALID_ARGUMENT when either the start or the end of the selection range is inside a - * multi byte line delimiter (and thus neither clearly in front of or after the line delimiter) - *
    - */ -public void setSelection(Point point) { - checkWidget(); - if (point == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - setSelection(point.x, point.y); -} -/** - * Sets the receiver's selection background color to the color specified - * by the argument, or to the default system color for the control - * if the argument is null. - * - * @param color the new color (or null) - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT - if the argument has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @since 2.1 - */ -public void setSelectionBackground (Color color) { - checkWidget (); - if (color != null) { - if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - selectionBackground = color; - resetCache(0, content.getLineCount()); - setCaretLocation(); - super.redraw(); -} -/** - * Sets the receiver's selection foreground color to the color specified - * by the argument, or to the default system color for the control - * if the argument is null. - *

    - * Note that this is a HINT. Some platforms do not allow the application - * to change the selection foreground color. - *

    - * @param color the new color (or null) - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT - if the argument has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @since 2.1 - */ -public void setSelectionForeground (Color color) { - checkWidget (); - if (color != null) { - if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - selectionForeground = color; - resetCache(0, content.getLineCount()); - setCaretLocation(); - super.redraw(); -} -/** - * Sets the selection and scrolls it into view. - *

    - * Indexing is zero based. Text selections are specified in terms of - * caret positions. In a text widget that contains N characters, there are - * N+1 caret positions, ranging from 0..N - *

    - * - * @param start selection start offset. The caret will be placed at the - * selection start when start > end. - * @param end selection end offset - * @see #setSelectionRange(int,int) - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when either the start or the end of the selection range is inside a - * multi byte line delimiter (and thus neither clearly in front of or after the line delimiter) - *
    - */ -public void setSelection(int start, int end) { - setSelectionRange(start, end - start); - showSelection(); -} -/** - * Sets the selection. - *

    - * The new selection may not be visible. Call showSelection to scroll - * the selection into view. - *

    - * - * @param start offset of the first selected character, start >= 0 must be true. - * @param length number of characters to select, 0 <= start + length - * <= getCharCount() must be true. - * A negative length places the caret at the selection start. - * @param sendEvent a Selection event is sent when set to true and when - * the selection is reset. - */ -void setSelection(int start, int length, boolean sendEvent, boolean doBlock) { - int end = start + length; - if (start > end) { - int temp = end; - end = start; - start = temp; - } - // is the selection range different or is the selection direction - // different? - if (selection.x != start || selection.y != end || - (length > 0 && selectionAnchor != selection.x) || - (length < 0 && selectionAnchor != selection.y)) { - if (blockSelection && doBlock) { - setBlockSelectionOffset(start, end, sendEvent); - } else { - clearSelection(sendEvent); - if (length < 0) { - selectionAnchor = selection.y = end; - selection.x = start; - setCaretOffset(start, PREVIOUS_OFFSET_TRAILING); - } else { - selectionAnchor = selection.x = start; - selection.y = end; - setCaretOffset(end, PREVIOUS_OFFSET_TRAILING); - } - internalRedrawRange(selection.x, selection.y - selection.x); - } - } -} -/** - * Sets the selection. - *

    - * The new selection may not be visible. Call showSelection to scroll the selection - * into view. A negative length places the caret at the visual start of the selection. - *

    - * - * @param start offset of the first selected character - * @param length number of characters to select - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT when either the start or the end of the selection range is inside a - * multi byte line delimiter (and thus neither clearly in front of or after the line delimiter) - *
    - */ -public void setSelectionRange(int start, int length) { - checkWidget(); - int contentLength = getCharCount(); - start = Math.max(0, Math.min (start, contentLength)); - int end = start + length; - if (end < 0) { - length = -start; - } else { - if (end > contentLength) length = contentLength - start; - } - if (isLineDelimiter(start) || isLineDelimiter(start + length)) { - // the start offset or end offset of the selection range is inside a - // multi byte line delimiter. This is an illegal operation and an exception - // is thrown. Fixes 1GDKK3R - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - setSelection(start, length, false, true); - setCaretLocation(); -} -/** - * Adds the specified style. - *

    - * The new style overwrites existing styles for the specified range. - * Existing style ranges are adjusted if they partially overlap with - * the new style. To clear an individual style, call setStyleRange - * with a StyleRange that has null attributes. - *

    - * Should not be called if a LineStyleListener has been set since the - * listener maintains the styles. - *

    - * - * @param range StyleRange object containing the style information. - * Overwrites the old style in the given range. May be null to delete - * all styles. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_RANGE when the style range is outside the valid range (> getCharCount())
    • - *
    - */ -public void setStyleRange(StyleRange range) { - checkWidget(); - if (isListening(LineGetStyle)) return; - if (range != null) { - if (range.isUnstyled()) { - setStyleRanges(range.start, range.length, null, null, false); - } else { - setStyleRanges(range.start, 0, null, new StyleRange[]{range}, false); - } - } else { - setStyleRanges(0, 0, null, null, true); - } -} -/** - * Clears the styles in the range specified by start and - * length and adds the new styles. - *

    - * The ranges array contains start and length pairs. Each pair refers to - * the corresponding style in the styles array. For example, the pair - * that starts at ranges[n] with length ranges[n+1] uses the style - * at styles[n/2]. The range fields within each StyleRange are ignored. - * If ranges or styles is null, the specified range is cleared. - *

    - * Note: It is expected that the same instance of a StyleRange will occur - * multiple times within the styles array, reducing memory usage. - *

    - * Should not be called if a LineStyleListener has been set since the - * listener maintains the styles. - *

    - * - * @param start offset of first character where styles will be deleted - * @param length length of the range to delete styles in - * @param ranges the array of ranges. The ranges must not overlap and must be in order. - * @param styles the array of StyleRanges. The range fields within the StyleRange are unused. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when an element in the styles array is null
    • - *
    • ERROR_INVALID_RANGE when the number of ranges and style do not match (ranges.length * 2 == styles.length)
    • - *
    • ERROR_INVALID_RANGE when a range is outside the valid range (> getCharCount() or less than zero)
    • - *
    • ERROR_INVALID_RANGE when a range overlaps
    • - *
    - * - * @since 3.2 - */ -public void setStyleRanges(int start, int length, int[] ranges, StyleRange[] styles) { - checkWidget(); - if (isListening(LineGetStyle)) return; - if (ranges == null || styles == null) { - setStyleRanges(start, length, null, null, false); - } else { - setStyleRanges(start, length, ranges, styles, false); - } -} -/** - * Sets styles to be used for rendering the widget content. - *

    - * All styles in the widget will be replaced with the given set of ranges and styles. - * The ranges array contains start and length pairs. Each pair refers to - * the corresponding style in the styles array. For example, the pair - * that starts at ranges[n] with length ranges[n+1] uses the style - * at styles[n/2]. The range fields within each StyleRange are ignored. - * If either argument is null, the styles are cleared. - *

    - * Note: It is expected that the same instance of a StyleRange will occur - * multiple times within the styles array, reducing memory usage. - *

    - * Should not be called if a LineStyleListener has been set since the - * listener maintains the styles. - *

    - * - * @param ranges the array of ranges. The ranges must not overlap and must be in order. - * @param styles the array of StyleRanges. The range fields within the StyleRange are unused. - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when an element in the styles array is null
    • - *
    • ERROR_INVALID_RANGE when the number of ranges and style do not match (ranges.length * 2 == styles.length)
    • - *
    • ERROR_INVALID_RANGE when a range is outside the valid range (> getCharCount() or less than zero)
    • - *
    • ERROR_INVALID_RANGE when a range overlaps
    • - *
    - * - * @since 3.2 - */ -public void setStyleRanges(int[] ranges, StyleRange[] styles) { - checkWidget(); - if (isListening(LineGetStyle)) return; - if (ranges == null || styles == null) { - setStyleRanges(0, 0, null, null, true); - } else { - setStyleRanges(0, 0, ranges, styles, true); - } -} -void setStyleRanges(int start, int length, int[] ranges, StyleRange[] styles, boolean reset) { - int charCount = content.getCharCount(); - int end = start + length; - if (start > end || start < 0) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - if (styles != null) { - if (end > charCount) { - SWT.error(SWT.ERROR_INVALID_RANGE); - } - if (ranges != null) { - if (ranges.length != styles.length << 1) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - int lastOffset = 0; - boolean variableHeight = false; - for (int i = 0; i < styles.length; i ++) { - if (styles[i] == null) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - int rangeStart, rangeLength; - if (ranges != null) { - rangeStart = ranges[i << 1]; - rangeLength = ranges[(i << 1) + 1]; - } else { - rangeStart = styles[i].start; - rangeLength = styles[i].length; - } - if (rangeLength < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (!(0 <= rangeStart && rangeStart + rangeLength <= charCount)) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (lastOffset > rangeStart) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - variableHeight |= styles[i].isVariableHeight(); - lastOffset = rangeStart + rangeLength; - } - if (variableHeight) setVariableLineHeight(); - } - int rangeStart = start, rangeEnd = end; - if (styles != null && styles.length > 0) { - if (ranges != null) { - rangeStart = ranges[0]; - rangeEnd = ranges[ranges.length - 2] + ranges[ranges.length - 1]; - } else { - rangeStart = styles[0].start; - rangeEnd = styles[styles.length - 1].start + styles[styles.length - 1].length; - } - } - int expectedBottom = 0; - if (!isFixedLineHeight() && !reset) { - int lineEnd = content.getLineAtOffset(Math.max(end, rangeEnd)); - int partialTopIndex = getPartialTopIndex(); - int partialBottomIndex = getPartialBottomIndex(); - if (partialTopIndex <= lineEnd && lineEnd <= partialBottomIndex) { - expectedBottom = getLinePixel(lineEnd + 1); - } - } - if (reset) { - renderer.setStyleRanges(null, null); - } else { - renderer.updateRanges(start, length, length); - } - if (styles != null && styles.length > 0) { - renderer.setStyleRanges(ranges, styles); - } - if (reset) { - resetCache(0, content.getLineCount()); - super.redraw(); - } else { - int lineStart = content.getLineAtOffset(Math.min(start, rangeStart)); - int lineEnd = content.getLineAtOffset(Math.max(end, rangeEnd)); - resetCache(lineStart, lineEnd - lineStart + 1); - int partialTopIndex = getPartialTopIndex(); - int partialBottomIndex = getPartialBottomIndex(); - if (!(lineStart > partialBottomIndex || lineEnd < partialTopIndex)) { - int top = 0; - int bottom = clientAreaHeight; - if (partialTopIndex <= lineStart && lineStart <= partialBottomIndex) { - top = Math.max(0, getLinePixel(lineStart)); - } - if (partialTopIndex <= lineEnd && lineEnd <= partialBottomIndex) { - bottom = getLinePixel(lineEnd + 1); - } - if (!isFixedLineHeight() && bottom != expectedBottom) { - bottom = clientAreaHeight; - } - super.redraw(0, top, clientAreaWidth, bottom - top, false); - } - } - setCaretLocation(); - doMouseLinkCursor(); -} -/** - * Sets styles to be used for rendering the widget content. All styles - * in the widget will be replaced with the given set of styles. - *

    - * Note: Because a StyleRange includes the start and length, the - * same instance cannot occur multiple times in the array of styles. - * If the same style attributes, such as font and color, occur in - * multiple StyleRanges, setStyleRanges(int[], StyleRange[]) - * can be used to share styles and reduce memory usage. - *

    - * Should not be called if a LineStyleListener has been set since the - * listener maintains the styles. - *

    - * - * @param ranges StyleRange objects containing the style information. - * The ranges should not overlap. The style rendering is undefined if - * the ranges do overlap. Must not be null. The styles need to be in order. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when the list of ranges is null
    • - *
    • ERROR_INVALID_RANGE when the last of the style ranges is outside the valid range (> getCharCount())
    • - *
    - * - * @see #setStyleRanges(int[], StyleRange[]) - */ -public void setStyleRanges(StyleRange[] ranges) { - checkWidget(); - if (isListening(LineGetStyle)) return; - if (ranges == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - setStyleRanges(0, 0, null, ranges, true); -} -/** - * Sets the tab width. - * - * @param tabs tab width measured in characters. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setTabs(int tabs) { - checkWidget(); - tabLength = tabs; - renderer.setFont(null, tabs); - resetCache(0, content.getLineCount()); - setCaretLocation(); - super.redraw(); -} -/** - * Sets the widget content. - * If the widget has the SWT.SINGLE style and "text" contains more than - * one line, only the first line is rendered but the text is stored - * unchanged. A subsequent call to getText will return the same text - * that was set. - *

    - * Note: Only a single line of text should be set when the SWT.SINGLE - * style is used. - *

    - * - * @param text new widget content. Replaces existing content. Line styles - * that were set using StyledText API are discarded. The - * current selection is also discarded. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT when string is null
    • - *
    - */ -public void setText(String text) { - checkWidget(); - if (text == null) { - SWT.error(SWT.ERROR_NULL_ARGUMENT); - } - Event event = new Event(); - event.start = 0; - event.end = getCharCount(); - event.text = text; - event.doit = true; - notifyListeners(SWT.Verify, event); - if (event.doit) { - StyledTextEvent styledTextEvent = null; - if (isListening(ExtendedModify)) { - styledTextEvent = new StyledTextEvent(content); - styledTextEvent.start = event.start; - styledTextEvent.end = event.start + event.text.length(); - styledTextEvent.text = content.getTextRange(event.start, event.end - event.start); - } - content.setText(event.text); - notifyListeners(SWT.Modify, event); - if (styledTextEvent != null) { - notifyListeners(ExtendedModify, styledTextEvent); - } - } -} -/** - * Sets the text limit to the specified number of characters. - *

    - * The text limit specifies the amount of text that - * the user can type into the widget. - *

    - * - * @param limit the new text limit. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @exception IllegalArgumentException
      - *
    • ERROR_CANNOT_BE_ZERO when limit is 0
    • - *
    - */ -public void setTextLimit(int limit) { - checkWidget(); - if (limit == 0) { - SWT.error(SWT.ERROR_CANNOT_BE_ZERO); - } - textLimit = limit; -} -/** - * Sets the top index. Do nothing if there is no text set. - *

    - * The top index is the index of the line that is currently at the top - * of the widget. The top index changes when the widget is scrolled. - * Indexing starts from zero. - * Note: The top index is reset to 0 when new text is set in the widget. - *

    - * - * @param topIndex new top index. Must be between 0 and - * getLineCount() - fully visible lines per page. If no lines are fully - * visible the maximum value is getLineCount() - 1. An out of range - * index will be adjusted accordingly. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setTopIndex(int topIndex) { - checkWidget(); - if (getCharCount() == 0) { - return; - } - int lineCount = content.getLineCount(), pixel; - if (isFixedLineHeight()) { - int pageSize = Math.max(1, Math.min(lineCount, getLineCountWhole())); - if (topIndex < 0) { - topIndex = 0; - } else if (topIndex > lineCount - pageSize) { - topIndex = lineCount - pageSize; - } - pixel = getLinePixel(topIndex); - } else { - topIndex = Math.max(0, Math.min(lineCount - 1, topIndex)); - pixel = getLinePixel(topIndex); - if (pixel > 0) { - pixel = getAvailableHeightBellow(pixel); - } else { - pixel = getAvailableHeightAbove(pixel); - } - } - scrollVertical(pixel, true); -} -/** - * Sets the top margin. - * - * @param topMargin the top margin. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.5 - */ -public void setTopMargin (int topMargin) { - checkWidget(); - setMargins(leftMargin, topMargin, rightMargin, bottomMargin); -} -/** - * Sets the top pixel offset. Do nothing if there is no text set. - *

    - * The top pixel offset is the vertical pixel offset of the widget. The - * widget is scrolled so that the given pixel position is at the top. - * The top index is adjusted to the corresponding top line. - * Note: The top pixel is reset to 0 when new text is set in the widget. - *

    - * - * @param pixel new top pixel offset. Must be between 0 and - * (getLineCount() - visible lines per page) / getLineHeight()). An out - * of range offset will be adjusted accordingly. - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * @since 2.0 - */ -public void setTopPixel(int pixel) { - checkWidget(); - if (getCharCount() == 0) { - return; - } - if (pixel < 0) pixel = 0; - int lineCount = content.getLineCount(); - int height = clientAreaHeight - topMargin - bottomMargin; - int verticalOffset = getVerticalScrollOffset(); - if (isFixedLineHeight()) { - int maxTopPixel = Math.max(0, lineCount * getVerticalIncrement() - height); - if (pixel > maxTopPixel) pixel = maxTopPixel; - pixel -= verticalOffset; - } else { - pixel -= verticalOffset; - if (pixel > 0) { - pixel = getAvailableHeightBellow(pixel); - } - } - scrollVertical(pixel, true); -} -/** - * Sets whether the widget wraps lines. - *

    - * This overrides the creation style bit SWT.WRAP. - *

    - * - * @param wrap true=widget wraps lines, false=widget does not wrap lines - * @since 2.0 - */ -public void setWordWrap(boolean wrap) { - checkWidget(); - if ((getStyle() & SWT.SINGLE) != 0) return; - if (wordWrap == wrap) return; - if (wordWrap && blockSelection) setBlockSelection(false); - wordWrap = wrap; - setVariableLineHeight(); - resetCache(0, content.getLineCount()); - horizontalScrollOffset = 0; - ScrollBar horizontalBar = getHorizontalBar(); - if (horizontalBar != null) { - horizontalBar.setVisible(!wordWrap); - } - setScrollBars(true); - setCaretLocation(); - super.redraw(); -} -boolean showLocation(Rectangle rect, boolean scrollPage) { - boolean scrolled = false; - if (rect.y < topMargin) { - scrolled = scrollVertical(rect.y - topMargin, true); - } else if (rect.y + rect.height > clientAreaHeight - bottomMargin) { - if (clientAreaHeight - topMargin - bottomMargin <= 0) { - scrolled = scrollVertical(rect.y - topMargin, true); - } else { - scrolled = scrollVertical(rect.y + rect.height - (clientAreaHeight - bottomMargin), true); - } - } - int width = clientAreaWidth - rightMargin - leftMargin; - if (width > 0) { - int minScroll = scrollPage ? width / 4 : 0; - if (rect.x < leftMargin) { - int scrollWidth = Math.max(leftMargin - rect.x, minScroll); - int maxScroll = horizontalScrollOffset; - scrolled = scrollHorizontal(-Math.min(maxScroll, scrollWidth), true); - } else if (rect.x + rect.width > (clientAreaWidth - rightMargin)) { - int scrollWidth = Math.max(rect.x + rect.width - (clientAreaWidth - rightMargin), minScroll); - int maxScroll = renderer.getWidth() - horizontalScrollOffset - clientAreaWidth; - scrolled = scrollHorizontal(Math.min(maxScroll, scrollWidth), true); - } - } - return scrolled; -} -/** - * Sets the caret location and scrolls the caret offset into view. - */ -void showCaret() { - Rectangle bounds = getBoundsAtOffset(caretOffset); - if (!showLocation(bounds, true)) { - setCaretLocation(); - } -} -/** - * Scrolls the selection into view. - *

    - * The end of the selection will be scrolled into view. - * Note that if a right-to-left selection exists, the end of the selection is - * the visual beginning of the selection (i.e., where the caret is located). - *

    - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void showSelection() { - checkWidget(); - // is selection from right-to-left? - boolean rightToLeft = caretOffset == selection.x; - int startOffset, endOffset; - if (rightToLeft) { - startOffset = selection.y; - endOffset = selection.x; - } else { - startOffset = selection.x; - endOffset = selection.y; - } - - Rectangle startBounds = getBoundsAtOffset(startOffset); - Rectangle endBounds = getBoundsAtOffset(endOffset); - - // can the selection be fully displayed within the widget's visible width? - int w = clientAreaWidth - leftMargin - rightMargin; - boolean selectionFits = rightToLeft ? startBounds.x - endBounds.x <= w : endBounds.x - startBounds.x <= w; - if (selectionFits) { - // show as much of the selection as possible by first showing - // the start of the selection - if (showLocation(startBounds, false)) { - // endX value could change if showing startX caused a scroll to occur - endBounds = getBoundsAtOffset(endOffset); - } - // the character at endOffset is not part of the selection - endBounds.width = endOffset == caretOffset ? getCaretWidth() : 0; - showLocation(endBounds, false); - } else { - // just show the end of the selection since the selection start - // will not be visible - showLocation(endBounds, true); - } -} -void updateCaretVisibility() { - Caret caret = getCaret(); - if (caret != null) { - if (blockSelection && blockXLocation != -1) { - caret.setVisible(false); - } else { - Point location = caret.getLocation(); - Point size = caret.getSize(); - boolean visible = - topMargin <= location.y + size.y && location.y <= clientAreaHeight - bottomMargin && - leftMargin <= location.x + size.x && location.x <= clientAreaWidth - rightMargin; - caret.setVisible(visible); - } - } -} -/** - * Updates the selection and caret position depending on the text change. - *

    - * If the selection intersects with the replaced text, the selection is - * reset and the caret moved to the end of the new text. - * If the selection is behind the replaced text it is moved so that the - * same text remains selected. If the selection is before the replaced text - * it is left unchanged. - *

    - * - * @param startOffset offset of the text change - * @param replacedLength length of text being replaced - * @param newLength length of new text - */ -void updateSelection(int startOffset, int replacedLength, int newLength) { - if (selection.y <= startOffset) { - // selection ends before text change - if (wordWrap) setCaretLocation(); - return; - } - if (selection.x < startOffset) { - // clear selection fragment before text change - internalRedrawRange(selection.x, startOffset - selection.x); - } - if (selection.y > startOffset + replacedLength && selection.x < startOffset + replacedLength) { - // clear selection fragment after text change. - // do this only when the selection is actually affected by the - // change. Selection is only affected if it intersects the change (1GDY217). - int netNewLength = newLength - replacedLength; - int redrawStart = startOffset + newLength; - internalRedrawRange(redrawStart, selection.y + netNewLength - redrawStart); - } - if (selection.y > startOffset && selection.x < startOffset + replacedLength) { - // selection intersects replaced text. set caret behind text change - setSelection(startOffset + newLength, 0, true, false); - } else { - // move selection to keep same text selected - setSelection(selection.x + newLength - replacedLength, selection.y - selection.x, true, false); - } - setCaretLocation(); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextContent.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextContent.java deleted file mode 100755 index 0e6728cf34..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextContent.java +++ /dev/null @@ -1,207 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -/** - * Clients may implement the StyledTextContent interface to provide a - * custom store for the StyledText widget content. The StyledText widget - * interacts with its StyledTextContent in order to access and update - * the text that is being displayed and edited in the widget. - * A custom content implementation can be set in the widget using the - * StyledText.setContent API. - */ -public interface StyledTextContent { - -/** - * Called by StyledText to add itself as an Observer to content changes. - * See TextChangeListener for a description of the listener methods that - * are called when text changes occur. - *

    - * - * @param listener the listener - * @exception IllegalArgumentException

      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void addTextChangeListener(TextChangeListener listener); - -/** - * Return the number of characters in the content. - *

    - * - * @return the number of characters in the content. - */ -public int getCharCount(); - -/** - * Return the line at the given line index without delimiters. - *

    - * - * @param lineIndex index of the line to return. Does not include - * delimiters of preceding lines. Index 0 is the first line of the - * content. - * @return the line text without delimiters - */ -public String getLine(int lineIndex); - -/** - * Return the line index at the given character offset. - *

    - * - * @param offset offset of the line to return. The first character of the - * document is at offset 0. An offset of getLength() is valid and should - * answer the number of lines. - * @return the line index. The first line is at index 0. If the character - * at offset is a delimiter character, answer the line index of the line - * that is delimited. - * For example, if text = "\r\n\r\n", and delimiter = "\r\n", then: - *

      - *
    • getLineAtOffset(0) == 0 - *
    • getLineAtOffset(1) == 0 - *
    • getLineAtOffset(2) == 1 - *
    • getLineAtOffset(3) == 1 - *
    • getLineAtOffset(4) == 2 - *
    - */ -public int getLineAtOffset(int offset); - -/** - * Return the number of lines. Should answer 1 when no text is specified. - * The StyledText widget relies on this behavior for drawing the cursor. - *

    - * - * @return the number of lines. For example: - *

      - *
    • text value ==> getLineCount - *
    • null ==> 1 - *
    • "" ==> 1 - *
    • "a\n" ==> 2 - *
    • "\n\n" ==> 3 - *
    - */ -public int getLineCount(); - -/** - * Return the line delimiter that should be used by the StyledText - * widget when inserting new lines. New lines entered using key strokes - * and paste operations use this line delimiter. - * Implementors may use System.getProperty("line.separator") to return - * the platform line delimiter. - *

    - * - * @return the line delimiter that should be used by the StyledText widget - * when inserting new lines. - */ -public String getLineDelimiter(); - -/** - * Return the character offset of the first character of the given line. - *

    - * NOTE: When there is no text (i.e., no lines), getOffsetAtLine(0) - * is a valid call that should return 0. - *

    - * - * @param lineIndex index of the line. The first line is at index 0. - * @return offset offset of the first character of the line. The first - * character of the document is at offset 0. The return value should - * include line delimiters. - * For example, if text = "\r\ntest\r\n" and delimiter = "\r\n", then: - *
      - *
    • getOffsetAtLine(0) == 0 - *
    • getOffsetAtLine(1) == 2 - *
    • getOffsetAtLine(2) == 8 - *
    - */ -public int getOffsetAtLine(int lineIndex); - -/** - * Returns a string representing the content at the given range. - *

    - * - * @param start the start offset of the text to return. Offset 0 is the - * first character of the document. - * @param length the length of the text to return - * @return the text at the given range - */ -public String getTextRange(int start, int length); - -/** - * Remove the specified text changed listener. - *

    - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException

      - *
    • ERROR_NULL_ARGUMENT when listener is null
    • - *
    - */ -public void removeTextChangeListener(TextChangeListener listener); - -/** - * Replace the text with "newText" starting at position "start" - * for a length of "replaceLength". - *

    - * Implementors have to notify the TextChangeListeners that were added - * using addTextChangeListener before and after the content - * is changed. A TextChangingEvent has to be sent to the - * textChanging method before the content is changed and a - * TextChangedEvent has to be sent to the textChanged method - * after the content has changed. - * The text change that occurs after the TextChangingEvent - * has been sent has to be consistent with the data provided in the - * TextChangingEvent. - * This data will be cached by the widget and will be used when the - * TextChangedEvent is received. - *

    - * The TextChangingEvent should be set as follows: - *

      - *
    • event.start = start of the replaced text - *
    • event.newText = text that is going to be inserted or empty String - * if no text will be inserted - *
    • event.replaceCharCount = length of text that is going to be replaced - *
    • event.newCharCount = length of text that is going to be inserted - *
    • event.replaceLineCount = number of lines that are going to be replaced - *
    • event.newLineCount = number of new lines that are going to be inserted - *
    - * NOTE: newLineCount is the number of inserted lines and replaceLineCount - * is the number of deleted lines based on the change that occurs visually. - * For example: - *
      - *
    • (replaceText, newText) ==> (replaceLineCount, newLineCount) - *
    • ("", "\n") ==> (0, 1) - *
    • ("\n\n", "a") ==> (2, 0) - *
    • ("a", "\n\n") ==> (0, 2) - *
    • ("\n", "") ==> (1, 0) - *
    - *

    - * - * @param start start offset of text to replace, none of the offsets include - * delimiters of preceding lines, offset 0 is the first character of the - * document - * @param replaceLength length of text to replace - * @param text text to replace - * @see TextChangeListener - */ -public void replaceTextRange(int start, int replaceLength, String text); - -/** - * Set text to "text". - * Implementors have to send a TextChangedEvent to the - * textSet method of the TextChangeListeners that were added using - * addTextChangeListener. - *

    - * - * @param text the new text - * @see TextChangeListener - */ -public void setText(String text); -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextDropTargetEffect.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextDropTargetEffect.java deleted file mode 100644 index ba6c2ff230..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextDropTargetEffect.java +++ /dev/null @@ -1,242 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.dnd.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * This adapter class provides a default drag under effect (eg. select and scroll) - * when a drag occurs over a StyledText. - * - *

    Classes that wish to provide their own drag under effect for a StyledText - * can extend this class, override the StyledTextDropTargetEffect.dragOver - * method and override any other applicable methods in StyledTextDropTargetEffect to - * display their own drag under effect.

    - * - * Subclasses that override any methods of this class should call the corresponding - * super method to get the default drag under effect implementation. - * - *

    The feedback value is either one of the FEEDBACK constants defined in - * class DND which is applicable to instances of this class, - * or it must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those DND effect constants. - *

    - *

    - *

    - *
    Feedback:
    - *
    FEEDBACK_SELECT, FEEDBACK_SCROLL
    - *
    - *

    - * - * @see DropTargetAdapter - * @see DropTargetEvent - * @see Sample code and further information - * - * @since 3.3 - */ -public class StyledTextDropTargetEffect extends DropTargetEffect { - static final int CARET_WIDTH = 2; - static final int SCROLL_HYSTERESIS = 100; // milli seconds - static final int SCROLL_TOLERANCE = 20; // pixels - - int currentOffset = -1; - long scrollBeginTime; - int scrollX = -1, scrollY = -1; - Listener paintListener; - - /** - * Creates a new StyledTextDropTargetEffect to handle the drag under effect on the specified - * StyledText. - * - * @param styledText the StyledText over which the user positions the cursor to drop the data - */ - public StyledTextDropTargetEffect(StyledText styledText) { - super(styledText); - paintListener = new Listener () { - public void handleEvent (Event event) { - if (currentOffset != -1) { - StyledText text = (StyledText) getControl(); - Point position = text.getLocationAtOffset(currentOffset); - int height = text.getLineHeight(currentOffset); - event.gc.setBackground(event.display.getSystemColor (SWT.COLOR_BLACK)); - event.gc.fillRectangle(position.x, position.y, CARET_WIDTH, height); - } - } - }; - } - - /** - * This implementation of dragEnter provides a default drag under effect - * for the feedback specified in event.feedback. - * - * For additional information see DropTargetAdapter.dragEnter. - * - * Subclasses that override this method should call super.dragEnter(event) - * to get the default drag under effect implementation. - * - * @param event the information associated with the drag start event - * - * @see DropTargetAdapter - * @see DropTargetEvent - */ - public void dragEnter(DropTargetEvent event) { - currentOffset = -1; - scrollBeginTime = 0; - scrollX = -1; - scrollY = -1; - getControl().removeListener(SWT.Paint, paintListener); - getControl().addListener (SWT.Paint, paintListener); - } - - /** - * This implementation of dragLeave provides a default drag under effect - * for the feedback specified in event.feedback. - * - * For additional information see DropTargetAdapter.dragLeave. - * - * Subclasses that override this method should call super.dragLeave(event) - * to get the default drag under effect implementation. - * - * @param event the information associated with the drag leave event - * - * @see DropTargetAdapter - * @see DropTargetEvent - */ - public void dragLeave(DropTargetEvent event) { - StyledText text = (StyledText) getControl(); - if (currentOffset != -1) { - refreshCaret(text, currentOffset, -1); - } - text.removeListener(SWT.Paint, paintListener); - scrollBeginTime = 0; - scrollX = -1; - scrollY = -1; - } - - /** - * This implementation of dragOver provides a default drag under effect - * for the feedback specified in event.feedback. - * - * For additional information see DropTargetAdapter.dragOver. - * - * Subclasses that override this method should call super.dragOver(event) - * to get the default drag under effect implementation. - * - * @param event the information associated with the drag over event - * - * @see DropTargetAdapter - * @see DropTargetEvent - * @see DND#FEEDBACK_SELECT - * @see DND#FEEDBACK_SCROLL - */ - public void dragOver(DropTargetEvent event) { - int effect = event.feedback; - StyledText text = (StyledText) getControl(); - - Point pt = text.getDisplay().map(null, text, event.x, event.y); - if ((effect & DND.FEEDBACK_SCROLL) == 0) { - scrollBeginTime = 0; - scrollX = scrollY = -1; - } else { - if (text.getCharCount() == 0) { - scrollBeginTime = 0; - scrollX = scrollY = -1; - } else { - if (scrollX != -1 && scrollY != -1 && scrollBeginTime != 0 && - (pt.x >= scrollX && pt.x <= (scrollX + SCROLL_TOLERANCE) || - pt.y >= scrollY && pt.y <= (scrollY + SCROLL_TOLERANCE))) { - if (System.currentTimeMillis() >= scrollBeginTime) { - Rectangle area = text.getClientArea(); - GC gc = new GC(text); - FontMetrics fm = gc.getFontMetrics(); - gc.dispose(); - int charWidth = fm.getAverageCharWidth(); - int scrollAmount = 10*charWidth; - if (pt.x < area.x + 3*charWidth) { - int leftPixel = text.getHorizontalPixel(); - text.setHorizontalPixel(leftPixel - scrollAmount); - } - if (pt.x > area.width - 3*charWidth) { - int leftPixel = text.getHorizontalPixel(); - text.setHorizontalPixel(leftPixel + scrollAmount); - } - int lineHeight = text.getLineHeight(); - if (pt.y < area.y + lineHeight) { - int topPixel = text.getTopPixel(); - text.setTopPixel(topPixel - lineHeight); - } - if (pt.y > area.height - lineHeight) { - int topPixel = text.getTopPixel(); - text.setTopPixel(topPixel + lineHeight); - } - scrollBeginTime = 0; - scrollX = scrollY = -1; - } - } else { - scrollBeginTime = System.currentTimeMillis() + SCROLL_HYSTERESIS; - scrollX = pt.x; - scrollY = pt.y; - } - } - } - - if ((effect & DND.FEEDBACK_SELECT) != 0) { - int[] trailing = new int [1]; - int newOffset = text.getOffsetAtPoint(pt.x, pt.y, trailing, false); - newOffset += trailing [0]; - if (newOffset != currentOffset) { - refreshCaret(text, currentOffset, newOffset); - currentOffset = newOffset; - } - } - } - - void refreshCaret(StyledText text, int oldOffset, int newOffset) { - if (oldOffset != newOffset) { - if (oldOffset != -1) { - Point oldPos = text.getLocationAtOffset(oldOffset); - int oldHeight = text.getLineHeight(oldOffset); - text.redraw (oldPos.x, oldPos.y, CARET_WIDTH, oldHeight, false); - } - if (newOffset != -1) { - Point newPos = text.getLocationAtOffset(newOffset); - int newHeight = text.getLineHeight(newOffset); - text.redraw (newPos.x, newPos.y, CARET_WIDTH, newHeight, false); - } - } - } - - /** - * This implementation of dropAccept provides a default drag under effect - * for the feedback specified in event.feedback. - * - * For additional information see DropTargetAdapter.dropAccept. - * - * Subclasses that override this method should call super.dropAccept(event) - * to get the default drag under effect implementation. - * - * @param event the information associated with the drop accept event - * - * @see DropTargetAdapter - * @see DropTargetEvent - */ - public void dropAccept(DropTargetEvent event) { - if (currentOffset != -1) { - StyledText text = (StyledText) getControl(); - text.setSelection(currentOffset); - currentOffset = -1; - } - } -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextEvent.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextEvent.java deleted file mode 100755 index 84e3331af8..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextEvent.java +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2007 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.swt.custom; - -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * - */ -class StyledTextEvent extends Event { - // used by LineStyleEvent - int[] ranges; - StyleRange[] styles; - int alignment; - int indent; - boolean justify; - Bullet bullet; - int bulletIndex; - // used by LineBackgroundEvent - Color lineBackground; - // used by BidiSegmentEvent - int[] segments; - // used by TextChangedEvent - int replaceCharCount; - int newCharCount; - int replaceLineCount; - int newLineCount; - // used by PaintObjectEvent - int x; - int y; - int ascent; - int descent; - StyleRange style; - -StyledTextEvent (StyledTextContent content) { - super(); - data = content; -} -} - - diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextListener.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextListener.java deleted file mode 100755 index 166e911bce..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextListener.java +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.events.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.internal.SWTEventListener; - -class StyledTextListener extends TypedListener { -/** - */ -StyledTextListener(SWTEventListener listener) { - super(listener); -} -/** - * Process StyledText events by invoking the event's handler. - * - * @param e the event to handle - */ -public void handleEvent(Event e) { - - switch (e.type) { - case StyledText.ExtendedModify: - ExtendedModifyEvent extendedModifyEvent = new ExtendedModifyEvent((StyledTextEvent) e); - ((ExtendedModifyListener) eventListener).modifyText(extendedModifyEvent); - break; - case StyledText.LineGetBackground: - LineBackgroundEvent lineBgEvent = new LineBackgroundEvent((StyledTextEvent) e); - ((LineBackgroundListener) eventListener).lineGetBackground(lineBgEvent); - ((StyledTextEvent) e).lineBackground = lineBgEvent.lineBackground; - break; - case StyledText.LineGetSegments: - BidiSegmentEvent segmentEvent = new BidiSegmentEvent((StyledTextEvent) e); - ((BidiSegmentListener) eventListener).lineGetSegments(segmentEvent); - ((StyledTextEvent) e).segments = segmentEvent.segments; - break; - case StyledText.LineGetStyle: - LineStyleEvent lineStyleEvent = new LineStyleEvent((StyledTextEvent) e); - ((LineStyleListener) eventListener).lineGetStyle(lineStyleEvent); - ((StyledTextEvent) e).ranges = lineStyleEvent.ranges; - ((StyledTextEvent) e).styles = lineStyleEvent.styles; - ((StyledTextEvent) e).alignment = lineStyleEvent.alignment; - ((StyledTextEvent) e).indent = lineStyleEvent.indent; - ((StyledTextEvent) e).justify = lineStyleEvent.justify; - ((StyledTextEvent) e).bullet = lineStyleEvent.bullet; - ((StyledTextEvent) e).bulletIndex = lineStyleEvent.bulletIndex; - break; - case StyledText.PaintObject: - PaintObjectEvent paintObjectEvent = new PaintObjectEvent((StyledTextEvent) e); - ((PaintObjectListener) eventListener).paintObject(paintObjectEvent); - break; - case StyledText.VerifyKey: - VerifyEvent verifyEvent = new VerifyEvent(e); - ((VerifyKeyListener) eventListener).verifyKey(verifyEvent); - e.doit = verifyEvent.doit; - break; - case StyledText.TextChanged: { - TextChangedEvent textChangedEvent = new TextChangedEvent((StyledTextContent) e.data); - ((TextChangeListener) eventListener).textChanged(textChangedEvent); - break; - } - case StyledText.TextChanging: - TextChangingEvent textChangingEvent = new TextChangingEvent((StyledTextContent) e.data, (StyledTextEvent) e); - ((TextChangeListener) eventListener).textChanging(textChangingEvent); - break; - case StyledText.TextSet: { - TextChangedEvent textChangedEvent = new TextChangedEvent((StyledTextContent) e.data); - ((TextChangeListener) eventListener).textSet(textChangedEvent); - break; - } - case StyledText.WordNext: { - MovementEvent wordBoundaryEvent = new MovementEvent((StyledTextEvent) e); - ((MovementListener) eventListener).getNextOffset(wordBoundaryEvent); - ((StyledTextEvent) e).end = wordBoundaryEvent.newOffset; - break; - } - case StyledText.WordPrevious: { - MovementEvent wordBoundaryEvent = new MovementEvent((StyledTextEvent) e); - ((MovementListener) eventListener).getPreviousOffset(wordBoundaryEvent); - ((StyledTextEvent) e).end = wordBoundaryEvent.newOffset; - break; - } - case StyledText.CaretMoved: { - CaretEvent caretEvent = new CaretEvent((StyledTextEvent) e); - ((CaretListener) eventListener).caretMoved(caretEvent); - ((StyledTextEvent) e).end = caretEvent.caretOffset; - break; - } - } -} -} - - diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextPrintOptions.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextPrintOptions.java deleted file mode 100644 index 0daad1f85e..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextPrintOptions.java +++ /dev/null @@ -1,104 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -/** - * Use StyledTextPrintOptions to specify printing options for the - * StyledText.print(Printer, StyledTextPrintOptions) API. - *

    - * The following example prints a right aligned page number in the footer, - * sets the job name to "Example" and prints line background colors but no other - * formatting: - *

    - *
    - * StyledTextPrintOptions options = new StyledTextPrintOptions();
    - * options.footer = "\t\t<page>"; 
    - * options.jobName = "Example";
    - * options.printLineBackground = true;
    - * 
    - * Runnable runnable = styledText.print(new Printer(), options); 
    - * runnable.run();
    - * 
    - * - * @see Sample code and further information - * - * @since 2.1 - */ -public class StyledTextPrintOptions { - /** - * Page number placeholder constant for use in header - * and footer. Value is <page> - */ - public static final String PAGE_TAG = ""; - /** - * Separator constant for use in header and - * footer. Value is \t - */ - public static final String SEPARATOR = "\t"; - /** - * Formatted text to print in the header of each page. - *

    "left '\t' center '\t' right"

    - *

    left, center, right = <page> | #CDATA

    - *

    Header and footer are defined as three separate regions for arbitrary - * text or the page number placeholder <page> - * (StyledTextPrintOptions.PAGE_TAG). The three regions are - * left aligned, centered and right aligned. They are separated by a tab - * character (StyledTextPrintOptions.SEPARATOR). - */ - public String header = null; - /** - * Formatted text to print in the footer of each page. - *

    "left '\t' center '\t' right"

    - *

    left, center, right = <page> | #CDATA

    - *

    Header and footer are defined as three separate regions for arbitrary - * text or the page number placeholder <page> - * (StyledTextPrintOptions.PAGE_TAG). The three regions are - * left aligned, centered and right aligned. They are separated by a tab - * character (StyledTextPrintOptions.SEPARATOR). - */ - public String footer = null; - /** - * Name of the print job. - */ - public String jobName = null; - - /** - * Print the text foreground color. Default value is false. - */ - public boolean printTextForeground = false; - /** - * Print the text background color. Default value is false. - */ - public boolean printTextBackground = false; - /** - * Print the font styles. Default value is false. - */ - public boolean printTextFontStyle = false; - /** - * Print the line background color. Default value is false. - */ - public boolean printLineBackground = false; - - /** - * Print line numbers. Default value is false. - * - * @since 3.3 - */ - public boolean printLineNumbers = false; - - /** - * Labels used for printing line numbers. - * - * @since 3.4 - */ - public String[] lineLabels = null; - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextRenderer.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextRenderer.java deleted file mode 100644 index 86dcf4d905..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextRenderer.java +++ /dev/null @@ -1,1568 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 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.swt.custom; - - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * A StyledTextRenderer renders the content of a StyledText widget. - * This class can be used to render to the display or to a printer. - */ -class StyledTextRenderer { - Device device; - StyledText styledText; - StyledTextContent content; - - /* Font info */ - Font regularFont, boldFont, italicFont, boldItalicFont; - int tabWidth; - int ascent, descent; - int averageCharWidth; - - /* Line data */ - int topIndex = -1; - TextLayout[] layouts; - int lineCount; - int[] lineWidth; - int[] lineHeight; - LineInfo[] lines; - int maxWidth; - int maxWidthLineIndex; - boolean idleRunning; - - /* Bullet */ - Bullet[] bullets; - int[] bulletsIndices; - int[] redrawLines; - - /* Style data */ - int[] ranges; - int styleCount; - StyleRange[] styles; - StyleRange[] stylesSet; - int stylesSetCount = 0; - boolean hasLinks, fixedPitch; - final static int BULLET_MARGIN = 8; - - final static boolean COMPACT_STYLES = true; - final static boolean MERGE_STYLES = true; - - final static int GROW = 32; - final static int IDLE_TIME = 50; - final static int CACHE_SIZE = 128; - - final static int BACKGROUND = 1 << 0; - final static int ALIGNMENT = 1 << 1; - final static int INDENT = 1 << 2; - final static int JUSTIFY = 1 << 3; - final static int SEGMENTS = 1 << 5; - - static class LineInfo { - int flags; - Color background; - int alignment; - int indent; - boolean justify; - int[] segments; - - public LineInfo() { - } - public LineInfo(LineInfo info) { - if (info != null) { - flags = info.flags; - background = info.background; - alignment = info.alignment; - indent = info.indent; - justify = info.justify; - segments = info.segments; - } - } - } - -StyledTextRenderer(Device device, StyledText styledText) { - this.device = device; - this.styledText = styledText; -} -int addMerge(int[] mergeRanges, StyleRange[] mergeStyles, int mergeCount, int modifyStart, int modifyEnd) { - int rangeCount = styleCount << 1; - StyleRange endStyle = null; - int endStart = 0, endLength = 0; - if (modifyEnd < rangeCount) { - endStyle = styles[modifyEnd >> 1]; - endStart = ranges[modifyEnd]; - endLength = ranges[modifyEnd + 1]; - } - int grow = mergeCount - (modifyEnd - modifyStart); - if (rangeCount + grow >= ranges.length) { - int[] tmpRanges = new int[ranges.length + grow + (GROW << 1)]; - System.arraycopy(ranges, 0, tmpRanges, 0, modifyStart); - StyleRange[] tmpStyles = new StyleRange[styles.length + (grow >> 1) + GROW]; - System.arraycopy(styles, 0, tmpStyles, 0, modifyStart >> 1); - if (rangeCount > modifyEnd) { - System.arraycopy(ranges, modifyEnd, tmpRanges, modifyStart + mergeCount, rangeCount - modifyEnd); - System.arraycopy(styles, modifyEnd >> 1, tmpStyles, (modifyStart + mergeCount) >> 1, styleCount - (modifyEnd >> 1)); - } - ranges = tmpRanges; - styles = tmpStyles; - } else { - if (rangeCount > modifyEnd) { - System.arraycopy(ranges, modifyEnd, ranges, modifyStart + mergeCount, rangeCount - modifyEnd); - System.arraycopy(styles, modifyEnd >> 1, styles, (modifyStart + mergeCount) >> 1, styleCount - (modifyEnd >> 1)); - } - } - if (MERGE_STYLES) { - int j = modifyStart; - for (int i = 0; i < mergeCount; i += 2) { - if (j > 0 && ranges[j - 2] + ranges[j - 1] == mergeRanges[i] && mergeStyles[i >> 1].similarTo(styles[(j - 2) >> 1])) { - ranges[j - 1] += mergeRanges[i + 1]; - } else { - styles[j >> 1] = mergeStyles[i >> 1]; - ranges[j++] = mergeRanges[i]; - ranges[j++] = mergeRanges[i + 1]; - } - } - if (endStyle != null && ranges[j - 2] + ranges[j - 1] == endStart && endStyle.similarTo(styles[(j - 2) >> 1])) { - ranges[j - 1] += endLength; - modifyEnd += 2; - mergeCount += 2; - } - if (rangeCount > modifyEnd) { - System.arraycopy(ranges, modifyStart + mergeCount, ranges, j, rangeCount - modifyEnd); - System.arraycopy(styles, (modifyStart + mergeCount) >> 1, styles, j >> 1, styleCount - (modifyEnd >> 1)); - } - grow = (j - modifyStart) - (modifyEnd - modifyStart); - } else { - System.arraycopy(mergeRanges, 0, ranges, modifyStart, mergeCount); - System.arraycopy(mergeStyles, 0, styles, modifyStart >> 1, mergeCount >> 1); - } - styleCount += grow >> 1; - return grow; -} -int addMerge(StyleRange[] mergeStyles, int mergeCount, int modifyStart, int modifyEnd) { - int grow = mergeCount - (modifyEnd - modifyStart); - StyleRange endStyle = null; - if (modifyEnd < styleCount) endStyle = styles[modifyEnd]; - if (styleCount + grow >= styles.length) { - StyleRange[] tmpStyles = new StyleRange[styles.length + grow + GROW]; - System.arraycopy(styles, 0, tmpStyles, 0, modifyStart); - if (styleCount > modifyEnd) { - System.arraycopy(styles, modifyEnd, tmpStyles, modifyStart + mergeCount, styleCount - modifyEnd); - } - styles = tmpStyles; - } else { - if (styleCount > modifyEnd) { - System.arraycopy(styles, modifyEnd, styles, modifyStart + mergeCount, styleCount - modifyEnd); - } - } - if (MERGE_STYLES) { - int j = modifyStart; - for (int i = 0; i < mergeCount; i++) { - StyleRange newStyle = mergeStyles[i], style; - if (j > 0 && (style = styles[j - 1]).start + style.length == newStyle.start && newStyle.similarTo(style)) { - style.length += newStyle.length; - } else { - styles[j++] = newStyle; - } - } - StyleRange style = styles[j - 1]; - if (endStyle != null && style.start + style.length == endStyle.start && endStyle.similarTo(style)) { - style.length += endStyle.length; - modifyEnd++; - mergeCount++; - } - if (styleCount > modifyEnd) { - System.arraycopy(styles, modifyStart + mergeCount, styles, j, styleCount - modifyEnd); - } - grow = (j - modifyStart) - (modifyEnd - modifyStart); - } else { - System.arraycopy(mergeStyles, 0, styles, modifyStart, mergeCount); - } - styleCount += grow; - return grow; -} -void calculate(int startLine, int lineCount) { - int endLine = startLine + lineCount; - if (startLine < 0 || endLine > lineWidth.length) { - return; - } - int hTrim = styledText.leftMargin + styledText.rightMargin + styledText.getCaretWidth(); - for (int i = startLine; i < endLine; i++) { - if (lineWidth[i] == -1 || lineHeight[i] == -1) { - TextLayout layout = getTextLayout(i); - Rectangle rect = layout.getBounds(); - lineWidth[i] = rect.width + hTrim; - lineHeight[i] = rect.height; - disposeTextLayout(layout); - } - if (lineWidth[i] > maxWidth) { - maxWidth = lineWidth[i]; - maxWidthLineIndex = i; - } - } -} -void calculateClientArea () { - int index = styledText.getTopIndex(); - int lineCount = content.getLineCount(); - int height = styledText.getClientArea().height; - int y = 0; - while (height > y && lineCount > index) { - calculate(index, 1); - y += lineHeight[index++]; - } -} -void calculateIdle () { - if (idleRunning) return; - Runnable runnable = new Runnable() { - public void run() { - if (styledText == null) return; - int i; - long start = System.currentTimeMillis(); - for (i = 0; i < lineCount; i++) { - if (lineHeight[i] == -1 || lineWidth[i] == -1) { - calculate(i, 1); - if (System.currentTimeMillis() - start > IDLE_TIME) break; - } - } - if (i < lineCount) { - Display display = styledText.getDisplay(); - display.asyncExec(this); - } else { - idleRunning = false; - styledText.setScrollBars(true); - ScrollBar bar = styledText.getVerticalBar(); - if (bar != null) { - bar.setSelection(styledText.getVerticalScrollOffset()); - } - } - } - }; - Display display = styledText.getDisplay(); - display.asyncExec(runnable); - idleRunning = true; -} -void clearLineBackground(int startLine, int count) { - if (lines == null) return; - for (int i = startLine; i < startLine + count; i++) { - LineInfo info = lines[i]; - if (info != null) { - info.flags &= ~BACKGROUND; - info.background = null; - if (info.flags == 0) lines[i] = null; - } - } -} -void clearLineStyle(int startLine, int count) { - if (lines == null) return; - for (int i = startLine; i < startLine + count; i++) { - LineInfo info = lines[i]; - if (info != null) { - info.flags &= ~(ALIGNMENT | INDENT | JUSTIFY); - if (info.flags == 0) lines[i] = null; - } - } -} -void copyInto(StyledTextRenderer renderer) { - if (ranges != null) { - int[] newRanges = renderer.ranges = new int[styleCount << 1]; - System.arraycopy(ranges, 0, newRanges, 0, newRanges.length); - } - if (styles != null) { - StyleRange[] newStyles = renderer.styles = new StyleRange[styleCount]; - for (int i = 0; i < newStyles.length; i++) { - newStyles[i] = (StyleRange)styles[i].clone(); - } - renderer.styleCount = styleCount; - } - if (lines != null) { - LineInfo[] newLines = renderer.lines = new LineInfo[lineCount]; - for (int i = 0; i < newLines.length; i++) { - newLines[i] = new LineInfo(lines[i]); - } - renderer.lineCount = lineCount; - } -} -void dispose() { - if (boldFont != null) boldFont.dispose(); - if (italicFont != null) italicFont.dispose(); - if (boldItalicFont != null) boldItalicFont.dispose(); - boldFont = italicFont = boldItalicFont = null; - reset(); - content = null; - device = null; - styledText = null; -} -void disposeTextLayout (TextLayout layout) { - if (layouts != null) { - for (int i = 0; i < layouts.length; i++) { - if (layouts[i] == layout) return; - } - } - layout.dispose(); -} -void drawBullet(Bullet bullet, GC gc, int paintX, int paintY, int index, int lineAscent, int lineDescent) { - StyleRange style = bullet.style; - GlyphMetrics metrics = style.metrics; - Color color = style.foreground; - if (color != null) gc.setForeground(color); - if ((bullet.type & ST.BULLET_DOT) != 0 && StyledText.IS_MOTIF) { - int size = Math.max(4, (lineAscent + lineDescent) / 4); - if ((size & 1) == 0) size++; - if (color == null) { - Display display = styledText.getDisplay(); - color = display.getSystemColor(SWT.COLOR_BLACK); - } - gc.setBackground(color); - int x = paintX + Math.max(0, metrics.width - size - BULLET_MARGIN); - gc.fillArc(x, paintY + size, size + 1, size + 1, 0, 360); - return; - } - Font font = style.font; - if (font != null) gc.setFont(font); - String string = ""; - int type = bullet.type & (ST.BULLET_DOT|ST.BULLET_NUMBER|ST.BULLET_LETTER_LOWER|ST.BULLET_LETTER_UPPER); - switch (type) { - case ST.BULLET_DOT: string = "\u2022"; break; - case ST.BULLET_NUMBER: string = String.valueOf(index); break; - case ST.BULLET_LETTER_LOWER: string = String.valueOf((char) (index % 26 + 97)); break; - case ST.BULLET_LETTER_UPPER: string = String.valueOf((char) (index % 26 + 65)); break; - } - if ((bullet.type & ST.BULLET_TEXT) != 0) string += bullet.text; - Display display = styledText.getDisplay(); - TextLayout layout = new TextLayout(display); - layout.setText(string); - layout.setAscent(lineAscent); - layout.setDescent(lineDescent); - style = (StyleRange)style.clone(); - style.metrics = null; - if (style.font == null) style.font = getFont(style.fontStyle); - layout.setStyle(style, 0, string.length()); - int x = paintX + Math.max(0, metrics.width - layout.getBounds().width - BULLET_MARGIN); - layout.draw(gc, x, paintY); - layout.dispose(); -} -int drawLine(int lineIndex, int paintX, int paintY, GC gc, Color widgetBackground, Color widgetForeground) { - TextLayout layout = getTextLayout(lineIndex); - String line = content.getLine(lineIndex); - int lineOffset = content.getOffsetAtLine(lineIndex); - int lineLength = line.length(); - Point selection = styledText.getSelection(); - int selectionStart = selection.x - lineOffset; - int selectionEnd = selection.y - lineOffset; - if (styledText.getBlockSelection()) { - selectionStart = selectionEnd = 0; - } - Rectangle client = styledText.getClientArea(); - Color lineBackground = getLineBackground(lineIndex, null); - StyledTextEvent event = styledText.getLineBackgroundData(lineOffset, line); - if (event != null && event.lineBackground != null) lineBackground = event.lineBackground; - int height = layout.getBounds().height; - if (lineBackground != null) { - gc.setBackground(lineBackground); - gc.fillRectangle(client.x, paintY, client.width, height); - } else { - gc.setBackground(widgetBackground); - styledText.drawBackground(gc, client.x, paintY, client.width, height); - } - gc.setForeground(widgetForeground); - if (selectionStart == selectionEnd || (selectionEnd <= 0 && selectionStart > lineLength - 1)) { - layout.draw(gc, paintX, paintY); - } else { - int start = Math.max(0, selectionStart); - int end = Math.min(lineLength, selectionEnd); - Color selectionFg = styledText.getSelectionForeground(); - Color selectionBg = styledText.getSelectionBackground(); - int flags; - if ((styledText.getStyle() & SWT.FULL_SELECTION) != 0) { - flags = SWT.FULL_SELECTION; - } else { - flags = SWT.DELIMITER_SELECTION; - } - if (selectionStart <= lineLength && lineLength < selectionEnd ) { - flags |= SWT.LAST_LINE_SELECTION; - } - layout.draw(gc, paintX, paintY, start, end - 1, selectionFg, selectionBg, flags); - } - - // draw objects - Bullet bullet = null; - int bulletIndex = -1; - if (bullets != null) { - if (bulletsIndices != null) { - int index = lineIndex - topIndex; - if (0 <= index && index < CACHE_SIZE) { - bullet = bullets[index]; - bulletIndex = bulletsIndices[index]; - } - } else { - for (int i = 0; i < bullets.length; i++) { - bullet = bullets[i]; - bulletIndex = bullet.indexOf(lineIndex); - if (bulletIndex != -1) break; - } - } - } - if (bulletIndex != -1 && bullet != null) { - FontMetrics metrics = layout.getLineMetrics(0); - int lineAscent = metrics.getAscent() + metrics.getLeading(); - if (bullet.type == ST.BULLET_CUSTOM) { - bullet.style.start = lineOffset; - styledText.paintObject(gc, paintX, paintY, lineAscent, metrics.getDescent(), bullet.style, bullet, bulletIndex); - } else { - drawBullet(bullet, gc, paintX, paintY, bulletIndex, lineAscent, metrics.getDescent()); - } - } - TextStyle[] styles = layout.getStyles(); - int[] ranges = null; - for (int i = 0; i < styles.length; i++) { - if (styles[i].metrics != null) { - if (ranges == null) ranges = layout.getRanges(); - int start = ranges[i << 1]; - int length = ranges[(i << 1) + 1] - start; - Point point = layout.getLocation(start, false); - FontMetrics metrics = layout.getLineMetrics(layout.getLineIndex(start)); - StyleRange style = (StyleRange)((StyleRange)styles[i]).clone(); - style.start = start + lineOffset; - style.length = length; - int lineAscent = metrics.getAscent() + metrics.getLeading(); - styledText.paintObject(gc, point.x + paintX, point.y + paintY, lineAscent, metrics.getDescent(), style, null, 0); - } - } - disposeTextLayout(layout); - return height; -} -int getBaseline() { - return ascent; -} -Font getFont(int style) { - switch (style) { - case SWT.BOLD: - if (boldFont != null) return boldFont; - return boldFont = new Font(device, getFontData(style)); - case SWT.ITALIC: - if (italicFont != null) return italicFont; - return italicFont = new Font(device, getFontData(style)); - case SWT.BOLD | SWT.ITALIC: - if (boldItalicFont != null) return boldItalicFont; - return boldItalicFont = new Font(device, getFontData(style)); - default: - return regularFont; - } -} -FontData[] getFontData(int style) { - FontData[] fontDatas = regularFont.getFontData(); - for (int i = 0; i < fontDatas.length; i++) { - fontDatas[i].setStyle(style); - } - return fontDatas; -} -int getHeight () { - int defaultLineHeight = getLineHeight(); - if (styledText.isFixedLineHeight()) { - return lineCount * defaultLineHeight + styledText.topMargin + styledText.bottomMargin; - } - int totalHeight = 0; - int width = styledText.getWrapWidth(); - for (int i = 0; i < lineCount; i++) { - int height = lineHeight[i]; - if (height == -1) { - if (width > 0) { - int length = content.getLine(i).length(); - height = ((length * averageCharWidth / width) + 1) * defaultLineHeight; - } else { - height = defaultLineHeight; - } - } - totalHeight += height; - } - return totalHeight + styledText.topMargin + styledText.bottomMargin; -} -boolean hasLink(int offset) { - if (offset == -1) return false; - int lineIndex = content.getLineAtOffset(offset); - int lineOffset = content.getOffsetAtLine(lineIndex); - String line = content.getLine(lineIndex); - StyledTextEvent event = styledText.getLineStyleData(lineOffset, line); - if (event != null) { - StyleRange[] styles = event.styles; - if (styles != null) { - int[] ranges = event.ranges; - if (ranges != null) { - for (int i = 0; i < ranges.length; i+=2) { - if (ranges[i] <= offset && offset < ranges[i] + ranges[i+1] && styles[i >> 1].underline && styles[i >> 1].underlineStyle == SWT.UNDERLINE_LINK) { - return true; - } - } - } else { - for (int i = 0; i < styles.length; i++) { - if (styles[i].start <= offset && offset < styles[i].start + styles[i].length && styles[i >> 1].underline && styles[i >> 1].underlineStyle == SWT.UNDERLINE_LINK) { - return true; - } - } - } - } - } else { - if (ranges != null) { - int rangeCount = styleCount << 1; - int index = getRangeIndex(offset, -1, rangeCount); - if (index >= rangeCount) return false; - int rangeStart = ranges[index]; - int rangeLength = ranges[index + 1]; - StyleRange rangeStyle = styles[index >> 1]; - if (rangeStart <= offset && offset < rangeStart + rangeLength && rangeStyle.underline && rangeStyle.underlineStyle == SWT.UNDERLINE_LINK) { - return true; - } - } - } - return false; -} -int getLineAlignment(int index, int defaultAlignment) { - if (lines == null) return defaultAlignment; - LineInfo info = lines[index]; - if (info != null && (info.flags & ALIGNMENT) != 0) { - return info.alignment; - } - return defaultAlignment; -} -Color getLineBackground(int index, Color defaultBackground) { - if (lines == null) return defaultBackground; - LineInfo info = lines[index]; - if (info != null && (info.flags & BACKGROUND) != 0) { - return info.background; - } - return defaultBackground; -} -Bullet getLineBullet (int index, Bullet defaultBullet) { - if (bullets == null) return defaultBullet; - if (bulletsIndices != null) return defaultBullet; - for (int i = 0; i < bullets.length; i++) { - Bullet bullet = bullets[i]; - if (bullet.indexOf(index) != -1) return bullet; - } - return defaultBullet; -} -int getLineHeight() { - return ascent + descent; -} -int getLineHeight(int lineIndex) { - if (lineHeight[lineIndex] == -1) { - calculate(lineIndex, 1); - } - return lineHeight[lineIndex]; -} -int getLineIndent(int index, int defaultIndent) { - if (lines == null) return defaultIndent; - LineInfo info = lines[index]; - if (info != null && (info.flags & INDENT) != 0) { - return info.indent; - } - return defaultIndent; -} -boolean getLineJustify(int index, boolean defaultJustify) { - if (lines == null) return defaultJustify; - LineInfo info = lines[index]; - if (info != null && (info.flags & JUSTIFY) != 0) { - return info.justify; - } - return defaultJustify; -} -int[] getLineSegments(int index, int[] defaultSegments) { - if (lines == null) return defaultSegments; - LineInfo info = lines[index]; - if (info != null && (info.flags & SEGMENTS) != 0) { - return info.segments; - } - return defaultSegments; -} -int getRangeIndex(int offset, int low, int high) { - if (styleCount == 0) return 0; - if (ranges != null) { - while (high - low > 2) { - int index = ((high + low) / 2) / 2 * 2; - int end = ranges[index] + ranges[index + 1]; - if (end > offset) { - high = index; - } else { - low = index; - } - } - } else { - while (high - low > 1) { - int index = ((high + low) / 2); - int end = styles[index].start + styles[index].length; - if (end > offset) { - high = index; - } else { - low = index; - } - } - } - return high; -} -int[] getRanges(int start, int length) { - if (length == 0) return null; - int[] newRanges; - int end = start + length - 1; - if (ranges != null) { - int rangeCount = styleCount << 1; - int rangeStart = getRangeIndex(start, -1, rangeCount); - if (rangeStart >= rangeCount) return null; - if (ranges[rangeStart] > end) return null; - int rangeEnd = Math.min(rangeCount - 2, getRangeIndex(end, rangeStart - 1, rangeCount)); - if (ranges[rangeEnd] > end) rangeEnd = Math.max(rangeStart, rangeEnd - 2); - newRanges = new int[rangeEnd - rangeStart + 2]; - System.arraycopy(ranges, rangeStart, newRanges, 0, newRanges.length); - } else { - int rangeStart = getRangeIndex(start, -1, styleCount); - if (rangeStart >= styleCount) return null; - if (styles[rangeStart].start > end) return null; - int rangeEnd = Math.min(styleCount - 1, getRangeIndex(end, rangeStart - 1, styleCount)); - if (styles[rangeEnd].start > end) rangeEnd = Math.max(rangeStart, rangeEnd - 1); - newRanges = new int[(rangeEnd - rangeStart + 1) << 1]; - for (int i = rangeStart, j = 0; i <= rangeEnd; i++, j += 2) { - StyleRange style = styles[i]; - newRanges[j] = style.start; - newRanges[j + 1] = style.length; - } - } - if (start > newRanges[0]) { - newRanges[1] = newRanges[0] + newRanges[1] - start; - newRanges[0] = start; - } - if (end < newRanges[newRanges.length - 2] + newRanges[newRanges.length - 1] - 1) { - newRanges[newRanges.length - 1] = end - newRanges[newRanges.length - 2] + 1; - } - return newRanges; -} -StyleRange[] getStyleRanges(int start, int length, boolean includeRanges) { - if (length == 0) return null; - StyleRange[] newStyles; - int end = start + length - 1; - if (ranges != null) { - int rangeCount = styleCount << 1; - int rangeStart = getRangeIndex(start, -1, rangeCount); - if (rangeStart >= rangeCount) return null; - if (ranges[rangeStart] > end) return null; - int rangeEnd = Math.min(rangeCount - 2, getRangeIndex(end, rangeStart - 1, rangeCount)); - if (ranges[rangeEnd] > end) rangeEnd = Math.max(rangeStart, rangeEnd - 2); - newStyles = new StyleRange[((rangeEnd - rangeStart) >> 1) + 1]; - if (includeRanges) { - for (int i = rangeStart, j = 0; i <= rangeEnd; i += 2, j++) { - newStyles[j] = (StyleRange)styles[i >> 1].clone(); - newStyles[j].start = ranges[i]; - newStyles[j].length = ranges[i + 1]; - } - } else { - System.arraycopy(styles, rangeStart >> 1, newStyles, 0, newStyles.length); - } - } else { - int rangeStart = getRangeIndex(start, -1, styleCount); - if (rangeStart >= styleCount) return null; - if (styles[rangeStart].start > end) return null; - int rangeEnd = Math.min(styleCount - 1, getRangeIndex(end, rangeStart - 1, styleCount)); - if (styles[rangeEnd].start > end) rangeEnd = Math.max(rangeStart, rangeEnd - 1); - newStyles = new StyleRange[rangeEnd - rangeStart + 1]; - System.arraycopy(styles, rangeStart, newStyles, 0, newStyles.length); - } - if (includeRanges || ranges == null) { - StyleRange style = newStyles[0]; - if (start > style.start) { - newStyles[0] = style = (StyleRange)style.clone(); - style.length = style.start + style.length - start; - style.start = start; - } - style = newStyles[newStyles.length - 1]; - if (end < style.start + style.length - 1) { - newStyles[newStyles.length - 1] = style = (StyleRange)style.clone(); - style.length = end - style.start + 1; - } - } - return newStyles; -} -StyleRange getStyleRange(StyleRange style) { - if (style.underline && style.underlineStyle == SWT.UNDERLINE_LINK) hasLinks = true; - if (style.start == 0 && style.length == 0 && style.fontStyle == SWT.NORMAL) return style; - StyleRange clone = (StyleRange)style.clone(); - clone.start = clone.length = 0; - clone.fontStyle = SWT.NORMAL; - if (clone.font == null) clone.font = getFont(style.fontStyle); - return clone; -} -TextLayout getTextLayout(int lineIndex) { - return getTextLayout(lineIndex, styledText.getOrientation(), styledText.getWrapWidth(), styledText.lineSpacing); -} -TextLayout getTextLayout(int lineIndex, int orientation, int width, int lineSpacing) { - TextLayout layout = null; - if (styledText != null) { - int topIndex = styledText.topIndex > 0 ? styledText.topIndex - 1 : 0; - if (layouts == null || topIndex != this.topIndex) { - TextLayout[] newLayouts = new TextLayout[CACHE_SIZE]; - if (layouts != null) { - for (int i = 0; i < layouts.length; i++) { - if (layouts[i] != null) { - int layoutIndex = (i + this.topIndex) - topIndex; - if (0 <= layoutIndex && layoutIndex < newLayouts.length) { - newLayouts[layoutIndex] = layouts[i]; - } else { - layouts[i].dispose(); - } - } - } - } - if (bullets != null && bulletsIndices != null && topIndex != this.topIndex) { - int delta = topIndex - this.topIndex; - if (delta > 0) { - if (delta < bullets.length) { - System.arraycopy(bullets, delta, bullets, 0, bullets.length - delta); - System.arraycopy(bulletsIndices, delta, bulletsIndices, 0, bulletsIndices.length - delta); - } - int startIndex = Math.max(0, bullets.length - delta); - for (int i = startIndex; i < bullets.length; i++) bullets[i] = null; - } else { - if (-delta < bullets.length) { - System.arraycopy(bullets, 0, bullets, -delta, bullets.length + delta); - System.arraycopy(bulletsIndices, 0, bulletsIndices, -delta, bulletsIndices.length + delta); - } - int endIndex = Math.min(bullets.length, -delta); - for (int i = 0; i < endIndex; i++) bullets[i] = null; - } - } - this.topIndex = topIndex; - layouts = newLayouts; - } - if (layouts != null) { - int layoutIndex = lineIndex - topIndex; - if (0 <= layoutIndex && layoutIndex < layouts.length) { - layout = layouts[layoutIndex]; - if (layout != null) { - if (lineWidth[lineIndex] != -1) return layout; - } else { - layout = layouts[layoutIndex] = new TextLayout(device); - } - } - } - } - if (layout == null) layout = new TextLayout(device); - String line = content.getLine(lineIndex); - int lineOffset = content.getOffsetAtLine(lineIndex); - int[] segments = null; - int indent = 0; - int alignment = SWT.LEFT; - boolean justify = false; - Bullet bullet = null; - int[] ranges = null; - StyleRange[] styles = null; - int rangeStart = 0, styleCount = 0; - StyledTextEvent event = null; - if (styledText != null) { - event = styledText.getLineStyleData(lineOffset, line); - segments = styledText.getBidiSegments(lineOffset, line); - indent = styledText.indent; - alignment = styledText.alignment; - justify = styledText.justify; - } - if (event != null) { - indent = event.indent; - alignment = event.alignment; - justify = event.justify; - bullet = event.bullet; - ranges = event.ranges; - styles = event.styles; - if (styles != null) { - styleCount = styles.length; - if (styledText.isFixedLineHeight()) { - for (int i = 0; i < styleCount; i++) { - if (styles[i].isVariableHeight()) { - styledText.verticalScrollOffset = -1; - styledText.setVariableLineHeight(); - styledText.redraw(); - break; - } - } - } - } - if (bullets == null || bulletsIndices == null) { - bullets = new Bullet[CACHE_SIZE]; - bulletsIndices = new int[CACHE_SIZE]; - } - int index = lineIndex - topIndex; - if (0 <= index && index < CACHE_SIZE) { - bullets[index] = bullet; - bulletsIndices[index] = event.bulletIndex; - } - } else { - if (lines != null) { - LineInfo info = lines[lineIndex]; - if (info != null) { - if ((info.flags & INDENT) != 0) indent = info.indent; - if ((info.flags & ALIGNMENT) != 0) alignment = info.alignment; - if ((info.flags & JUSTIFY) != 0) justify = info.justify; - if ((info.flags & SEGMENTS) != 0) segments = info.segments; - } - } - if (bulletsIndices != null) { - bullets = null; - bulletsIndices = null; - } - if (bullets != null) { - for (int i = 0; i < bullets.length; i++) { - if (bullets[i].indexOf(lineIndex) != -1) { - bullet = bullets[i]; - break; - } - } - } - ranges = this.ranges; - styles = this.styles; - styleCount = this.styleCount; - if (ranges != null) { - rangeStart = getRangeIndex(lineOffset, -1, styleCount << 1); - } else { - rangeStart = getRangeIndex(lineOffset, -1, styleCount); - } - } - if (bullet != null) { - StyleRange style = bullet.style; - GlyphMetrics metrics = style.metrics; - indent += metrics.width; - } - layout.setFont(regularFont); - layout.setAscent(ascent); - layout.setDescent(descent); - layout.setText(line); - layout.setOrientation(orientation); - layout.setSegments(segments); - layout.setWidth(width); - layout.setSpacing(lineSpacing); - layout.setTabs(new int[]{tabWidth}); - layout.setIndent(indent); - layout.setAlignment(alignment); - layout.setJustify(justify); - - int lastOffset = 0; - int length = line.length(); - if (styles != null) { - if (ranges != null) { - int rangeCount = styleCount << 1; - for (int i = rangeStart; i < rangeCount; i += 2) { - int start, end; - if (lineOffset > ranges[i]) { - start = 0; - end = Math.min (length, ranges[i + 1] - lineOffset + ranges[i]); - } else { - start = ranges[i] - lineOffset; - end = Math.min(length, start + ranges[i + 1]); - } - if (start >= length) break; - if (lastOffset < start) { - layout.setStyle(null, lastOffset, start - 1); - } - layout.setStyle(getStyleRange(styles[i >> 1]), start, end); - lastOffset = Math.max(lastOffset, end); - } - } else { - for (int i = rangeStart; i < styleCount; i++) { - int start, end; - if (lineOffset > styles[i].start) { - start = 0; - end = Math.min (length, styles[i].length - lineOffset + styles[i].start); - } else { - start = styles[i].start - lineOffset; - end = Math.min(length, start + styles[i].length); - } - if (start >= length) break; - if (lastOffset < start) { - layout.setStyle(null, lastOffset, start - 1); - } - layout.setStyle(getStyleRange(styles[i]), start, end); - lastOffset = Math.max(lastOffset, end); - } - } - } - if (lastOffset < length) layout.setStyle(null, lastOffset, length); - if (styledText != null && styledText.ime != null) { - IME ime = styledText.ime; - int compositionOffset = ime.getCompositionOffset(); - if (compositionOffset != -1) { - int commitCount = ime.getCommitCount(); - int compositionLength = ime.getText().length(); - if (compositionLength != commitCount) { - int compositionLine = content.getLineAtOffset(compositionOffset); - if (compositionLine == lineIndex) { - int[] imeRanges = ime.getRanges(); - TextStyle[] imeStyles = ime.getStyles(); - if (imeRanges.length > 0) { - for (int i = 0; i < imeStyles.length; i++) { - int start = imeRanges[i*2] - lineOffset; - int end = imeRanges[i*2+1] - lineOffset; - TextStyle imeStyle = imeStyles[i], userStyle; - for (int j = start; j <= end; j++) { - userStyle = layout.getStyle(j); - if (userStyle == null && j > 0) userStyle = layout.getStyle(j - 1); - if (userStyle == null && j + 1 < length) userStyle = layout.getStyle(j + 1); - if (userStyle == null) { - layout.setStyle(imeStyle, j, j); - } else { - TextStyle newStyle = new TextStyle(imeStyle); - if (newStyle.font == null) newStyle.font = userStyle.font; - if (newStyle.foreground == null) newStyle.foreground = userStyle.foreground; - if (newStyle.background == null) newStyle.background = userStyle.background; - layout.setStyle(newStyle, j, j); - } - } - } - } else { - int start = compositionOffset - lineOffset; - int end = start + compositionLength - 1; - TextStyle userStyle = layout.getStyle(start); - if (userStyle == null) { - if (start > 0) userStyle = layout.getStyle(start - 1); - if (userStyle == null && end + 1 < length) userStyle = layout.getStyle(end + 1); - if (userStyle != null) { - TextStyle newStyle = new TextStyle(); - newStyle.font = userStyle.font; - newStyle.foreground = userStyle.foreground; - newStyle.background = userStyle.background; - layout.setStyle(newStyle, start, end); - } - } - } - } - } - } - } - - if (styledText != null && styledText.isFixedLineHeight()) { - int index = -1; - int lineCount = layout.getLineCount(); - int height = getLineHeight(); - for (int i = 0; i < lineCount; i++) { - int lineHeight = layout.getLineBounds(i).height; - if (lineHeight > height) { - height = lineHeight; - index = i; - } - } - if (index != -1) { - FontMetrics metrics = layout.getLineMetrics(index); - ascent = metrics.getAscent() + metrics.getLeading(); - descent = metrics.getDescent(); - if (layouts != null) { - for (int i = 0; i < layouts.length; i++) { - if (layouts[i] != null && layouts[i] != layout) { - layouts[i].setAscent(ascent); - layouts[i].setDescent(descent); - } - } - } - if (styledText.verticalScrollOffset != 0) { - int topIndex = styledText.topIndex; - int topIndexY = styledText.topIndexY; - int lineHeight = getLineHeight(); - if (topIndexY >= 0) { - styledText.verticalScrollOffset = (topIndex - 1) * lineHeight + lineHeight - topIndexY; - } else { - styledText.verticalScrollOffset = topIndex * lineHeight - topIndexY; - } - } - styledText.calculateScrollBars(); - if (styledText.isBidiCaret()) styledText.createCaretBitmaps(); - styledText.caretDirection = SWT.NULL; - styledText.setCaretLocation(); - styledText.redraw(); - } - } - return layout; -} -int getWidth() { - return maxWidth; -} -void reset() { - if (layouts != null) { - for (int i = 0; i < layouts.length; i++) { - TextLayout layout = layouts[i]; - if (layout != null) layout.dispose(); - } - layouts = null; - } - topIndex = -1; - stylesSetCount = styleCount = lineCount = 0; - ranges = null; - styles = null; - stylesSet = null; - lines = null; - lineWidth = null; - lineHeight = null; - bullets = null; - bulletsIndices = null; - redrawLines = null; - hasLinks = false; -} -void reset(int startLine, int lineCount) { - int endLine = startLine + lineCount; - if (startLine < 0 || endLine > lineWidth.length) return; - for (int i = startLine; i < endLine; i++) { - lineWidth[i] = -1; - lineHeight[i] = -1; - } - if (startLine <= maxWidthLineIndex && maxWidthLineIndex < endLine) { - maxWidth = 0; - maxWidthLineIndex = -1; - if (lineCount != this.lineCount) { - for (int i = 0; i < this.lineCount; i++) { - if (lineWidth[i] > maxWidth) { - maxWidth = lineWidth[i]; - maxWidthLineIndex = i; - } - } - } - } -} -void setContent(StyledTextContent content) { - reset(); - this.content = content; - lineCount = content.getLineCount(); - lineWidth = new int[lineCount]; - lineHeight = new int[lineCount]; - reset(0, lineCount); -} -void setFont(Font font, int tabs) { - TextLayout layout = new TextLayout(device); - layout.setFont(regularFont); - if (font != null) { - if (boldFont != null) boldFont.dispose(); - if (italicFont != null) italicFont.dispose(); - if (boldItalicFont != null) boldItalicFont.dispose(); - boldFont = italicFont = boldItalicFont = null; - regularFont = font; - layout.setText(" "); - layout.setFont(font); - layout.setStyle(new TextStyle(getFont(SWT.NORMAL), null, null), 0, 0); - layout.setStyle(new TextStyle(getFont(SWT.BOLD), null, null), 1, 1); - layout.setStyle(new TextStyle(getFont(SWT.ITALIC), null, null), 2, 2); - layout.setStyle(new TextStyle(getFont(SWT.BOLD | SWT.ITALIC), null, null), 3, 3); - FontMetrics metrics = layout.getLineMetrics(0); - ascent = metrics.getAscent() + metrics.getLeading(); - descent = metrics.getDescent(); - boldFont.dispose(); - italicFont.dispose(); - boldItalicFont.dispose(); - boldFont = italicFont = boldItalicFont = null; - } - layout.dispose(); - layout = new TextLayout(device); - layout.setFont(regularFont); - StringBuffer tabBuffer = new StringBuffer(tabs); - for (int i = 0; i < tabs; i++) { - tabBuffer.append(' '); - } - layout.setText(tabBuffer.toString()); - tabWidth = layout.getBounds().width; - layout.dispose(); - if (styledText != null) { - GC gc = new GC(styledText); - averageCharWidth = gc.getFontMetrics().getAverageCharWidth(); - fixedPitch = gc.stringExtent("l").x == gc.stringExtent("W").x; //$NON-NLS-1$ //$NON-NLS-2$ - gc.dispose(); - } -} -void setLineAlignment(int startLine, int count, int alignment) { - if (lines == null) lines = new LineInfo[lineCount]; - for (int i = startLine; i < startLine + count; i++) { - if (lines[i] == null) { - lines[i] = new LineInfo(); - } - lines[i].flags |= ALIGNMENT; - lines[i].alignment = alignment; - } -} -void setLineBackground(int startLine, int count, Color background) { - if (lines == null) lines = new LineInfo[lineCount]; - for (int i = startLine; i < startLine + count; i++) { - if (lines[i] == null) { - lines[i] = new LineInfo(); - } - lines[i].flags |= BACKGROUND; - lines[i].background = background; - } -} -void setLineBullet(int startLine, int count, Bullet bullet) { - if (bulletsIndices != null) { - bulletsIndices = null; - bullets = null; - } - if (bullets == null) { - if (bullet == null) return; - bullets = new Bullet[1]; - bullets[0] = bullet; - } - int index = 0; - while (index < bullets.length) { - if (bullet == bullets[index]) break; - index++; - } - if (bullet != null) { - if (index == bullets.length) { - Bullet[] newBulletsList = new Bullet[bullets.length + 1]; - System.arraycopy(bullets, 0, newBulletsList, 0, bullets.length); - newBulletsList[index] = bullet; - bullets = newBulletsList; - } - bullet.addIndices(startLine, count); - } else { - updateBullets(startLine, count, 0, false); - styledText.redrawLinesBullet(redrawLines); - redrawLines = null; - } -} -void setLineIndent(int startLine, int count, int indent) { - if (lines == null) lines = new LineInfo[lineCount]; - for (int i = startLine; i < startLine + count; i++) { - if (lines[i] == null) { - lines[i] = new LineInfo(); - } - lines[i].flags |= INDENT; - lines[i].indent = indent; - } -} -void setLineJustify(int startLine, int count, boolean justify) { - if (lines == null) lines = new LineInfo[lineCount]; - for (int i = startLine; i < startLine + count; i++) { - if (lines[i] == null) { - lines[i] = new LineInfo(); - } - lines[i].flags |= JUSTIFY; - lines[i].justify = justify; - } -} -void setLineSegments(int startLine, int count, int[] segments) { - if (lines == null) lines = new LineInfo[lineCount]; - for (int i = startLine; i < startLine + count; i++) { - if (lines[i] == null) { - lines[i] = new LineInfo(); - } - lines[i].flags |= SEGMENTS; - lines[i].segments = segments; - } -} -void setStyleRanges (int[] newRanges, StyleRange[] newStyles) { - if (newStyles == null) { - stylesSetCount = styleCount = 0; - ranges = null; - styles = null; - stylesSet = null; - hasLinks = false; - return; - } - if (newRanges == null && COMPACT_STYLES) { - newRanges = new int[newStyles.length << 1]; - StyleRange[] tmpStyles = new StyleRange[newStyles.length]; - if (stylesSet == null) stylesSet = new StyleRange[4]; - for (int i = 0, j = 0; i < newStyles.length; i++) { - StyleRange newStyle = newStyles[i]; - newRanges[j++] = newStyle.start; - newRanges[j++] = newStyle.length; - int index = 0; - while (index < stylesSetCount) { - if (stylesSet[index].similarTo(newStyle)) break; - index++; - } - if (index == stylesSetCount) { - if (stylesSetCount == stylesSet.length) { - StyleRange[] tmpStylesSet = new StyleRange[stylesSetCount + 4]; - System.arraycopy(stylesSet, 0, tmpStylesSet, 0, stylesSetCount); - stylesSet = tmpStylesSet; - } - stylesSet[stylesSetCount++] = newStyle; - } - tmpStyles[i] = stylesSet[index]; - } - newStyles = tmpStyles; - } - - if (styleCount == 0) { - if (newRanges != null) { - ranges = new int[newRanges.length]; - System.arraycopy(newRanges, 0, ranges, 0, ranges.length); - } - styles = new StyleRange[newStyles.length]; - System.arraycopy(newStyles, 0, styles, 0, styles.length); - styleCount = newStyles.length; - return; - } - if (newRanges != null && ranges == null) { - ranges = new int[styles.length << 1]; - for (int i = 0, j = 0; i < styleCount; i++) { - ranges[j++] = styles[i].start; - ranges[j++] = styles[i].length; - } - } - if (newRanges == null && ranges != null) { - newRanges = new int[newStyles.length << 1]; - for (int i = 0, j = 0; i < newStyles.length; i++) { - newRanges[j++] = newStyles[i].start; - newRanges[j++] = newStyles[i].length; - } - } - if (ranges != null) { - int rangeCount = styleCount << 1; - int start = newRanges[0]; - int modifyStart = getRangeIndex(start, -1, rangeCount), modifyEnd; - boolean insert = modifyStart == rangeCount; - if (!insert) { - int end = newRanges[newRanges.length - 2] + newRanges[newRanges.length - 1]; - modifyEnd = getRangeIndex(end, modifyStart - 1, rangeCount); - insert = modifyStart == modifyEnd && ranges[modifyStart] >= end; - } - if (insert) { - addMerge(newRanges, newStyles, newRanges.length, modifyStart, modifyStart); - return; - } - modifyEnd = modifyStart; - int[] mergeRanges = new int[6]; - StyleRange[] mergeStyles = new StyleRange[3]; - for (int i = 0; i < newRanges.length; i += 2) { - int newStart = newRanges[i]; - int newEnd = newStart + newRanges[i + 1]; - if (newStart == newEnd) continue; - int modifyLast = 0, mergeCount = 0; - while (modifyEnd < rangeCount) { - if (newStart >= ranges[modifyStart] + ranges[modifyStart + 1]) modifyStart += 2; - if (ranges[modifyEnd] + ranges[modifyEnd + 1] > newEnd) break; - modifyEnd += 2; - } - if (ranges[modifyStart] < newStart && newStart < ranges[modifyStart] + ranges[modifyStart + 1]) { - mergeStyles[mergeCount >> 1] = styles[modifyStart >> 1]; - mergeRanges[mergeCount] = ranges[modifyStart]; - mergeRanges[mergeCount + 1] = newStart - ranges[modifyStart]; - mergeCount += 2; - } - mergeStyles[mergeCount >> 1] = newStyles[i >> 1]; - mergeRanges[mergeCount] = newStart; - mergeRanges[mergeCount + 1] = newRanges[i + 1]; - mergeCount += 2; - if (modifyEnd < rangeCount && ranges[modifyEnd] < newEnd && newEnd < ranges[modifyEnd] + ranges[modifyEnd + 1]) { - mergeStyles[mergeCount >> 1] = styles[modifyEnd >> 1]; - mergeRanges[mergeCount] = newEnd; - mergeRanges[mergeCount + 1] = ranges[modifyEnd] + ranges[modifyEnd + 1] - newEnd; - mergeCount += 2; - modifyLast = 2; - } - int grow = addMerge(mergeRanges, mergeStyles, mergeCount, modifyStart, modifyEnd + modifyLast); - rangeCount += grow; - modifyStart = modifyEnd += grow; - } - } else { - int start = newStyles[0].start; - int modifyStart = getRangeIndex(start, -1, styleCount), modifyEnd; - boolean insert = modifyStart == styleCount; - if (!insert) { - int end = newStyles[newStyles.length - 1].start + newStyles[newStyles.length - 1].length; - modifyEnd = getRangeIndex(end, modifyStart - 1, styleCount); - insert = modifyStart == modifyEnd && styles[modifyStart].start >= end; - } - if (insert) { - addMerge(newStyles, newStyles.length, modifyStart, modifyStart); - return; - } - modifyEnd = modifyStart; - StyleRange[] mergeStyles = new StyleRange[3]; - for (int i = 0; i < newStyles.length; i++) { - StyleRange newStyle = newStyles[i], style; - int newStart = newStyle.start; - int newEnd = newStart + newStyle.length; - if (newStart == newEnd) continue; - int modifyLast = 0, mergeCount = 0; - while (modifyEnd < styleCount) { - if (newStart >= styles[modifyStart].start + styles[modifyStart].length) modifyStart++; - if (styles[modifyEnd].start + styles[modifyEnd].length > newEnd) break; - modifyEnd++; - } - style = styles[modifyStart]; - if (style.start < newStart && newStart < style.start + style.length) { - style = mergeStyles[mergeCount++] = (StyleRange)style.clone(); - style.length = newStart - style.start; - } - mergeStyles[mergeCount++] = newStyle; - if (modifyEnd < styleCount) { - style = styles[modifyEnd]; - if (style.start < newEnd && newEnd < style.start + style.length) { - style = mergeStyles[mergeCount++] = (StyleRange)style.clone(); - style.length += style.start - newEnd; - style.start = newEnd; - modifyLast = 1; - } - } - int grow = addMerge(mergeStyles, mergeCount, modifyStart, modifyEnd + modifyLast); - modifyStart = modifyEnd += grow; - } - } -} -void textChanging(TextChangingEvent event) { - int start = event.start; - int newCharCount = event.newCharCount, replaceCharCount = event.replaceCharCount; - int newLineCount = event.newLineCount, replaceLineCount = event.replaceLineCount; - - updateRanges(start, replaceCharCount, newCharCount); - - int startLine = content.getLineAtOffset(start); - if (replaceCharCount == content.getCharCount()) lines = null; - if (replaceLineCount == lineCount) { - lineCount = newLineCount; - lineWidth = new int[lineCount]; - lineHeight = new int[lineCount]; - reset(0, lineCount); - } else { - int delta = newLineCount - replaceLineCount; - if (lineCount + delta > lineWidth.length) { - int[] newWidths = new int[lineCount + delta + GROW]; - System.arraycopy(lineWidth, 0, newWidths, 0, lineCount); - lineWidth = newWidths; - int[] newHeights = new int[lineCount + delta + GROW]; - System.arraycopy(lineHeight, 0, newHeights, 0, lineCount); - lineHeight = newHeights; - } - if (lines != null) { - if (lineCount + delta > lines.length) { - LineInfo[] newLines = new LineInfo[lineCount + delta + GROW]; - System.arraycopy(lines, 0, newLines, 0, lineCount); - lines = newLines; - } - } - int startIndex = startLine + replaceLineCount + 1; - int endIndex = startLine + newLineCount + 1; - System.arraycopy(lineWidth, startIndex, lineWidth, endIndex, lineCount - startIndex); - System.arraycopy(lineHeight, startIndex, lineHeight, endIndex, lineCount - startIndex); - for (int i = startLine; i < endIndex; i++) { - lineWidth[i] = lineHeight[i] = -1; - } - for (int i = lineCount + delta; i < lineCount; i++) { - lineWidth[i] = lineHeight[i] = -1; - } - if (layouts != null) { - int layoutStartLine = startLine - topIndex; - int layoutEndLine = layoutStartLine + replaceLineCount + 1; - for (int i = layoutStartLine; i < layoutEndLine; i++) { - if (0 <= i && i < layouts.length) { - if (layouts[i] != null) layouts[i].dispose(); - layouts[i] = null; - if (bullets != null && bulletsIndices != null) bullets[i] = null; - } - } - if (delta > 0) { - for (int i = layouts.length - 1; i >= layoutEndLine; i--) { - if (0 <= i && i < layouts.length) { - endIndex = i + delta; - if (0 <= endIndex && endIndex < layouts.length) { - layouts[endIndex] = layouts[i]; - layouts[i] = null; - if (bullets != null && bulletsIndices != null) { - bullets[endIndex] = bullets[i]; - bulletsIndices[endIndex] = bulletsIndices[i]; - bullets[i] = null; - } - } else { - if (layouts[i] != null) layouts[i].dispose(); - layouts[i] = null; - if (bullets != null && bulletsIndices != null) bullets[i] = null; - } - } - } - } else if (delta < 0) { - for (int i = layoutEndLine; i < layouts.length; i++) { - if (0 <= i && i < layouts.length) { - endIndex = i + delta; - if (0 <= endIndex && endIndex < layouts.length) { - layouts[endIndex] = layouts[i]; - layouts[i] = null; - if (bullets != null && bulletsIndices != null) { - bullets[endIndex] = bullets[i]; - bulletsIndices[endIndex] = bulletsIndices[i]; - bullets[i] = null; - } - } else { - if (layouts[i] != null) layouts[i].dispose(); - layouts[i] = null; - if (bullets != null && bulletsIndices != null) bullets[i] = null; - } - } - } - } - } - if (replaceLineCount != 0 || newLineCount != 0) { - int startLineOffset = content.getOffsetAtLine(startLine); - if (startLineOffset != start) startLine++; - updateBullets(startLine, replaceLineCount, newLineCount, true); - if (lines != null) { - startIndex = startLine + replaceLineCount; - endIndex = startLine + newLineCount; - System.arraycopy(lines, startIndex, lines, endIndex, lineCount - startIndex); - for (int i = startLine; i < endIndex; i++) { - lines[i] = null; - } - for (int i = lineCount + delta; i < lineCount; i++) { - lines[i] = null; - } - } - } - lineCount += delta; - if (maxWidthLineIndex != -1 && startLine <= maxWidthLineIndex && maxWidthLineIndex <= startLine + replaceLineCount) { - maxWidth = 0; - maxWidthLineIndex = -1; - for (int i = 0; i < lineCount; i++) { - if (lineWidth[i] > maxWidth) { - maxWidth = lineWidth[i]; - maxWidthLineIndex = i; - } - } - } - } -} -void updateBullets(int startLine, int replaceLineCount, int newLineCount, boolean update) { - if (bullets == null) return; - if (bulletsIndices != null) return; - for (int i = 0; i < bullets.length; i++) { - Bullet bullet = bullets[i]; - int[] lines = bullet.removeIndices(startLine, replaceLineCount, newLineCount, update); - if (lines != null) { - if (redrawLines == null) { - redrawLines = lines; - } else { - int[] newRedrawBullets = new int[redrawLines.length + lines.length]; - System.arraycopy(redrawLines, 0, newRedrawBullets, 0, redrawLines.length); - System.arraycopy(lines, 0, newRedrawBullets, redrawLines.length, lines.length); - redrawLines = newRedrawBullets; - } - } - } - int removed = 0; - for (int i = 0; i < bullets.length; i++) { - if (bullets[i].size() == 0) removed++; - } - if (removed > 0) { - if (removed == bullets.length) { - bullets = null; - } else { - Bullet[] newBulletsList = new Bullet[bullets.length - removed]; - for (int i = 0, j = 0; i < bullets.length; i++) { - Bullet bullet = bullets[i]; - if (bullet.size() > 0) newBulletsList[j++] = bullet; - } - bullets = newBulletsList; - } - } -} -void updateRanges(int start, int replaceCharCount, int newCharCount) { - if (styleCount == 0 || (replaceCharCount == 0 && newCharCount == 0)) return; - if (ranges != null) { - int rangeCount = styleCount << 1; - int modifyStart = getRangeIndex(start, -1, rangeCount); - if (modifyStart == rangeCount) return; - int end = start + replaceCharCount; - int modifyEnd = getRangeIndex(end, modifyStart - 1, rangeCount); - int offset = newCharCount - replaceCharCount; - if (modifyStart == modifyEnd && ranges[modifyStart] < start && end < ranges[modifyEnd] + ranges[modifyEnd + 1]) { - if (newCharCount == 0) { - ranges[modifyStart + 1] -= replaceCharCount; - modifyEnd += 2; - } else { - if (rangeCount + 2 > ranges.length) { - int[] newRanges = new int[ranges.length + (GROW << 1)]; - System.arraycopy(ranges, 0, newRanges, 0, rangeCount); - ranges = newRanges; - StyleRange[] newStyles = new StyleRange[styles.length + GROW]; - System.arraycopy(styles, 0, newStyles, 0, styleCount); - styles = newStyles; - } - System.arraycopy(ranges, modifyStart + 2, ranges, modifyStart + 4, rangeCount - (modifyStart + 2)); - System.arraycopy(styles, (modifyStart + 2) >> 1, styles, (modifyStart + 4) >> 1, styleCount - ((modifyStart + 2) >> 1)); - ranges[modifyStart + 3] = ranges[modifyStart] + ranges[modifyStart + 1] - end; - ranges[modifyStart + 2] = start + newCharCount; - ranges[modifyStart + 1] = start - ranges[modifyStart]; - styles[(modifyStart >> 1) + 1] = styles[modifyStart >> 1]; - rangeCount += 2; - styleCount++; - modifyEnd += 4; - } - if (offset != 0) { - for (int i = modifyEnd; i < rangeCount; i += 2) { - ranges[i] += offset; - } - } - } else { - if (ranges[modifyStart] < start && start < ranges[modifyStart] + ranges[modifyStart + 1]) { - ranges[modifyStart + 1] = start - ranges[modifyStart]; - modifyStart += 2; - } - if (modifyEnd < rangeCount && ranges[modifyEnd] < end && end < ranges[modifyEnd] + ranges[modifyEnd + 1]) { - ranges[modifyEnd + 1] = ranges[modifyEnd] + ranges[modifyEnd + 1] - end; - ranges[modifyEnd] = end; - } - if (offset != 0) { - for (int i = modifyEnd; i < rangeCount; i += 2) { - ranges[i] += offset; - } - } - System.arraycopy(ranges, modifyEnd, ranges, modifyStart, rangeCount - modifyEnd); - System.arraycopy(styles, modifyEnd >> 1, styles, modifyStart >> 1, styleCount - (modifyEnd >> 1)); - styleCount -= (modifyEnd - modifyStart) >> 1; - } - } else { - int modifyStart = getRangeIndex(start, -1, styleCount); - if (modifyStart == styleCount) return; - int end = start + replaceCharCount; - int modifyEnd = getRangeIndex(end, modifyStart - 1, styleCount); - int offset = newCharCount - replaceCharCount; - if (modifyStart == modifyEnd && styles[modifyStart].start < start && end < styles[modifyEnd].start + styles[modifyEnd].length) { - if (newCharCount == 0) { - styles[modifyStart].length -= replaceCharCount; - modifyEnd++; - } else { - if (styleCount + 1 > styles.length) { - StyleRange[] newStyles = new StyleRange[styles.length + GROW]; - System.arraycopy(styles, 0, newStyles, 0, styleCount); - styles = newStyles; - } - System.arraycopy(styles, modifyStart + 1, styles, modifyStart + 2, styleCount - (modifyStart + 1)); - styles[modifyStart + 1] = (StyleRange)styles[modifyStart].clone(); - styles[modifyStart + 1].length = styles[modifyStart].start + styles[modifyStart].length - end; - styles[modifyStart + 1].start = start + newCharCount; - styles[modifyStart].length = start - styles[modifyStart].start; - styleCount++; - modifyEnd += 2; - } - if (offset != 0) { - for (int i = modifyEnd; i < styleCount; i++) { - styles[i].start += offset; - } - } - } else { - if (styles[modifyStart].start < start && start < styles[modifyStart].start + styles[modifyStart].length) { - styles[modifyStart].length = start - styles[modifyStart].start; - modifyStart++; - } - if (modifyEnd < styleCount && styles[modifyEnd].start < end && end < styles[modifyEnd].start + styles[modifyEnd].length) { - styles[modifyEnd].length = styles[modifyEnd].start + styles[modifyEnd].length - end; - styles[modifyEnd].start = end; - } - if (offset != 0) { - for (int i = modifyEnd; i < styleCount; i++) { - styles[i].start += offset; - } - } - System.arraycopy(styles, modifyEnd, styles, modifyStart, styleCount - modifyEnd); - styleCount -= modifyEnd - modifyStart; - } - } -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableCursor.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableCursor.java deleted file mode 100644 index 0408aa5fd7..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableCursor.java +++ /dev/null @@ -1,778 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.accessibility.*; -import org.eclipse.swt.events.*; - -/** - * A TableCursor provides a way for the user to navigate around a Table - * using the keyboard. It also provides a mechanism for selecting an - * individual cell in a table. - * - *

    Here is an example of using a TableCursor to navigate to a cell and then edit it. - * - *

    - *  public static void main(String[] args) {
    - *		Display display = new Display();
    - *		Shell shell = new Shell(display);
    - *		shell.setLayout(new GridLayout());
    - *	
    - *		// create a a table with 3 columns and fill with data
    - *		final Table table = new Table(shell, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
    - *		table.setLayoutData(new GridData(GridData.FILL_BOTH));
    - *		TableColumn column1 = new TableColumn(table, SWT.NONE);
    - *		TableColumn column2 = new TableColumn(table, SWT.NONE);
    - *		TableColumn column3 = new TableColumn(table, SWT.NONE);
    - *		for (int i = 0; i < 100; i++) {
    - *			TableItem item = new TableItem(table, SWT.NONE);
    - *			item.setText(new String[] { "cell "+i+" 0", "cell "+i+" 1", "cell "+i+" 2"});
    - *		}
    - *		column1.pack();
    - *		column2.pack();
    - *		column3.pack();
    - *	
    - *		// create a TableCursor to navigate around the table
    - *		final TableCursor cursor = new TableCursor(table, SWT.NONE);
    - *		// create an editor to edit the cell when the user hits "ENTER" 
    - *		// while over a cell in the table
    - *		final ControlEditor editor = new ControlEditor(cursor);
    - *		editor.grabHorizontal = true;
    - *		editor.grabVertical = true;
    - *	
    - *		cursor.addSelectionListener(new SelectionAdapter() {
    - *			// when the TableEditor is over a cell, select the corresponding row in 
    - *			// the table
    - *			public void widgetSelected(SelectionEvent e) {
    - *				table.setSelection(new TableItem[] {cursor.getRow()});
    - *			}
    - *			// when the user hits "ENTER" in the TableCursor, pop up a text editor so that 
    - *			// they can change the text of the cell
    - *			public void widgetDefaultSelected(SelectionEvent e){
    - *				final Text text = new Text(cursor, SWT.NONE);
    - *				TableItem row = cursor.getRow();
    - *				int column = cursor.getColumn();
    - *				text.setText(row.getText(column));
    - *				text.addKeyListener(new KeyAdapter() {
    - *					public void keyPressed(KeyEvent e) {
    - *						// close the text editor and copy the data over 
    - *						// when the user hits "ENTER"
    - *						if (e.character == SWT.CR) {
    - *							TableItem row = cursor.getRow();
    - *							int column = cursor.getColumn();
    - *							row.setText(column, text.getText());
    - *							text.dispose();
    - *						}
    - *						// close the text editor when the user hits "ESC"
    - *						if (e.character == SWT.ESC) {
    - *							text.dispose();
    - *						}
    - *					}
    - *				});
    - *				editor.setEditor(text);
    - *				text.setFocus();
    - *			}
    - *		});
    - *		// Hide the TableCursor when the user hits the "MOD1" or "MOD2" key.
    - *		// This allows the user to select multiple items in the table.
    - *		cursor.addKeyListener(new KeyAdapter() {
    - *			public void keyPressed(KeyEvent e) {
    - *				if (e.keyCode == SWT.MOD1 || 
    - *				    e.keyCode == SWT.MOD2 || 
    - *				    (e.stateMask & SWT.MOD1) != 0 || 
    - *				    (e.stateMask & SWT.MOD2) != 0) {
    - *					cursor.setVisible(false);
    - *				}
    - *			}
    - *		});
    - *		// Show the TableCursor when the user releases the "MOD2" or "MOD1" key.
    - *		// This signals the end of the multiple selection task.
    - *		table.addKeyListener(new KeyAdapter() {
    - *			public void keyReleased(KeyEvent e) {
    - *				if (e.keyCode == SWT.MOD1 && (e.stateMask & SWT.MOD2) != 0) return;
    - *				if (e.keyCode == SWT.MOD2 && (e.stateMask & SWT.MOD1) != 0) return;
    - *				if (e.keyCode != SWT.MOD1 && (e.stateMask & SWT.MOD1) != 0) return;
    - *				if (e.keyCode != SWT.MOD2 && (e.stateMask & SWT.MOD2) != 0) return;
    - *			
    - *				TableItem[] selection = table.getSelection();
    - *				TableItem row = (selection.length == 0) ? table.getItem(table.getTopIndex()) : selection[0];
    - *				table.showItem(row);
    - *				cursor.setSelection(row, 0);
    - *				cursor.setVisible(true);
    - *				cursor.setFocus();
    - *			}
    - *		});
    - *	
    - *		shell.open();
    - *		while (!shell.isDisposed()) {
    - *			if (!display.readAndDispatch())
    - *				display.sleep();
    - *		}
    - *		display.dispose();
    - *	}
    - * 
    - * - *
    - *
    Styles:
    - *
    BORDER
    - *
    Events:
    - *
    Selection, DefaultSelection
    - *
    - * - * @since 2.0 - * - * @see TableCursor snippets - * @see Sample code and further information - */ -public class TableCursor extends Canvas { - Table table; - TableItem row = null; - TableColumn column = null; - Listener listener, tableListener, resizeListener, disposeItemListener, disposeColumnListener; - - Color background = null; - Color foreground = null; - - // By default, invert the list selection colors - static final int BACKGROUND = SWT.COLOR_LIST_SELECTION_TEXT; - static final int FOREGROUND = SWT.COLOR_LIST_SELECTION; - -/** - * Constructs a new instance of this class given its parent - * table and a style value describing its behavior and appearance. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a Table control which will be the parent of the new instance (cannot be null) - * @param style the style of control to construct - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    • ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass
    • - *
    - * - * @see SWT#BORDER - * @see Widget#checkSubclass() - * @see Widget#getStyle() - */ -public TableCursor(Table parent, int style) { - super(parent, style); - table = parent; - setBackground(null); - setForeground(null); - - listener = new Listener() { - public void handleEvent(Event event) { - switch (event.type) { - case SWT.Dispose : - onDispose(event); - break; - case SWT.FocusIn : - case SWT.FocusOut : - redraw(); - break; - case SWT.KeyDown : - keyDown(event); - break; - case SWT.Paint : - paint(event); - break; - case SWT.Traverse : { - event.doit = true; - switch (event.detail) { - case SWT.TRAVERSE_ARROW_NEXT : - case SWT.TRAVERSE_ARROW_PREVIOUS : - case SWT.TRAVERSE_RETURN : - event.doit = false; - break; - } - break; - } - } - } - }; - int[] events = new int[] {SWT.Dispose, SWT.FocusIn, SWT.FocusOut, SWT.KeyDown, SWT.Paint, SWT.Traverse}; - for (int i = 0; i < events.length; i++) { - addListener(events[i], listener); - } - - tableListener = new Listener() { - public void handleEvent(Event event) { - switch (event.type) { - case SWT.MouseDown : - tableMouseDown(event); - break; - case SWT.FocusIn : - tableFocusIn(event); - break; - } - } - }; - table.addListener(SWT.FocusIn, tableListener); - table.addListener(SWT.MouseDown, tableListener); - - disposeItemListener = new Listener() { - public void handleEvent(Event event) { - unhookRowColumnListeners(); - row = null; - column = null; - _resize(); - } - }; - disposeColumnListener = new Listener() { - public void handleEvent(Event event) { - unhookRowColumnListeners(); - row = null; - column = null; - _resize(); - } - }; - resizeListener = new Listener() { - public void handleEvent(Event event) { - _resize(); - } - }; - ScrollBar hBar = table.getHorizontalBar(); - if (hBar != null) { - hBar.addListener(SWT.Selection, resizeListener); - } - ScrollBar vBar = table.getVerticalBar(); - if (vBar != null) { - vBar.addListener(SWT.Selection, resizeListener); - } - - getAccessible().addAccessibleControlListener(new AccessibleControlAdapter() { - public void getRole(AccessibleControlEvent e) { - e.detail = ACC.ROLE_TABLECELL; - } - }); - getAccessible().addAccessibleListener(new AccessibleAdapter() { - public void getName(AccessibleEvent e) { - if (row == null) return; - int columnIndex = column == null ? 0 : table.indexOf(column); - e.result = row.getText(columnIndex); - } - }); -} - -/** - * Adds the listener to the collection of listeners who will - * be notified when the user changes the receiver's selection, by sending - * it one of the messages defined in the SelectionListener - * interface. - *

    - * When widgetSelected is called, the item field of the event object is valid. - * If the receiver has SWT.CHECK style set and the check selection changes, - * the event object detail field contains the value SWT.CHECK. - * widgetDefaultSelected is typically called when an item is double-clicked. - *

    - * - * @param listener the listener which should be notified when the user changes the receiver's selection - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see SelectionListener - * @see SelectionEvent - * @see #removeSelectionListener(SelectionListener) - * - */ -public void addSelectionListener(SelectionListener listener) { - checkWidget(); - if (listener == null) - SWT.error(SWT.ERROR_NULL_ARGUMENT); - TypedListener typedListener = new TypedListener(listener); - addListener(SWT.Selection, typedListener); - addListener(SWT.DefaultSelection, typedListener); -} - -void onDispose(Event event) { - removeListener(SWT.Dispose, listener); - notifyListeners(SWT.Dispose, event); - event.type = SWT.None; - - table.removeListener(SWT.FocusIn, tableListener); - table.removeListener(SWT.MouseDown, tableListener); - unhookRowColumnListeners(); - ScrollBar hBar = table.getHorizontalBar(); - if (hBar != null) { - hBar.removeListener(SWT.Selection, resizeListener); - } - ScrollBar vBar = table.getVerticalBar(); - if (vBar != null) { - vBar.removeListener(SWT.Selection, resizeListener); - } -} - -void keyDown(Event event) { - if (row == null) return; - switch (event.character) { - case SWT.CR : - notifyListeners(SWT.DefaultSelection, new Event()); - return; - } - int rowIndex = table.indexOf(row); - int columnIndex = column == null ? 0 : table.indexOf(column); - switch (event.keyCode) { - case SWT.ARROW_UP : - setRowColumn(Math.max(0, rowIndex - 1), columnIndex, true); - break; - case SWT.ARROW_DOWN : - setRowColumn(Math.min(rowIndex + 1, table.getItemCount() - 1), columnIndex, true); - break; - case SWT.ARROW_LEFT : - case SWT.ARROW_RIGHT : - { - int columnCount = table.getColumnCount(); - if (columnCount == 0) break; - int[] order = table.getColumnOrder(); - int index = 0; - while (index < order.length) { - if (order[index] == columnIndex) break; - index++; - } - if (index == order.length) index = 0; - int leadKey = (getStyle() & SWT.RIGHT_TO_LEFT) != 0 ? SWT.ARROW_RIGHT : SWT.ARROW_LEFT; - if (event.keyCode == leadKey) { - setRowColumn(rowIndex, order[Math.max(0, index - 1)], true); - } else { - setRowColumn(rowIndex, order[Math.min(columnCount - 1, index + 1)], true); - } - break; - } - case SWT.HOME : - setRowColumn(0, columnIndex, true); - break; - case SWT.END : - { - int i = table.getItemCount() - 1; - setRowColumn(i, columnIndex, true); - break; - } - case SWT.PAGE_UP : - { - int index = table.getTopIndex(); - if (index == rowIndex) { - Rectangle rect = table.getClientArea(); - TableItem item = table.getItem(index); - Rectangle itemRect = item.getBounds(0); - rect.height -= itemRect.y; - int height = table.getItemHeight(); - int page = Math.max(1, rect.height / height); - index = Math.max(0, index - page + 1); - } - setRowColumn(index, columnIndex, true); - break; - } - case SWT.PAGE_DOWN : - { - int index = table.getTopIndex(); - Rectangle rect = table.getClientArea(); - TableItem item = table.getItem(index); - Rectangle itemRect = item.getBounds(0); - rect.height -= itemRect.y; - int height = table.getItemHeight(); - int page = Math.max(1, rect.height / height); - int end = table.getItemCount() - 1; - index = Math.min(end, index + page - 1); - if (index == rowIndex) { - index = Math.min(end, index + page - 1); - } - setRowColumn(index, columnIndex, true); - break; - } - } -} - -void paint(Event event) { - if (row == null) return; - int columnIndex = column == null ? 0 : table.indexOf(column); - GC gc = event.gc; - Display display = getDisplay(); - gc.setBackground(getBackground()); - gc.setForeground(getForeground()); - gc.fillRectangle(event.x, event.y, event.width, event.height); - int x = 0; - Point size = getSize(); - Image image = row.getImage(columnIndex); - if (image != null) { - Rectangle imageSize = image.getBounds(); - int imageY = (size.y - imageSize.height) / 2; - gc.drawImage(image, x, imageY); - x += imageSize.width; - } - String text = row.getText(columnIndex); - if (text.length() > 0) { - Rectangle bounds = row.getBounds(columnIndex); - Point extent = gc.stringExtent(text); - // Temporary code - need a better way to determine table trim - String platform = SWT.getPlatform(); - if ("win32".equals(platform)) { //$NON-NLS-1$ - if (table.getColumnCount() == 0 || columnIndex == 0) { - x += 2; - } else { - int alignmnent = column.getAlignment(); - switch (alignmnent) { - case SWT.LEFT: - x += 6; - break; - case SWT.RIGHT: - x = bounds.width - extent.x - 6; - break; - case SWT.CENTER: - x += (bounds.width - x - extent.x) / 2; - break; - } - } - } else { - if (table.getColumnCount() == 0) { - x += 5; - } else { - int alignmnent = column.getAlignment(); - switch (alignmnent) { - case SWT.LEFT: - x += 5; - break; - case SWT.RIGHT: - x = bounds.width- extent.x - 2; - break; - case SWT.CENTER: - x += (bounds.width - x - extent.x) / 2 + 2; - break; - } - } - } - int textY = (size.y - extent.y) / 2; - gc.drawString(text, x, textY); - } - if (isFocusControl()) { - gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK)); - gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE)); - gc.drawFocus(0, 0, size.x, size.y); - } -} - -void tableFocusIn(Event event) { - if (isDisposed()) return; - if (isVisible()) { - if (row == null && column == null) return; - setFocus(); - } -} - -void tableMouseDown(Event event) { - if (isDisposed() || !isVisible()) return; - Point pt = new Point(event.x, event.y); - int lineWidth = table.getLinesVisible() ? table.getGridLineWidth() : 0; - TableItem item = table.getItem(pt); - if ((table.getStyle() & SWT.FULL_SELECTION) != 0) { - if (item == null) return; - } else { - int start = item != null ? table.indexOf(item) : table.getTopIndex(); - int end = table.getItemCount(); - Rectangle clientRect = table.getClientArea(); - for (int i = start; i < end; i++) { - TableItem nextItem = table.getItem(i); - Rectangle rect = nextItem.getBounds(0); - if (pt.y >= rect.y && pt.y < rect.y + rect.height + lineWidth) { - item = nextItem; - break; - } - if (rect.y > clientRect.y + clientRect.height) return; - } - if (item == null) return; - } - TableColumn newColumn = null; - int columnCount = table.getColumnCount(); - if (columnCount == 0) { - if ((table.getStyle() & SWT.FULL_SELECTION) == 0) { - Rectangle rect = item.getBounds(0); - rect.width += lineWidth; - rect.height += lineWidth; - if (!rect.contains(pt)) return; - } - } else { - for (int i = 0; i < columnCount; i++) { - Rectangle rect = item.getBounds(i); - rect.width += lineWidth; - rect.height += lineWidth; - if (rect.contains(pt)) { - newColumn = table.getColumn(i); - break; - } - } - if (newColumn == null) { - if ((table.getStyle() & SWT.FULL_SELECTION) == 0) return; - newColumn = table.getColumn(0); - } - } - setRowColumn(item, newColumn, true); - setFocus(); - return; -} -void setRowColumn(int row, int column, boolean notify) { - TableItem item = row == -1 ? null : table.getItem(row); - TableColumn col = column == -1 || table.getColumnCount() == 0 ? null : table.getColumn(column); - setRowColumn(item, col, notify); -} -void setRowColumn(TableItem row, TableColumn column, boolean notify) { - if (this.row == row && this.column == column) { - return; - } - if (this.row != null && this.row != row) { - this.row.removeListener(SWT.Dispose, disposeItemListener); - this.row = null; - } - if (this.column != null && this.column != column) { - this.column.removeListener(SWT.Dispose, disposeColumnListener); - this.column.removeListener(SWT.Move, resizeListener); - this.column.removeListener(SWT.Resize, resizeListener); - this.column = null; - } - if (row != null) { - if (this.row != row) { - this.row = row; - row.addListener(SWT.Dispose, disposeItemListener); - table.showItem(row); - } - if (this.column != column && column != null) { - this.column = column; - column.addListener(SWT.Dispose, disposeColumnListener); - column.addListener(SWT.Move, resizeListener); - column.addListener(SWT.Resize, resizeListener); - table.showColumn(column); - } - int columnIndex = column == null ? 0 : table.indexOf(column); - setBounds(row.getBounds(columnIndex)); - redraw(); - if (notify) { - notifyListeners(SWT.Selection, new Event()); - } - } - getAccessible().setFocus(ACC.CHILDID_SELF); -} - -public void setVisible(boolean visible) { - checkWidget(); - if (visible) _resize(); - super.setVisible(visible); -} - -/** - * Removes the listener from the collection of listeners who will - * be notified when the user changes the receiver's selection. - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see SelectionListener - * @see #addSelectionListener(SelectionListener) - * - * @since 3.0 - */ -public void removeSelectionListener(SelectionListener listener) { - checkWidget(); - if (listener == null) { - SWT.error(SWT.ERROR_NULL_ARGUMENT); - } - removeListener(SWT.Selection, listener); - removeListener(SWT.DefaultSelection, listener); -} - -void _resize() { - if (row == null) { - setBounds(-200, -200, 0, 0); - } else { - int columnIndex = column == null ? 0 : table.indexOf(column); - setBounds(row.getBounds(columnIndex)); - } -} -/** - * Returns the column over which the TableCursor is positioned. - * - * @return the column for the current position - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public int getColumn() { - checkWidget(); - return column == null ? 0 : table.indexOf(column); -} -/** - * Returns the background color that the receiver will use to draw. - * - * @return the receiver's background color - */ -public Color getBackground() { - checkWidget(); - if (background == null) { - return getDisplay().getSystemColor(BACKGROUND); - } - return background; -} -/** - * Returns the foreground color that the receiver will use to draw. - * - * @return the receiver's foreground color - */ -public Color getForeground() { - checkWidget(); - if (foreground == null) { - return getDisplay().getSystemColor(FOREGROUND); - } - return foreground; -} -/** - * Returns the row over which the TableCursor is positioned. - * - * @return the item for the current position - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public TableItem getRow() { - checkWidget(); - return row; -} -/** - * Sets the receiver's background color to the color specified - * by the argument, or to the default system color for the control - * if the argument is null. - *

    - * Note: This operation is a hint and may be overridden by the platform. - * For example, on Windows the background of a Button cannot be changed. - *

    - * @param color the new color (or null) - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT - if the argument has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setBackground (Color color) { - background = color; - super.setBackground(getBackground()); - redraw(); -} -/** - * Sets the receiver's foreground color to the color specified - * by the argument, or to the default system color for the control - * if the argument is null. - *

    - * Note: This operation is a hint and may be overridden by the platform. - *

    - * @param color the new color (or null) - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT - if the argument has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setForeground (Color color) { - foreground = color; - super.setForeground(getForeground()); - redraw(); -} -/** - * Positions the TableCursor over the cell at the given row and column in the parent table. - * - * @param row the index of the row for the cell to select - * @param column the index of column for the cell to select - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - */ -public void setSelection(int row, int column) { - checkWidget(); - int columnCount = table.getColumnCount(); - int maxColumnIndex = columnCount == 0 ? 0 : columnCount - 1; - if (row < 0 - || row >= table.getItemCount() - || column < 0 - || column > maxColumnIndex) - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - setRowColumn(row, column, false); -} -/** - * Positions the TableCursor over the cell at the given row and column in the parent table. - * - * @param row the TableItem of the row for the cell to select - * @param column the index of column for the cell to select - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - */ -public void setSelection(TableItem row, int column) { - checkWidget(); - int columnCount = table.getColumnCount(); - int maxColumnIndex = columnCount == 0 ? 0 : columnCount - 1; - if (row == null - || row.isDisposed() - || column < 0 - || column > maxColumnIndex) - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - setRowColumn(table.indexOf(row), column, false); -} -void unhookRowColumnListeners() { - if (column != null) { - column.removeListener(SWT.Dispose, disposeColumnListener); - column.removeListener(SWT.Move, resizeListener); - column.removeListener(SWT.Resize, resizeListener); - column = null; - } - if (row != null) { - row.removeListener(SWT.Dispose, disposeItemListener); - row = null; - } -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableEditor.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableEditor.java deleted file mode 100755 index 2f57b5f0f0..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableEditor.java +++ /dev/null @@ -1,260 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -import org.eclipse.swt.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** -* -* A TableEditor is a manager for a Control that appears above a cell in a Table and tracks with the -* moving and resizing of that cell. It can be used to display a text widget above a cell -* in a Table so that the user can edit the contents of that cell. It can also be used to display -* a button that can launch a dialog for modifying the contents of the associated cell. -* -*

    Here is an example of using a TableEditor: -*

    -*	final Table table = new Table(shell, SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
    -*	TableColumn column1 = new TableColumn(table, SWT.NONE);
    -*	TableColumn column2 = new TableColumn(table, SWT.NONE);
    -*	for (int i = 0; i < 10; i++) {
    -*		TableItem item = new TableItem(table, SWT.NONE);
    -*		item.setText(new String[] {"item " + i, "edit this value"});
    -*	}
    -*	column1.pack();
    -*	column2.pack();
    -*	
    -*	final TableEditor editor = new TableEditor(table);
    -*	//The editor must have the same size as the cell and must
    -*	//not be any smaller than 50 pixels.
    -*	editor.horizontalAlignment = SWT.LEFT;
    -*	editor.grabHorizontal = true;
    -*	editor.minimumWidth = 50;
    -*	// editing the second column
    -*	final int EDITABLECOLUMN = 1;
    -*	
    -*	table.addSelectionListener(new SelectionAdapter() {
    -*		public void widgetSelected(SelectionEvent e) {
    -*			// Clean up any previous editor control
    -*			Control oldEditor = editor.getEditor();
    -*			if (oldEditor != null) oldEditor.dispose();
    -*	
    -*			// Identify the selected row
    -*			TableItem item = (TableItem)e.item;
    -*			if (item == null) return;
    -*	
    -*			// The control that will be the editor must be a child of the Table
    -*			Text newEditor = new Text(table, SWT.NONE);
    -*			newEditor.setText(item.getText(EDITABLECOLUMN));
    -*			newEditor.addModifyListener(new ModifyListener() {
    -*				public void modifyText(ModifyEvent e) {
    -*					Text text = (Text)editor.getEditor();
    -*					editor.getItem().setText(EDITABLECOLUMN, text.getText());
    -*				}
    -*			});
    -*			newEditor.selectAll();
    -*			newEditor.setFocus();
    -*			editor.setEditor(newEditor, item, EDITABLECOLUMN);
    -*		}
    -*	});
    -* 
    -* -* @see TableEditor snippets -* @see Sample code and further information -*/ -public class TableEditor extends ControlEditor { - Table table; - TableItem item; - int column = -1; - ControlListener columnListener; - Runnable timer; - static final int TIMEOUT = 1500; -/** -* Creates a TableEditor for the specified Table. -* -* @param table the Table Control above which this editor will be displayed -* -*/ -public TableEditor (Table table) { - super(table); - this.table = table; - - columnListener = new ControlListener() { - public void controlMoved(ControlEvent e){ - layout (); - } - public void controlResized(ControlEvent e){ - layout (); - } - }; - timer = new Runnable () { - public void run() { - layout (); - } - }; - - // To be consistent with older versions of SWT, grabVertical defaults to true - grabVertical = true; -} -Rectangle computeBounds () { - if (item == null || column == -1 || item.isDisposed()) return new Rectangle(0, 0, 0, 0); - Rectangle cell = item.getBounds(column); - Rectangle rect = item.getImageBounds(column); - cell.x = rect.x + rect.width; - cell.width -= rect.width; - Rectangle area = table.getClientArea(); - if (cell.x < area.x + area.width) { - if (cell.x + cell.width > area.x + area.width) { - cell.width = area.x + area.width - cell.x; - } - } - Rectangle editorRect = new Rectangle(cell.x, cell.y, minimumWidth, minimumHeight); - - if (grabHorizontal) { - editorRect.width = Math.max(cell.width, minimumWidth); - } - - if (grabVertical) { - editorRect.height = Math.max(cell.height, minimumHeight); - } - - if (horizontalAlignment == SWT.RIGHT) { - editorRect.x += cell.width - editorRect.width; - } else if (horizontalAlignment == SWT.LEFT) { - // do nothing - cell.x is the right answer - } else { // default is CENTER - editorRect.x += (cell.width - editorRect.width)/2; - } - - if (verticalAlignment == SWT.BOTTOM) { - editorRect.y += cell.height - editorRect.height; - } else if (verticalAlignment == SWT.TOP) { - // do nothing - cell.y is the right answer - } else { // default is CENTER - editorRect.y += (cell.height - editorRect.height)/2; - } - return editorRect; -} -/** - * Removes all associations between the TableEditor and the cell in the table. The - * Table and the editor Control are not disposed. - */ -public void dispose () { - if (table != null && !table.isDisposed()) { - if (this.column > -1 && this.column < table.getColumnCount()){ - TableColumn tableColumn = table.getColumn(this.column); - tableColumn.removeControlListener(columnListener); - } - } - columnListener = null; - table = null; - item = null; - column = -1; - timer = null; - super.dispose(); -} -/** -* Returns the zero based index of the column of the cell being tracked by this editor. -* -* @return the zero based index of the column of the cell being tracked by this editor -*/ -public int getColumn () { - return column; -} -/** -* Returns the TableItem for the row of the cell being tracked by this editor. -* -* @return the TableItem for the row of the cell being tracked by this editor -*/ -public TableItem getItem () { - return item; -} -void resize () { - layout(); - /* - * On some platforms, the table scrolls when an item that - * is partially visible at the bottom of the table is - * selected. Ensure that the correct row is edited by - * laying out one more time in a timerExec(). - */ - if (table != null) { - Display display = table.getDisplay(); - display.timerExec(-1, timer); - display.timerExec(TIMEOUT, timer); - } -} -/** -* Sets the zero based index of the column of the cell being tracked by this editor. -* -* @param column the zero based index of the column of the cell being tracked by this editor -*/ -public void setColumn(int column) { - int columnCount = table.getColumnCount(); - // Separately handle the case where the table has no TableColumns. - // In this situation, there is a single default column. - if (columnCount == 0) { - this.column = (column == 0) ? 0 : -1; - resize(); - return; - } - if (this.column > -1 && this.column < columnCount){ - TableColumn tableColumn = table.getColumn(this.column); - tableColumn.removeControlListener(columnListener); - this.column = -1; - } - - if (column < 0 || column >= table.getColumnCount()) return; - - this.column = column; - TableColumn tableColumn = table.getColumn(this.column); - tableColumn.addControlListener(columnListener); - resize(); -} -/** -* Specifies the TableItem that is to be edited. -* -* @param item the item to be edited -*/ -public void setItem (TableItem item) { - this.item = item; - resize(); -} -public void setEditor (Control editor) { - super.setEditor(editor); - resize(); -} -/** -* Specify the Control that is to be displayed and the cell in the table that it is to be positioned above. -* -*

    Note: The Control provided as the editor must be created with its parent being the Table control -* specified in the TableEditor constructor. -* -* @param editor the Control that is displayed above the cell being edited -* @param item the TableItem for the row of the cell being tracked by this editor -* @param column the zero based index of the column of the cell being tracked by this editor -*/ -public void setEditor (Control editor, TableItem item, int column) { - setItem(item); - setColumn(column); - setEditor(editor); -} -public void layout () { - if (table == null || table.isDisposed()) return; - if (item == null || item.isDisposed()) return; - int columnCount = table.getColumnCount(); - if (columnCount == 0 && column != 0) return; - if (columnCount > 0 && (column < 0 || column >= columnCount)) return; - super.layout(); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableTree.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableTree.java deleted file mode 100755 index 4ac4da4a09..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableTree.java +++ /dev/null @@ -1,818 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -import org.eclipse.swt.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * A TableTree is a selectable user interface object - * that displays a hierarchy of items, and issues - * notification when an item is selected. - * A TableTree may be single or multi select. - *

    - * The item children that may be added to instances of this class - * must be of type TableTreeItem. - *

    - * Note that although this class is a subclass of Composite, - * it does not make sense to add Control children to it, - * or set a layout on it. - *

    - *

    - *
    Styles:
    SINGLE, MULTI, CHECK, FULL_SELECTION - *
    Events:
    Selection, DefaultSelection, Collapse, Expand - *
    - *

    - * Note: Only one of the styles SINGLE, and MULTI may be specified. - *

    - * - * @deprecated As of 3.1 use Tree, TreeItem and TreeColumn - */ -public class TableTree extends Composite { - Table table; - TableTreeItem[] items = EMPTY_ITEMS; - Image plusImage, minusImage, sizeImage; - Listener listener; - - /* - * TableTreeItems are not treated as children but rather as items. - * When the TableTree is disposed, all children are disposed because - * TableTree inherits this behaviour from Composite. The items - * must be disposed separately. Because TableTree is not part of - * the org.eclipse.swt.widgets package, the method releaseWidget can - * not be overridden (this is how items are disposed of in Table and Tree). - * Instead, the items are disposed of in response to the dispose event on the - * TableTree. The "inDispose" flag is used to distinguish between disposing - * one TableTreeItem (e.g. when removing an entry from the TableTree) and - * disposing the entire TableTree. - */ - boolean inDispose = false; - - static final TableTreeItem[] EMPTY_ITEMS = new TableTreeItem [0]; - static final String[] EMPTY_TEXTS = new String [0]; - static final Image[] EMPTY_IMAGES = new Image [0]; - static final String ITEMID = "TableTreeItemID"; //$NON-NLS-1$ - -/** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    - * - * @see SWT#SINGLE - * @see SWT#MULTI - * @see SWT#CHECK - * @see SWT#FULL_SELECTION - * @see #getStyle - */ -public TableTree(Composite parent, int style) { - super(parent, checkStyle (style)); - table = new Table(this, style); - Listener tableListener = new Listener() { - public void handleEvent(Event e) { - switch (e.type) { - case SWT.MouseDown: onMouseDown(e); break; - case SWT.Selection: onSelection(e); break; - case SWT.DefaultSelection: onSelection(e); break; - case SWT.KeyDown: onKeyDown(e); break; - } - } - }; - int[] tableEvents = new int[]{SWT.MouseDown, - SWT.Selection, - SWT.DefaultSelection, - SWT.KeyDown}; - for (int i = 0; i < tableEvents.length; i++) { - table.addListener(tableEvents[i], tableListener); - } - - listener = new Listener() { - public void handleEvent(Event e) { - switch (e.type) { - case SWT.Dispose: onDispose(e); break; - case SWT.Resize: onResize(e); break; - case SWT.FocusIn: onFocusIn(e); break; - } - } - }; - int[] events = new int[]{SWT.Dispose, - SWT.Resize, - SWT.FocusIn}; - for (int i = 0; i < events.length; i++) { - addListener(events[i], listener); - } -} - -int addItem(TableTreeItem item, int index) { - if (index < 0 || index > items.length) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - TableTreeItem[] newItems = new TableTreeItem[items.length + 1]; - System.arraycopy(items, 0, newItems, 0, index); - newItems[index] = item; - System.arraycopy(items, index, newItems, index + 1, items.length - index); - items = newItems; - - /* Return the index in the table where this table should be inserted */ - if (index == items.length - 1 ) - return table.getItemCount(); - else - return table.indexOf(items[index+1].tableItem); -} - -/** - * Adds the listener to the collection of listeners who will - * be notified when the user changes the receiver's selection, by sending - * it one of the messages defined in the SelectionListener - * interface. - *

    - * When widgetSelected is called, the item field of the event object is valid. - * If the receiver has SWT.CHECK style set and the check selection changes, - * the event object detail field contains the value SWT.CHECK. - * widgetDefaultSelected is typically called when an item is double-clicked. - * The item field of the event object is valid for default selection, but the detail field is not used. - *

    - * - * @param listener the listener which should be notified when the user changes the receiver's selection - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see SelectionListener - * @see #removeSelectionListener - * @see SelectionEvent - */ -public void addSelectionListener(SelectionListener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - TypedListener typedListener = new TypedListener (listener); - addListener (SWT.Selection,typedListener); - addListener (SWT.DefaultSelection,typedListener); -} - -/** - * Adds the listener to the collection of listeners who will - * be notified when an item in the receiver is expanded or collapsed - * by sending it one of the messages defined in the TreeListener - * interface. - * - * @param listener the listener which should be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see TreeListener - * @see #removeTreeListener - */ -public void addTreeListener(TreeListener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - TypedListener typedListener = new TypedListener (listener); - addListener (SWT.Expand, typedListener); - addListener (SWT.Collapse, typedListener); -} -private static int checkStyle (int style) { - int mask = SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT; - style = style & mask; - return style; -} -public Point computeSize (int wHint, int hHint, boolean changed) { - checkWidget(); - return table.computeSize (wHint, hHint, changed); -} -public Rectangle computeTrim (int x, int y, int width, int height) { - checkWidget(); - return table.computeTrim(x, y, width, height); -} - -/** - * Deselects all items. - *

    - * If an item is selected, it is deselected. - * If an item is not selected, it remains unselected. - * - * @exception SWTException

      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed - *
    - */ -public void deselectAll () { - checkWidget(); - table.deselectAll(); -} - -/* Expand upward from the specified leaf item. */ -void expandItem (TableTreeItem item) { - if (item == null) return; - expandItem(item.parentItem); - if (!item.getVisible()) item.setVisible(true); - if ( !item.expanded && item.items.length > 0) { - item.setExpanded(true); - Event event = new Event(); - event.item = item; - notifyListeners(SWT.Expand, event); - } -} -public Color getBackground () { - // This method must be overridden otherwise, in a TableTree in which the first - // item has no sub items, a grey (Widget background colour) square will appear in - // the first column of the first item. - // It is not possible in the constructor to set the background of the TableTree - // to be the same as the background of the Table because this interferes with - // the TableTree adapting to changes in the System color settings. - return table.getBackground(); -} -public Rectangle getClientArea () { - return table.getClientArea(); -} -public Color getForeground () { - return table.getForeground(); -} -public Font getFont () { - return table.getFont(); -} -/** - * Gets the number of items. - *

    - * @return the number of items in the widget - */ -public int getItemCount () { - //checkWidget(); - return items.length; -} - -/** - * Gets the height of one item. - *

    - * This operation will fail if the height of - * one item could not be queried from the OS. - * - * @return the height of one item in the widget - * - * @exception SWTException

      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed - *
    - */ -public int getItemHeight () { - checkWidget(); - return table.getItemHeight(); -} - -/** - * Gets the items. - *

    - * @return the items in the widget - */ -public TableTreeItem [] getItems () { - //checkWidget(); - TableTreeItem[] newItems = new TableTreeItem[items.length]; - System.arraycopy(items, 0, newItems, 0, items.length); - return newItems; -} - -/** - * Gets the selected items. - *

    - * This operation will fail if the selected - * items cannot be queried from the OS. - * - * @return the selected items in the widget - * - * @exception SWTException

      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public TableTreeItem [] getSelection () { - checkWidget(); - TableItem[] selection = table.getSelection(); - TableTreeItem [] result = new TableTreeItem[selection.length]; - for (int i = 0; i < selection.length; i++){ - result[i] = (TableTreeItem) selection[i].getData(ITEMID); - } - return result; -} - -/** - * Gets the number of selected items. - *

    - * This operation will fail if the number of selected - * items cannot be queried from the OS. - * - * @return the number of selected items in the widget - * - * @exception SWTException

      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public int getSelectionCount () { - checkWidget(); - return table.getSelectionCount(); -} - -public int getStyle () { - checkWidget(); - return table.getStyle(); -} - -/** - * Returns the underlying Table control. - * - * @return the underlying Table control - */ -public Table getTable () { - //checkWidget(); - return table; -} - -void createImages () { - - int itemHeight = sizeImage.getBounds().height; - // Calculate border around image. - // At least 9 pixels are needed to draw the image - // Leave at least a 6 pixel border. - int indent = Math.min(6, (itemHeight - 9) / 2); - indent = Math.max(0, indent); - int size = Math.max (10, itemHeight - 2 * indent); - size = ((size + 1) / 2) * 2; // size must be an even number - int midpoint = indent + size / 2; - - Color foreground = getForeground(); - Color plusMinus = getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW); - Color background = getBackground(); - - /* Plus image */ - PaletteData palette = new PaletteData(new RGB[]{foreground.getRGB(), background.getRGB(), plusMinus.getRGB()}); - ImageData imageData = new ImageData(itemHeight, itemHeight, 4, palette); - imageData.transparentPixel = 1; - plusImage = new Image(getDisplay(), imageData); - GC gc = new GC(plusImage); - gc.setBackground(background); - gc.fillRectangle(0, 0, itemHeight, itemHeight); - gc.setForeground(plusMinus); - gc.drawRectangle(indent, indent, size, size); - gc.setForeground(foreground); - gc.drawLine(midpoint, indent + 2, midpoint, indent + size - 2); - gc.drawLine(indent + 2, midpoint, indent + size - 2, midpoint); - gc.dispose(); - - /* Minus image */ - palette = new PaletteData(new RGB[]{foreground.getRGB(), background.getRGB(), plusMinus.getRGB()}); - imageData = new ImageData(itemHeight, itemHeight, 4, palette); - imageData.transparentPixel = 1; - minusImage = new Image(getDisplay(), imageData); - gc = new GC(minusImage); - gc.setBackground(background); - gc.fillRectangle(0, 0, itemHeight, itemHeight); - gc.setForeground(plusMinus); - gc.drawRectangle(indent, indent, size, size); - gc.setForeground(foreground); - gc.drawLine(indent + 2, midpoint, indent + size - 2, midpoint); - gc.dispose(); -} - -Image getPlusImage() { - if (plusImage == null) createImages(); - return plusImage; -} - -Image getMinusImage() { - if (minusImage == null) createImages(); - return minusImage; -} - -/** - * Gets the index of an item. - * - *

    The widget is searched starting at 0 until an - * item is found that is equal to the search item. - * If no item is found, -1 is returned. Indexing - * is zero based. This index is relative to the parent only. - * - * @param item the search item - * @return the index of the item or -1 - */ -public int indexOf (TableTreeItem item) { - //checkWidget(); - for (int i = 0; i < items.length; i++) { - if (item == items[i]) return i; - } - return -1; -} - -void onDispose(Event e) { - removeListener(SWT.Dispose, listener); - notifyListeners(SWT.Dispose, e); - e.type = SWT.None; - /* - * Usually when an item is disposed, destroyItem will change the size of the items array - * and dispose of the underlying table items. - * Since the whole table tree is being disposed, this is not necessary. For speed - * the inDispose flag is used to skip over this part of the item dispose. - */ - inDispose = true; - for (int i = 0; i < items.length; i++) { - items[i].dispose(); - } - inDispose = false; - if (plusImage != null) plusImage.dispose(); - if (minusImage != null) minusImage.dispose(); - if (sizeImage != null) sizeImage.dispose(); - plusImage = minusImage = sizeImage = null; -} - -void onResize(Event e) { - Point size = getSize(); - table.setBounds(0, 0, size.x, size.y); -} - -void onSelection(Event e) { - Event event = new Event(); - TableItem tableItem = (TableItem)e.item; - TableTreeItem item = getItem(tableItem); - event.item = item; - - if (e.type == SWT.Selection && e.detail == SWT.CHECK && item != null) { - event.detail = SWT.CHECK; - item.checked = tableItem.getChecked(); - } - notifyListeners(e.type, event); -} -/** - * Returns the item at the given, zero-relative index in the - * receiver. Throws an exception if the index is out of range. - * - * @param index the index of the item to return - * @return the item at the given index - * - * @exception IllegalArgumentException

      - *
    • ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list minus 1 (inclusive)
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.1 - */ -public TableTreeItem getItem (int index) { - checkWidget(); - int count = items.length; - if (!(0 <= index && index < count)) SWT.error (SWT.ERROR_INVALID_RANGE); - return items [index]; -} - -/** - * Returns the item at the given point in the receiver - * or null if no such item exists. The point is in the - * coordinate system of the receiver. - * - * @param point the point used to locate the item - * @return the item at the given point - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the point is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public TableTreeItem getItem(Point point) { - checkWidget(); - TableItem item = table.getItem(point); - if (item == null) return null; - return getItem(item); - -} -TableTreeItem getItem(TableItem tableItem) { - if (tableItem == null) return null; - for (int i = 0; i < items.length; i++) { - TableTreeItem item = items[i].getItem(tableItem); - if (item != null) return item; - } - return null; -} -void onFocusIn (Event e) { - table.setFocus(); -} - -void onKeyDown (Event e) { - TableTreeItem[] selection = getSelection(); - if (selection.length == 0) return; - TableTreeItem item = selection[0]; - int type = 0; - if (e.keyCode == SWT.ARROW_RIGHT || e.keyCode == SWT.ARROW_LEFT) { - int trailKey = (getStyle() & SWT.MIRRORED) != 0 ? SWT.ARROW_LEFT : SWT.ARROW_RIGHT; - if (e.keyCode == trailKey) { - if (item.getItemCount() == 0) return; - if (item.getExpanded()) { - TableTreeItem newSelection = item.getItems()[0]; - table.setSelection(new TableItem[]{newSelection.tableItem}); - showItem(newSelection); - type = SWT.Selection; - } else { - item.setExpanded(true); - type = SWT.Expand; - } - } else { - if (item.getExpanded()) { - item.setExpanded(false); - type = SWT.Collapse; - } else { - TableTreeItem parent = item.getParentItem(); - if (parent != null) { - int index = parent.indexOf(item); - if (index != 0) return; - table.setSelection(new TableItem[]{parent.tableItem}); - type = SWT.Selection; - } - } - } - } - if (e.character == '*') { - item.expandAll(true); - } - if (e.character == '-') { - if (item.getExpanded()) { - item.setExpanded(false); - type = SWT.Collapse; - } - } - if (e.character == '+') { - if (item.getItemCount() > 0 && !item.getExpanded()) { - item.setExpanded(true); - type = SWT.Expand; - } - } - if (type == 0) return; - Event event = new Event(); - event.item = item; - notifyListeners(type, event); -} -void onMouseDown(Event event) { - /* If user clicked on the [+] or [-], expand or collapse the tree. */ - TableItem[] items = table.getItems(); - for (int i = 0; i < items.length; i++) { - Rectangle rect = items[i].getImageBounds(0); - if (rect.contains(event.x, event.y)) { - TableTreeItem item = (TableTreeItem) items[i].getData(ITEMID); - event = new Event(); - event.item = item; - item.setExpanded(!item.getExpanded()); - if (item.getExpanded()) { - notifyListeners(SWT.Expand, event); - } else { - notifyListeners(SWT.Collapse, event); - } - return; - } - } -} - -/** - * Removes all items. - *

    - * This operation will fail when an item - * could not be removed in the OS. - * - * @exception SWTException

      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed - *
    - */ -public void removeAll () { - checkWidget(); - setRedraw(false); - for (int i = items.length - 1; i >= 0; i--) { - items[i].dispose(); - } - items = EMPTY_ITEMS; - setRedraw(true); -} - -void removeItem(TableTreeItem item) { - int index = 0; - while (index < items.length && items[index] != item) index++; - if (index == items.length) return; - TableTreeItem[] newItems = new TableTreeItem[items.length - 1]; - System.arraycopy(items, 0, newItems, 0, index); - System.arraycopy(items, index + 1, newItems, index, items.length - index - 1); - items = newItems; -} - -/** - * Removes the listener from the collection of listeners who will - * be notified when the user changes the receiver's selection. - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see SelectionListener - * @see #addSelectionListener - */ -public void removeSelectionListener (SelectionListener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - removeListener(SWT.Selection, listener); - removeListener(SWT.DefaultSelection, listener); -} - -/** - * Removes the listener from the collection of listeners who will - * be notified when items in the receiver are expanded or collapsed. - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see TreeListener - * @see #addTreeListener - */ -public void removeTreeListener (TreeListener listener) { - checkWidget(); - if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - removeListener(SWT.Expand, listener); - removeListener(SWT.Collapse, listener); -} - -/** - * Selects all of the items in the receiver. - *

    - * If the receiver is single-select, do nothing. - * - * @exception SWTException

      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed - *
    - */ -public void selectAll () { - checkWidget(); - table.selectAll(); -} -public void setBackground (Color color) { - super.setBackground(color); - table.setBackground(color); - if (sizeImage != null) { - GC gc = new GC (sizeImage); - gc.setBackground(getBackground()); - Rectangle size = sizeImage.getBounds(); - gc.fillRectangle(size); - gc.dispose(); - } -} -public void setEnabled (boolean enabled) { - super.setEnabled(enabled); - table.setEnabled(enabled); -} -public void setFont (Font font) { - super.setFont(font); - table.setFont(font); -} -public void setForeground (Color color) { - super.setForeground(color); - table.setForeground(color); -} -public void setMenu (Menu menu) { - super.setMenu(menu); - table.setMenu(menu); -} - -/** - * Sets the receiver's selection to be the given array of items. - * The current selection is cleared before the new items are selected. - *

    - * Items that are not in the receiver are ignored. - * If the receiver is single-select and multiple items are specified, - * then all items are ignored. - * - * @param items the array of items - * - * @exception IllegalArgumentException

      - *
    • ERROR_NULL_ARGUMENT - if the array of items is null
    • - *
    • ERROR_INVALID_ARGUMENT - if one of the item has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see TableTree#deselectAll() - */ -public void setSelection (TableTreeItem[] items) { - checkWidget (); - if (items == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - int length = items.length; - if (length == 0 || ((table.getStyle() & SWT.SINGLE) != 0 && length > 1)) { - deselectAll(); - return; - } - TableItem[] tableItems = new TableItem[length]; - for (int i = 0; i < length; i++) { - if (items[i] == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (!items[i].getVisible()) expandItem (items[i]); - tableItems[i] = items[i].tableItem; - } - table.setSelection(tableItems); -} -public void setToolTipText (String string) { - super.setToolTipText(string); - table.setToolTipText(string); -} - -/** - * Shows the item. If the item is already showing in the receiver, - * this method simply returns. Otherwise, the items are scrolled - * and expanded until the item is visible. - * - * @param item the item to be shown - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the item is null
    • - *
    • ERROR_INVALID_ARGUMENT - if the item has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see TableTree#showSelection() - */ -public void showItem (TableTreeItem item) { - checkWidget(); - if (item == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - if (!item.getVisible()) expandItem (item); - TableItem tableItem = item.tableItem; - table.showItem(tableItem); -} - -/** - * Shows the selection. - *

    - * If there is no selection or the selection - * is already visible, this method does nothing. - * If the selection is scrolled out of view, - * the top index of the widget is changed such - * that selection becomes visible. - * - * @exception SWTException

      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed - *
    - */ -public void showSelection () { - checkWidget(); - table.showSelection(); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableTreeEditor.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableTreeEditor.java deleted file mode 100755 index 792527b1cf..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableTreeEditor.java +++ /dev/null @@ -1,259 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2007 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.swt.custom; - - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.events.*; -/** -* -* A TableTreeEditor is a manager for a Control that appears above a cell in a TableTree -* and tracks with the moving and resizing of that cell. It can be used to display a -* text widget above a cell in a TableTree so that the user can edit the contents of -* that cell. It can also be used to display a button that can launch a dialog for -* modifying the contents of the associated cell. -* -*

    Here is an example of using a TableTreeEditor: -*

    -*	final TableTree tableTree = new TableTree(shell, SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
    -*	final Table table = tableTree.getTable();
    -*	TableColumn column1 = new TableColumn(table, SWT.NONE);
    -*	TableColumn column2 = new TableColumn(table, SWT.NONE);
    -*	for (int i = 0; i < 10; i++) {
    -*		TableTreeItem item = new TableTreeItem(tableTree, SWT.NONE);
    -*		item.setText(0, "item " + i);
    -*		item.setText(1, "edit this value");
    -*		for (int j = 0; j < 3; j++) {
    -*			TableTreeItem subitem = new TableTreeItem(item, SWT.NONE);
    -*			subitem.setText(0, "subitem " + i + " " + j);
    -*			subitem.setText(1, "edit this value");
    -*		}
    -*	}
    -*	column1.setWidth(100);
    -*	column2.pack();
    -*	
    -*	final TableTreeEditor editor = new TableTreeEditor(tableTree);
    -*	//The editor must have the same size as the cell and must
    -*	//not be any smaller than 50 pixels.
    -*	editor.horizontalAlignment = SWT.LEFT;
    -*	editor.grabHorizontal = true;
    -*	editor.minimumWidth = 50;
    -*	// editing the second column
    -*	final int EDITABLECOLUMN = 1;
    -*	
    -*	tableTree.addSelectionListener(new SelectionAdapter() {
    -*		public void widgetSelected(SelectionEvent e) {
    -*			// Clean up any previous editor control
    -*			Control oldEditor = editor.getEditor();
    -*			if (oldEditor != null) oldEditor.dispose();
    -*	
    -*			// Identify the selected row
    -*			TableTreeItem item = (TableTreeItem)e.item;
    -*			if (item == null) return;
    -*	
    -*			// The control that will be the editor must be a child of the Table
    -*			Text newEditor = new Text(table, SWT.NONE);
    -*			newEditor.setText(item.getText(EDITABLECOLUMN));
    -*			newEditor.addModifyListener(new ModifyListener() {
    -*				public void modifyText(ModifyEvent e) {
    -*					Text text = (Text)editor.getEditor();
    -*					editor.getItem().setText(EDITABLECOLUMN, text.getText());
    -*				}
    -*			});
    -*			newEditor.selectAll();
    -*			newEditor.setFocus();
    -*			editor.setEditor(newEditor, item, EDITABLECOLUMN);
    -*		}
    -*	});
    -* 
    -* -* @deprecated As of 3.1 use TreeEditor with Tree, TreeItem and TreeColumn -*/ -public class TableTreeEditor extends ControlEditor { - - TableTree tableTree; - TableTreeItem item; - int column = -1; - ControlListener columnListener; - TreeListener treeListener; -/** -* Creates a TableTreeEditor for the specified TableTree. -* -* @param tableTree the TableTree Control above which this editor will be displayed -* -*/ -public TableTreeEditor (TableTree tableTree) { - super(tableTree.getTable()); - this.tableTree = tableTree; - - treeListener = new TreeListener () { - final Runnable runnable = new Runnable() { - public void run() { - if (editor == null || editor.isDisposed()) return; - if (TableTreeEditor.this.tableTree.isDisposed()) return; - layout(); - editor.setVisible(true); - } - }; - public void treeCollapsed(TreeEvent e) { - if (editor == null || editor.isDisposed ()) return; - editor.setVisible(false); - e.display.asyncExec(runnable); - } - public void treeExpanded(TreeEvent e) { - if (editor == null || editor.isDisposed ()) return; - editor.setVisible(false); - e.display.asyncExec(runnable); - } - }; - tableTree.addTreeListener(treeListener); - - columnListener = new ControlListener() { - public void controlMoved(ControlEvent e){ - layout (); - } - public void controlResized(ControlEvent e){ - layout (); - } - }; - - // To be consistent with older versions of SWT, grabVertical defaults to true - grabVertical = true; -} -Rectangle computeBounds () { - if (item == null || column == -1 || item.isDisposed() || item.tableItem == null) return new Rectangle(0, 0, 0, 0); - Rectangle cell = item.getBounds(column); - Rectangle area = tableTree.getClientArea(); - if (cell.x < area.x + area.width) { - if (cell.x + cell.width > area.x + area.width) { - cell.width = area.x + area.width - cell.x; - } - } - Rectangle editorRect = new Rectangle(cell.x, cell.y, minimumWidth, minimumHeight); - - if (grabHorizontal) { - editorRect.width = Math.max(cell.width, minimumWidth); - } - - if (grabVertical) { - editorRect.height = Math.max(cell.height, minimumHeight); - } - - if (horizontalAlignment == SWT.RIGHT) { - editorRect.x += cell.width - editorRect.width; - } else if (horizontalAlignment == SWT.LEFT) { - // do nothing - cell.x is the right answer - } else { // default is CENTER - editorRect.x += (cell.width - editorRect.width)/2; - } - - if (verticalAlignment == SWT.BOTTOM) { - editorRect.y += cell.height - editorRect.height; - } else if (verticalAlignment == SWT.TOP) { - // do nothing - cell.y is the right answer - } else { // default is CENTER - editorRect.y += (cell.height - editorRect.height)/2; - } - return editorRect; -} -/** - * Removes all associations between the TableTreeEditor and the cell in the table tree. The - * TableTree and the editor Control are not disposed. - */ -public void dispose () { - if (tableTree != null && !tableTree.isDisposed()) { - Table table = tableTree.getTable(); - if (table != null && !table.isDisposed()) { - if (this.column > -1 && this.column < table.getColumnCount()){ - TableColumn tableColumn = table.getColumn(this.column); - tableColumn.removeControlListener(columnListener); - } - } - if (treeListener != null) tableTree.removeTreeListener(treeListener); - } - treeListener = null; - columnListener = null; - tableTree = null; - item = null; - column = -1; - super.dispose(); -} -/** -* Returns the zero based index of the column of the cell being tracked by this editor. -* -* @return the zero based index of the column of the cell being tracked by this editor -*/ -public int getColumn () { - return column; -} -/** -* Returns the TableTreeItem for the row of the cell being tracked by this editor. -* -* @return the TableTreeItem for the row of the cell being tracked by this editor -*/ -public TableTreeItem getItem () { - return item; -} -public void setColumn(int column) { - Table table = tableTree.getTable(); - int columnCount = table.getColumnCount(); - // Separately handle the case where the table has no TableColumns. - // In this situation, there is a single default column. - if (columnCount == 0) { - this.column = (column == 0) ? 0 : -1; - layout(); - return; - } - if (this.column > -1 && this.column < columnCount){ - TableColumn tableColumn = table.getColumn(this.column); - tableColumn.removeControlListener(columnListener); - this.column = -1; - } - - if (column < 0 || column >= table.getColumnCount()) return; - - this.column = column; - TableColumn tableColumn = table.getColumn(this.column); - tableColumn.addControlListener(columnListener); - layout(); -} -public void setItem (TableTreeItem item) { - this.item = item; - layout(); -} - -/** -* Specify the Control that is to be displayed and the cell in the table that it is to be positioned above. -* -*

    Note: The Control provided as the editor must be created with its parent being the Table control -* specified in the TableEditor constructor. -* -* @param editor the Control that is displayed above the cell being edited -* @param item the TableItem for the row of the cell being tracked by this editor -* @param column the zero based index of the column of the cell being tracked by this editor -*/ -public void setEditor (Control editor, TableTreeItem item, int column) { - setItem(item); - setColumn(column); - setEditor(editor); -} -public void layout () { - if (tableTree == null || tableTree.isDisposed()) return; - if (item == null || item.isDisposed()) return; - Table table = tableTree.getTable(); - int columnCount = table.getColumnCount(); - if (columnCount == 0 && column != 0) return; - if (columnCount > 0 && (column < 0 || column >= columnCount)) return; - super.layout(); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableTreeItem.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableTreeItem.java deleted file mode 100755 index 83c2fc8422..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TableTreeItem.java +++ /dev/null @@ -1,876 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * A TableTreeItem is a selectable user interface object - * that represents an item in a hierarchy of items in a - * TableTree. - * - * @deprecated As of 3.1 use Tree, TreeItem and TreeColumn - */ -public class TableTreeItem extends Item { - TableItem tableItem; - TableTree parent; - TableTreeItem parentItem; - TableTreeItem [] items = TableTree.EMPTY_ITEMS; - String[] texts = TableTree.EMPTY_TEXTS; - Image[] images = TableTree.EMPTY_IMAGES; - Color background; - Color foreground; - Font font; - boolean expanded; - boolean checked; - boolean grayed; - -/** - * Constructs a new instance of this class given its parent - * (which must be a TableTree) - * and a style value describing its behavior and appearance. - * The item is added to the end of the items maintained by its parent. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a composite control which will be the parent of the new instance (cannot be null) - * @param style the style of control to construct - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    - * - * @see SWT - * @see Widget#getStyle() - */ -public TableTreeItem(TableTree parent, int style) { - this (parent, style, parent.getItemCount()); -} - -/** - * Constructs a new instance of this class given its parent - * (which must be a TableTree, - * a style value describing its behavior and appearance, and the index - * at which to place it in the items maintained by its parent. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a composite control which will be the parent of the new instance (cannot be null) - * @param style the style of control to construct - * @param index the index to store the receiver in its parent - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    - * - * @see SWT - * @see Widget#getStyle() - */ -public TableTreeItem(TableTree parent, int style, int index) { - this (parent, null, style, index); -} - -/** - * Constructs a new instance of this class given its parent - * (which must be a TableTreeItem) - * and a style value describing its behavior and appearance. - * The item is added to the end of the items maintained by its parent. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a composite control which will be the parent of the new instance (cannot be null) - * @param style the style of control to construct - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    - * - * @see SWT - * @see Widget#getStyle() - */ -public TableTreeItem(TableTreeItem parent, int style) { - this (parent, style, parent.getItemCount()); -} - -/** - * Constructs a new instance of this class given its parent - * (which must be a TableTreeItem), - * a style value describing its behavior and appearance, and the index - * at which to place it in the items maintained by its parent. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a composite control which will be the parent of the new instance (cannot be null) - * @param style the style of control to construct - * @param index the index to store the receiver in its parent - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    - * - * @see SWT - * @see Widget#getStyle() - */ -public TableTreeItem(TableTreeItem parent, int style, int index) { - this (parent.getParent(), parent, style, index); -} - -TableTreeItem(TableTree parent, TableTreeItem parentItem, int style, int index) { - super(parent, style); - this.parent = parent; - this.parentItem = parentItem; - if (parentItem == null) { - - /* Root items are visible immediately */ - int tableIndex = parent.addItem(this, index); - tableItem = new TableItem(parent.getTable(), style, tableIndex); - tableItem.setData(TableTree.ITEMID, this); - addCheck(); - /* - * Feature in the Table. The table uses the first image that - * is inserted into the table to size the table rows. If the - * user is allowed to insert the first image, this will cause - * the +/- images to be scaled. The fix is to insert a dummy - * image to force the size. - */ - if (parent.sizeImage == null) { - int itemHeight = parent.getItemHeight(); - parent.sizeImage = new Image(parent.getDisplay(), itemHeight, itemHeight); - GC gc = new GC (parent.sizeImage); - gc.setBackground(parent.getBackground()); - gc.fillRectangle(0, 0, itemHeight, itemHeight); - gc.dispose(); - tableItem.setImage(0, parent.sizeImage); - } - } else { - parentItem.addItem(this, index); - } -} -void addCheck() { - Table table = parent.getTable(); - if ((table.getStyle() & SWT.CHECK) == 0) return; - tableItem.setChecked(checked); - tableItem.setGrayed(grayed); -} -void addItem(TableTreeItem item, int index) { - if (item == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (index < 0 || index > items.length) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - - /* Now that item has a sub-node it must indicate that it can be expanded */ - if (items.length == 0 && index == 0) { - if (tableItem != null) { - Image image = expanded ? parent.getMinusImage() : parent.getPlusImage(); - tableItem.setImage(0, image); - } - } - - /* Put the item in the items list */ - TableTreeItem[] newItems = new TableTreeItem[items.length + 1]; - System.arraycopy(items, 0, newItems, 0, index); - newItems[index] = item; - System.arraycopy(items, index, newItems, index + 1, items.length - index); - items = newItems; - if (expanded) item.setVisible(true); -} - -/** - * Returns the receiver's background color. - * - * @return the background color - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 2.0 - * - */ -public Color getBackground () { - checkWidget (); - return (background == null) ? parent.getBackground() : background; -} - -/** - * Returns a rectangle describing the receiver's size and location - * relative to its parent. - * - * @return the receiver's bounding rectangle - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public Rectangle getBounds (int index) { - checkWidget(); - if (tableItem != null) { - return tableItem.getBounds(index); - } else { - return new Rectangle(0, 0, 0, 0); - } -} -/** - * Returns true if the receiver is checked, - * and false otherwise. When the parent does not have - * the CHECK style, return false. - * - * @return the checked state of the checkbox - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public boolean getChecked () { - checkWidget(); - if (tableItem == null) return checked; - return tableItem.getChecked(); -} - -/** - * Returns true if the receiver is grayed, - * and false otherwise. When the parent does not have - * the CHECK style, return false. - * - * @return the grayed state of the checkbox - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 2.1 - */ -public boolean getGrayed () { - checkWidget(); - if (tableItem == null) return grayed; - return tableItem.getGrayed(); -} - -/** - * Returns true if the receiver is expanded, - * and false otherwise. - *

    - * - * @return the expanded state - */ -public boolean getExpanded () { - //checkWidget(); - return expanded; -} - -/** - * Returns the font that the receiver will use to paint textual information for this item. - * - * @return the receiver's font - * - * @exception SWTException

      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public Font getFont () { - checkWidget (); - return (font == null) ? parent.getFont() : font; -} -/** - * Returns the foreground color that the receiver will use to draw. - * - * @return the receiver's foreground color - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 2.0 - * - */ -public Color getForeground () { - checkWidget (); - return (foreground == null) ? parent.getForeground() : foreground; -} -/** - * Gets the first image. - *

    - * The image in column 0 is reserved for the [+] and [-] - * images of the tree, therefore getImage(0) will return null. - * - * @return the image at index 0 - * - * @exception SWTException

      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public Image getImage () { - checkWidget(); - return getImage(0); -} - -/** - * Gets the image at the specified index. - *

    - * Indexing is zero based. The image can be null. - * The image in column 0 is reserved for the [+] and [-] - * images of the tree, therefore getImage(0) will return null. - * Return null if the index is out of range. - * - * @param index the index of the image - * @return the image at the specified index or null - */ -public Image getImage (int index) { - //checkWidget(); - if (0 < index && index < images.length) return images[index]; - return null; -} - -int getIndent() { - if (parentItem == null) return 0; - return parentItem.getIndent() + 1; -} - -/** - * Returns the item at the given, zero-relative index in the - * receiver. Throws an exception if the index is out of range. - * - * @param index the index of the item to return - * @return the item at the given index - * - * @exception IllegalArgumentException

      - *
    • ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list minus 1 (inclusive)
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.1 - */ -public TableTreeItem getItem (int index) { - checkWidget(); - int count = items.length; - if (!(0 <= index && index < count)) SWT.error (SWT.ERROR_INVALID_RANGE); - return items [index]; -} - -/** - * Returns the number of items contained in the receiver - * that are direct item children of the receiver. - * - * @return the number of items - */ -public int getItemCount () { - //checkWidget(); - return items.length; -} - -/** - * Returns an array of TableTreeItems which are the - * direct item children of the receiver. - *

    - * Note: This is not the actual structure used by the receiver - * to maintain its list of items, so modifying the array will - * not affect the receiver. - *

    - * - * @return the receiver's items - */ -public TableTreeItem[] getItems () { - //checkWidget(); - TableTreeItem[] newItems = new TableTreeItem[items.length]; - System.arraycopy(items, 0, newItems, 0, items.length); - return newItems; -} - -TableTreeItem getItem(TableItem tableItem) { - if (tableItem == null) return null; - if (this.tableItem == tableItem) return this; - for (int i = 0; i < items.length; i++) { - TableTreeItem item = items[i].getItem(tableItem); - if (item != null) return item; - } - return null; -} - -/** - * Returns the receiver's parent, which must be a TableTree. - * - * @return the receiver's parent - */ -public TableTree getParent () { - //checkWidget(); - return parent; -} - -/** - * Returns the receiver's parent item, which must be a - * TableTreeItem or null when the receiver is a - * root. - * - * @return the receiver's parent item - */ -public TableTreeItem getParentItem () { - //checkWidget(); - return parentItem; -} -public String getText () { - checkWidget(); - return getText(0); -} - -/** - * Gets the item text at the specified index. - *

    - * Indexing is zero based. - * - * This operation will fail when the index is out - * of range or an item could not be queried from - * the OS. - * - * @param index the index of the item - * @return the item text at the specified index, which can be null - */ -public String getText(int index) { - //checkWidget(); - if (0 <= index && index < texts.length) return texts[index]; - return null; -} - -boolean getVisible () { - return tableItem != null; -} - -/** - * Gets the index of the specified item. - * - *

    The widget is searched starting at 0 until an - * item is found that is equal to the search item. - * If no item is found, -1 is returned. Indexing - * is zero based. This index is relative to the parent only. - * - * @param item the search item - * @return the index of the item or -1 if the item is not found - * - */ -public int indexOf (TableTreeItem item) { - //checkWidget(); - for (int i = 0; i < items.length; i++) { - if (items[i] == item) return i; - } - return -1; -} - -void expandAll(boolean notify) { - if (items.length == 0) return; - if (!expanded) { - setExpanded(true); - if (notify) { - Event event = new Event(); - event.item = this; - parent.notifyListeners(SWT.Expand, event); - } - } - for (int i = 0; i < items.length; i++) { - items[i].expandAll(notify); - } -} -int expandedIndexOf (TableTreeItem item) { - int index = 0; - for (int i = 0; i < items.length; i++) { - if (items[i] == item) return index; - if (items[i].expanded) index += items[i].visibleChildrenCount (); - index++; - } - return -1; -} - -int visibleChildrenCount () { - int count = 0; - for (int i = 0; i < items.length; i++) { - if (items[i].getVisible ()) { - count += 1 + items[i].visibleChildrenCount (); - } - } - return count; -} - -public void dispose () { - if (isDisposed()) return; - for (int i = items.length - 1; i >= 0; i--) { - items[i].dispose(); - } - super.dispose(); - if (!parent.inDispose) { - if (parentItem != null) { - parentItem.removeItem(this); - } else { - parent.removeItem(this); - } - if (tableItem != null) tableItem.dispose(); - } - items = null; - parentItem = null; - parent = null; - images = null; - texts = null; - tableItem = null; - foreground = null; - background = null; - font = null; -} - -void removeItem(TableTreeItem item) { - int index = 0; - while (index < items.length && items[index] != item) index++; - if (index == items.length) return; - TableTreeItem[] newItems = new TableTreeItem[items.length - 1]; - System.arraycopy(items, 0, newItems, 0, index); - System.arraycopy(items, index + 1, newItems, index, items.length - index - 1); - items = newItems; - if (items.length == 0) { - if (tableItem != null) tableItem.setImage(0, null); - } -} - -/** - * Sets the receiver's background color to the color specified - * by the argument, or to the default system color for the item - * if the argument is null. - * - * @param color the new color (or null) - * - * @exception IllegalArgumentException

      - *
    • ERROR_INVALID_ARGUMENT - if the argument has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 2.0 - * - */ -public void setBackground (Color color) { - checkWidget (); - if (color != null && color.isDisposed ()) { - SWT.error (SWT.ERROR_INVALID_ARGUMENT); - } - if (tableItem != null) { - tableItem.setBackground(color); - } - background = color; -} - -/** - * Sets the checked state of the checkbox for this item. This state change - * only applies if the Table was created with the SWT.CHECK style. - * - * @param checked the new checked state of the checkbox - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setChecked (boolean checked) { - checkWidget(); - Table table = parent.getTable(); - if ((table.getStyle() & SWT.CHECK) == 0) return; - if (tableItem != null) { - tableItem.setChecked(checked); - } - this.checked = checked; -} - -/** - * Sets the grayed state of the checkbox for this item. This state change - * only applies if the Table was created with the SWT.CHECK style. - * - * @param grayed the new grayed state of the checkbox; - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 2.1 - */ -public void setGrayed (boolean grayed) { - checkWidget(); - Table table = parent.getTable(); - if ((table.getStyle() & SWT.CHECK) == 0) return; - if (tableItem != null) { - tableItem.setGrayed(grayed); - } - this.grayed = grayed; -} - -/** - * Sets the expanded state. - *

    - * @param expanded the new expanded state. - * - * @exception SWTException

      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public void setExpanded (boolean expanded) { - checkWidget(); - if (items.length == 0) return; - if (this.expanded == expanded) return; - this.expanded = expanded; - if (tableItem == null) return; - parent.setRedraw(false); - for (int i = 0; i < items.length; i++) { - items[i].setVisible(expanded); - } - Image image = expanded ? parent.getMinusImage() : parent.getPlusImage(); - tableItem.setImage(0, image); - parent.setRedraw(true); -} - -/** - * Sets the font that the receiver will use to paint textual information - * for this item to the font specified by the argument, or to the default font - * for that kind of control if the argument is null. - * - * @param font the new font (or null) - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT - if the argument has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 3.0 - */ -public void setFont (Font font){ - checkWidget (); - if (font != null && font.isDisposed ()) { - SWT.error (SWT.ERROR_INVALID_ARGUMENT); - } - if (tableItem != null) { - tableItem.setFont(font); - } - this.font = font; -} -/** - * Sets the receiver's foreground color to the color specified - * by the argument, or to the default system color for the item - * if the argument is null. - * - * @param color the new color (or null) - * - * @since 2.0 - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT - if the argument has been disposed
    • - *
    - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @since 2.0 - * - */ -public void setForeground (Color color) { - checkWidget (); - if (color != null && color.isDisposed ()) { - SWT.error (SWT.ERROR_INVALID_ARGUMENT); - } - if (tableItem != null) { - tableItem.setForeground(color); - } - foreground = color; -} - -/** - * Sets the image at an index. - *

    - * The image can be null. - * The image in column 0 is reserved for the [+] and [-] - * images of the tree, therefore do nothing if index is 0. - * - * @param image the new image or null - * - * @exception SWTException

      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public void setImage (int index, Image image) { - checkWidget(); - int columnCount = Math.max(parent.getTable().getColumnCount(), 1); - if (index <= 0 || index >= columnCount) return; - if (images.length < columnCount) { - Image[] newImages = new Image[columnCount]; - System.arraycopy(images, 0, newImages, 0, images.length); - images = newImages; - } - images[index] = image; - if (tableItem != null) tableItem.setImage(index, image); -} - -/** - * Sets the first image. - *

    - * The image can be null. - * The image in column 0 is reserved for the [+] and [-] - * images of the tree, therefore do nothing. - * - * @param image the new image or null - * - * @exception SWTException

      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public void setImage (Image image) { - setImage(0, image); -} - -/** - * Sets the widget text. - *

    - * - * The widget text for an item is the label of the - * item or the label of the text specified by a column - * number. - * - * @param index the column number - * @param text the new text - * - * @exception IllegalArgumentException

      - *
    • ERROR_NULL_ARGUMENT - if the text is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
    • - *
    • ERROR_WIDGET_DISPOSED when the widget has been disposed
    • - *
    - */ -public void setText(int index, String text) { - checkWidget(); - if (text == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); - int columnCount = Math.max(parent.getTable().getColumnCount(), 1); - if (index < 0 || index >= columnCount) return; - if (texts.length < columnCount) { - String[] newTexts = new String[columnCount]; - System.arraycopy(texts, 0, newTexts, 0, texts.length); - texts = newTexts; - } - texts[index] = text; - if (tableItem != null) tableItem.setText(index, text); -} -public void setText (String string) { - setText(0, string); -} - -void setVisible (boolean show) { - if (parentItem == null) return; // this is a root and can not be toggled between visible and hidden - if (getVisible() == show) return; - - if (show) { - if (!parentItem.getVisible()) return; // parentItem must already be visible - // create underlying table item and set data in table item to stored data - Table table = parent.getTable(); - int parentIndex = table.indexOf(parentItem.tableItem); - int index = parentItem.expandedIndexOf(this) + parentIndex + 1; - if (index < 0) return; - tableItem = new TableItem(table, getStyle(), index); - tableItem.setData(TableTree.ITEMID, this); - tableItem.setImageIndent(getIndent()); - if (background != null) tableItem.setBackground(background); - if (foreground != null) tableItem.setForeground(foreground); - if (font != null) tableItem.setFont(font); - addCheck(); - - // restore fields to item - // ignore any images in the first column - int columnCount = Math.max(table.getColumnCount(), 1); - for (int i = 0; i < columnCount; i++) { - if (i < texts.length && texts[i] != null) setText(i, texts[i]); - if (i < images.length && images[i] != null) setImage(i, images[i]); - } - - // display the children and the appropriate [+]/[-] symbol as required - if (items.length != 0) { - if (expanded) { - tableItem.setImage(0, parent.getMinusImage()); - for (int i = 0, length = items.length; i < length; i++) { - items[i].setVisible(true); - } - } else { - tableItem.setImage(0, parent.getPlusImage()); - } - } - - } else { - - for (int i = 0, length = items.length; i < length; i++) { - items[i].setVisible(false); - } - // remove row from table - tableItem.dispose(); - tableItem = null; - } -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TextChangeListener.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TextChangeListener.java deleted file mode 100755 index a7c53a855c..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TextChangeListener.java +++ /dev/null @@ -1,61 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2005 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.swt.custom; - - -import org.eclipse.swt.internal.SWTEventListener; - -/** - * The StyledText widget implements this listener to receive - * notifications when changes to the model occur. - * It is not intended to be implemented by clients or by - * implementors of StyledTextContent. - * Clients should listen to the ModifyEvent or ExtendedModifyEvent - * that is sent by the StyledText widget to receive text change - * notifications. - * Implementors of StyledTextContent should call the textChanging - * and textChanged methods when text changes occur as described - * below. If the entire text is replaced the textSet method - * should be called instead. - */ -public interface TextChangeListener extends SWTEventListener { - -/** - * This method is called when the content is about to be changed. - * Callers also need to call the textChanged method after the - * content change has been applied. The widget only updates the - * screen properly when it receives both events. - * - * @param event the text changing event. All event fields need - * to be set by the sender. - * @see TextChangingEvent - */ -public void textChanging(TextChangingEvent event); -/** - * This method is called when the content has changed. - * Callers need to have called the textChanging method prior to - * applying the content change and calling this method. The widget - * only updates the screen properly when it receives both events. - * - * @param event the text changed event - */ -public void textChanged(TextChangedEvent event); -/** - * This method is called instead of the textChanging/textChanged - * combination when the entire old content has been replaced - * (e.g., by a call to StyledTextContent.setText()). - * - * @param event the text changed event - */ -public void textSet(TextChangedEvent event); -} - - diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TextChangedEvent.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TextChangedEvent.java deleted file mode 100755 index 0cacf8a6f7..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TextChangedEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.events.*; - -/** - * This event is sent by the StyledTextContent implementor when a change to - * the text occurs. - * - * @see Sample code and further information - */ -public class TextChangedEvent extends TypedEvent { - - static final long serialVersionUID = 3258696524257835065L; - -/** - * Create the TextChangedEvent to be used by the StyledTextContent implementor. - *

    - * - * @param source the object that will be sending the TextChangedEvent, - * cannot be null - */ -public TextChangedEvent(StyledTextContent source) { - super(source); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TextChangingEvent.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TextChangingEvent.java deleted file mode 100755 index cf109a27dc..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TextChangingEvent.java +++ /dev/null @@ -1,71 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -import org.eclipse.swt.events.*; - -/** - * This event is sent by the StyledTextContent implementor when a change - * to the text is about to occur. - * - * @see Sample code and further information - */ -public class TextChangingEvent extends TypedEvent { - /** - * Start offset of the text that is going to be replaced - */ - public int start; - /** - * Text that is going to be inserted or empty string - * if no text will be inserted - */ - public String newText; - /** - * Length of text that is going to be replaced - */ - public int replaceCharCount; - /** - * Length of text that is going to be inserted - */ - public int newCharCount; - /** - * Number of lines that are going to be replaced - */ - public int replaceLineCount; - /** - * Number of new lines that are going to be inserted - */ - public int newLineCount; - - static final long serialVersionUID = 3257290210114352439L; - -/** - * Create the TextChangedEvent to be used by the StyledTextContent implementor. - *

    - * - * @param source the object that will be sending the new TextChangingEvent, - * cannot be null - */ -public TextChangingEvent(StyledTextContent source) { - super(source); -} -TextChangingEvent(StyledTextContent source, StyledTextEvent e) { - super(source); - start = e.start; - replaceCharCount = e.replaceCharCount; - newCharCount = e.newCharCount; - replaceLineCount = e.replaceLineCount; - newLineCount = e.newLineCount; - newText = e.text; -} - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TreeEditor.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TreeEditor.java deleted file mode 100755 index de4f7b2f4f..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/TreeEditor.java +++ /dev/null @@ -1,319 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - - -import org.eclipse.swt.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** -* -* A TreeEditor is a manager for a Control that appears above a cell in a Tree and tracks with the -* moving and resizing of that cell. It can be used to display a text widget above a cell -* in a Tree so that the user can edit the contents of that cell. It can also be used to display -* a button that can launch a dialog for modifying the contents of the associated cell. -* -*

    Here is an example of using a TreeEditor: -*

    -*	final Tree tree = new Tree(shell, SWT.BORDER);
    -*	for (int i = 0; i < 3; i++) {
    -*		TreeItem item = new TreeItem(tree, SWT.NONE);
    -*		item.setText("item " + i);
    -*		for (int j = 0; j < 3; j++) {
    -*			TreeItem subItem = new TreeItem(item, SWT.NONE);
    -*			subItem.setText("item " + i + " " + j);
    -*		}
    -*	}
    -*	
    -*	final TreeEditor editor = new TreeEditor(tree);
    -*	//The editor must have the same size as the cell and must
    -*	//not be any smaller than 50 pixels.
    -*	editor.horizontalAlignment = SWT.LEFT;
    -*	editor.grabHorizontal = true;
    -*	editor.minimumWidth = 50;
    -*	
    -*	tree.addSelectionListener(new SelectionAdapter() {
    -*		public void widgetSelected(SelectionEvent e) {
    -*			// Clean up any previous editor control
    -*			Control oldEditor = editor.getEditor();
    -*			if (oldEditor != null) oldEditor.dispose();
    -*	
    -*			// Identify the selected row
    -*			TreeItem item = (TreeItem)e.item;
    -*			if (item == null) return;
    -*	
    -*			// The control that will be the editor must be a child of the Tree
    -*			Text newEditor = new Text(tree, SWT.NONE);
    -*			newEditor.setText(item.getText());
    -*			newEditor.addModifyListener(new ModifyListener() {
    -*				public void modifyText(ModifyEvent e) {
    -*					Text text = (Text)editor.getEditor();
    -*					editor.getItem().setText(text.getText());
    -*				}
    -*			});
    -*			newEditor.selectAll();
    -*			newEditor.setFocus();
    -*			editor.setEditor(newEditor, item);
    -*		}
    -*	});
    -* 
    -* -* @see TreeEditor snippets -* @see Sample code and further information -*/ -public class TreeEditor extends ControlEditor { - Tree tree; - TreeItem item; - int column = 0; - ControlListener columnListener; - TreeListener treeListener; - Runnable timer; - static final int TIMEOUT = 1500; - -/** -* Creates a TreeEditor for the specified Tree. -* -* @param tree the Tree Control above which this editor will be displayed -* -*/ -public TreeEditor (Tree tree) { - super(tree); - this.tree = tree; - - columnListener = new ControlListener() { - public void controlMoved(ControlEvent e){ - layout(); - } - public void controlResized(ControlEvent e){ - layout(); - } - }; - timer = new Runnable () { - public void run() { - layout (); - } - }; - treeListener = new TreeListener () { - final Runnable runnable = new Runnable() { - public void run() { - if (editor == null || editor.isDisposed()) return; - if (TreeEditor.this.tree.isDisposed()) return; - layout(); - editor.setVisible(true); - } - }; - public void treeCollapsed(TreeEvent e) { - if (editor == null || editor.isDisposed ()) return; - editor.setVisible(false); - e.display.asyncExec(runnable); - } - public void treeExpanded(TreeEvent e) { - if (editor == null || editor.isDisposed ()) return; - editor.setVisible(false); - e.display.asyncExec(runnable); - } - }; - tree.addTreeListener(treeListener); - - // To be consistent with older versions of SWT, grabVertical defaults to true - grabVertical = true; -} - -Rectangle computeBounds () { - if (item == null || column == -1 || item.isDisposed()) return new Rectangle(0, 0, 0, 0); - Rectangle cell = item.getBounds(column); - Rectangle rect = item.getImageBounds(column); - cell.x = rect.x + rect.width; - cell.width -= rect.width; - Rectangle area = tree.getClientArea(); - if (cell.x < area.x + area.width) { - if (cell.x + cell.width > area.x + area.width) { - cell.width = area.x + area.width - cell.x; - } - } - Rectangle editorRect = new Rectangle(cell.x, cell.y, minimumWidth, minimumHeight); - - if (grabHorizontal) { - if (tree.getColumnCount() == 0) { - // Bounds of tree item only include the text area - stretch out to include - // entire client area - cell.width = area.x + area.width - cell.x; - } - editorRect.width = Math.max(cell.width, minimumWidth); - } - - if (grabVertical) { - editorRect.height = Math.max(cell.height, minimumHeight); - } - - if (horizontalAlignment == SWT.RIGHT) { - editorRect.x += cell.width - editorRect.width; - } else if (horizontalAlignment == SWT.LEFT) { - // do nothing - cell.x is the right answer - } else { // default is CENTER - editorRect.x += (cell.width - editorRect.width)/2; - } - // don't let the editor overlap with the +/- of the tree - editorRect.x = Math.max(cell.x, editorRect.x); - - if (verticalAlignment == SWT.BOTTOM) { - editorRect.y += cell.height - editorRect.height; - } else if (verticalAlignment == SWT.TOP) { - // do nothing - cell.y is the right answer - } else { // default is CENTER - editorRect.y += (cell.height - editorRect.height)/2; - } - return editorRect; -} - -/** - * Removes all associations between the TreeEditor and the row in the tree. The - * tree and the editor Control are not disposed. - */ -public void dispose () { - if (tree != null && !tree.isDisposed()) { - if (this.column > -1 && this.column < tree.getColumnCount()){ - TreeColumn treeColumn = tree.getColumn(this.column); - treeColumn.removeControlListener(columnListener); - } - if (treeListener != null) tree.removeTreeListener(treeListener); - } - columnListener = null; - treeListener = null; - tree = null; - item = null; - column = 0; - timer = null; - super.dispose(); -} - -/** -* Returns the zero based index of the column of the cell being tracked by this editor. -* -* @return the zero based index of the column of the cell being tracked by this editor -* -* @since 3.1 -*/ -public int getColumn () { - return column; -} - -/** -* Returns the TreeItem for the row of the cell being tracked by this editor. -* -* @return the TreeItem for the row of the cell being tracked by this editor -*/ -public TreeItem getItem () { - return item; -} - -void resize () { - layout(); - /* - * On some platforms, the table scrolls when an item that - * is partially visible at the bottom of the table is - * selected. Ensure that the correct row is edited by - * laying out one more time in a timerExec(). - */ - if (tree != null) { - Display display = tree.getDisplay(); - display.timerExec(-1, timer); - display.timerExec(TIMEOUT, timer); - } -} - -/** -* Sets the zero based index of the column of the cell being tracked by this editor. -* -* @param column the zero based index of the column of the cell being tracked by this editor -* -* @since 3.1 -*/ -public void setColumn(int column) { - int columnCount = tree.getColumnCount(); - // Separately handle the case where the tree has no TreeColumns. - // In this situation, there is a single default column. - if (columnCount == 0) { - this.column = (column == 0) ? 0 : -1; - resize(); - return; - } - if (this.column > -1 && this.column < columnCount){ - TreeColumn treeColumn = tree.getColumn(this.column); - treeColumn.removeControlListener(columnListener); - this.column = -1; - } - - if (column < 0 || column >= tree.getColumnCount()) return; - - this.column = column; - TreeColumn treeColumn = tree.getColumn(this.column); - treeColumn.addControlListener(columnListener); - resize(); -} - -/** -* Specifies the TreeItem that is to be edited. -* -* @param item the item to be edited -*/ -public void setItem (TreeItem item) { - this.item = item; - resize(); -} - -/** -* Specify the Control that is to be displayed and the cell in the tree that it is to be positioned above. -* -*

    Note: The Control provided as the editor must be created with its parent being the Tree control -* specified in the TreeEditor constructor. -* -* @param editor the Control that is displayed above the cell being edited -* @param item the TreeItem for the row of the cell being tracked by this editor -* @param column the zero based index of the column of the cell being tracked by this editor -* -* @since 3.1 -*/ -public void setEditor (Control editor, TreeItem item, int column) { - setItem(item); - setColumn(column); - setEditor(editor); -} -public void setEditor (Control editor) { - super.setEditor(editor); - resize(); -} - -/** -* Specify the Control that is to be displayed and the cell in the tree that it is to be positioned above. -* -*

    Note: The Control provided as the editor must be created with its parent being the Tree control -* specified in the TreeEditor constructor. -* -* @param editor the Control that is displayed above the cell being edited -* @param item the TreeItem for the row of the cell being tracked by this editor -*/ -public void setEditor (Control editor, TreeItem item) { - setItem(item); - setEditor(editor); -} - -public void layout () { - if (tree == null || tree.isDisposed()) return; - if (item == null || item.isDisposed()) return; - int columnCount = tree.getColumnCount(); - if (columnCount == 0 && column != 0) return; - if (columnCount > 0 && (column < 0 || column >= columnCount)) return; - super.layout(); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/VerifyKeyListener.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/VerifyKeyListener.java deleted file mode 100755 index 6d308aecf0..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/VerifyKeyListener.java +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 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.swt.custom; - -import org.eclipse.swt.events.*; -import org.eclipse.swt.internal.SWTEventListener; - -/** - * Classes which implement this interface provide a method - * that deals with the event that is generated when a - * key is pressed. - * - * @see VerifyEvent - * @see Sample code and further information - */ -public interface VerifyKeyListener extends SWTEventListener { -/** - * The following event fields are used:

      - *
    • event.character is the character that was typed (input)
    • - *
    • event.keyCode is the key code that was typed (input)
    • - *
    • event.stateMask is the state of the keyboard (input)
    • - *
    • event.doit is processed or not (output)
    • - *
    - * @param event the verify event - * @see VerifyEvent - */ -public void verifyKey (VerifyEvent event); -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ViewForm.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ViewForm.java deleted file mode 100755 index 55c1915ff3..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ViewForm.java +++ /dev/null @@ -1,476 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 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.swt.custom; - - -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.*; - -/** - * Instances of this class implement a Composite that positions and sizes - * children and allows programmatic control of layout and border parameters. - * ViewForm is used in the workbench to lay out a view's label/menu/toolbar - * local bar. - *

    - * Note that although this class is a subclass of Composite, - * it does not make sense to set a layout on it. - *

    - *

    - *
    Styles:
    - *
    BORDER, FLAT
    - *
    Events:
    - *
    (None)
    - *
    - *

    - * IMPORTANT: This class is not intended to be subclassed. - *

    - * - * @see Sample code and further information - * @noextend This class is not intended to be subclassed by clients. - */ - -public class ViewForm extends Composite { - - /** - * marginWidth specifies the number of pixels of horizontal margin - * that will be placed along the left and right edges of the form. - * - * The default value is 0. - */ - public int marginWidth = 0; - /** - * marginHeight specifies the number of pixels of vertical margin - * that will be placed along the top and bottom edges of the form. - * - * The default value is 0. - */ - public int marginHeight = 0; - /** - * horizontalSpacing specifies the number of pixels between the right - * edge of one cell and the left edge of its neighbouring cell to - * the right. - * - * The default value is 1. - */ - public int horizontalSpacing = 1; - /** - * verticalSpacing specifies the number of pixels between the bottom - * edge of one cell and the top edge of its neighbouring cell underneath. - * - * The default value is 1. - */ - public int verticalSpacing = 1; - - /** - * Color of innermost line of drop shadow border. - * - * NOTE This field is badly named and can not be fixed for backwards compatibility. - * It should be capitalized. - * - * @deprecated - */ - public static RGB borderInsideRGB = new RGB (132, 130, 132); - /** - * Color of middle line of drop shadow border. - * - * NOTE This field is badly named and can not be fixed for backwards compatibility. - * It should be capitalized. - * - * @deprecated - */ - public static RGB borderMiddleRGB = new RGB (143, 141, 138); - /** - * Color of outermost line of drop shadow border. - * - * NOTE This field is badly named and can not be fixed for backwards compatibility. - * It should be capitalized. - * - * @deprecated - */ - public static RGB borderOutsideRGB = new RGB (171, 168, 165); - - // SWT widgets - Control topLeft; - Control topCenter; - Control topRight; - Control content; - - // Configuration and state info - boolean separateTopCenter = false; - boolean showBorder = false; - - int separator = -1; - int borderTop = 0; - int borderBottom = 0; - int borderLeft = 0; - int borderRight = 0; - int highlight = 0; - Point oldSize; - - Color selectionBackground; - Listener listener; - - static final int OFFSCREEN = -200; - static final int BORDER1_COLOR = SWT.COLOR_WIDGET_NORMAL_SHADOW; - static final int SELECTION_BACKGROUND = SWT.COLOR_LIST_BACKGROUND; -/** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - *

    - * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

    - * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the parent is null
    • - *
    - * @exception SWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent
    • - *
    - * - * @see SWT#BORDER - * @see SWT#FLAT - * @see #getStyle() - */ -public ViewForm(Composite parent, int style) { - super(parent, checkStyle(style)); - super.setLayout(new ViewFormLayout()); - - setBorderVisible((style & SWT.BORDER) != 0); - - listener = new Listener() { - public void handleEvent(Event e) { - switch (e.type) { - case SWT.Dispose: onDispose(e); break; - case SWT.Paint: onPaint(e.gc); break; - case SWT.Resize: onResize(); break; - } - } - }; - - int[] events = new int[] {SWT.Dispose, SWT.Paint, SWT.Resize}; - - for (int i = 0; i < events.length; i++) { - addListener(events[i], listener); - } -} - -static int checkStyle (int style) { - int mask = SWT.FLAT | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT; - return style & mask | SWT.NO_REDRAW_RESIZE; -} - -//protected void checkSubclass () { -// String name = getClass().getName (); -// String validName = ViewForm.class.getName(); -// if (!validName.equals(name)) { -// SWT.error (SWT.ERROR_INVALID_SUBCLASS); -// } -//} - -public Rectangle computeTrim (int x, int y, int width, int height) { - checkWidget (); - int trimX = x - borderLeft - highlight; - int trimY = y - borderTop - highlight; - int trimWidth = width + borderLeft + borderRight + 2*highlight; - int trimHeight = height + borderTop + borderBottom + 2*highlight; - return new Rectangle(trimX, trimY, trimWidth, trimHeight); -} -public Rectangle getClientArea() { - checkWidget(); - Rectangle clientArea = super.getClientArea(); - clientArea.x += borderLeft; - clientArea.y += borderTop; - clientArea.width -= borderLeft + borderRight; - clientArea.height -= borderTop + borderBottom; - return clientArea; -} -/** -* Returns the content area. -* -* @return the control in the content area of the pane or null -*/ -public Control getContent() { - //checkWidget(); - return content; -} -/** -* Returns Control that appears in the top center of the pane. -* Typically this is a toolbar. -* -* @return the control in the top center of the pane or null -*/ -public Control getTopCenter() { - //checkWidget(); - return topCenter; -} -/** -* Returns the Control that appears in the top left corner of the pane. -* Typically this is a label such as CLabel. -* -* @return the control in the top left corner of the pane or null -*/ -public Control getTopLeft() { - //checkWidget(); - return topLeft; -} -/** -* Returns the control in the top right corner of the pane. -* Typically this is a Close button or a composite with a Menu and Close button. -* -* @return the control in the top right corner of the pane or null -*/ -public Control getTopRight() { - //checkWidget(); - return topRight; -} -void onDispose(Event event) { - removeListener(SWT.Dispose, listener); - notifyListeners(SWT.Dispose, event); - event.type = SWT.None; - - topLeft = null; - topCenter = null; - topRight = null; - content = null; - oldSize = null; - selectionBackground = null; -} -void onPaint(GC gc) { - Color gcForeground = gc.getForeground(); - Point size = getSize(); - Color border = getDisplay().getSystemColor(BORDER1_COLOR); - if (showBorder) { - gc.setForeground(border); - gc.drawRectangle(0, 0, size.x - 1, size.y - 1); - if (highlight > 0) { - int x1 = 1; - int y1 = 1; - int x2 = size.x - 1; - int y2 = size.y - 1; - int[] shape = new int[] {x1,y1, x2,y1, x2,y2, x1,y2, x1,y1+highlight, - x1+highlight,y1+highlight, x1+highlight,y2-highlight, - x2-highlight,y2-highlight, x2-highlight,y1+highlight, x1,y1+highlight}; - Color highlightColor = getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION); - gc.setBackground(highlightColor); - gc.fillPolygon(shape); - } - } - if (separator > -1) { - gc.setForeground(border); - gc.drawLine(borderLeft + highlight, separator, size.x - borderLeft - borderRight - highlight, separator); - } - gc.setForeground(gcForeground); -} -void onResize() { - Point size = getSize(); - if (oldSize == null || oldSize.x == 0 || oldSize.y == 0) { - redraw(); - } else { - int width = 0; - if (oldSize.x < size.x) { - width = size.x - oldSize.x + borderRight + highlight; - } else if (oldSize.x > size.x) { - width = borderRight + highlight; - } - redraw(size.x - width, 0, width, size.y, false); - - int height = 0; - if (oldSize.y < size.y) { - height = size.y - oldSize.y + borderBottom + highlight; - } - if (oldSize.y > size.y) { - height = borderBottom + highlight; - } - redraw(0, size.y - height, size.x, height, false); - } - oldSize = size; -} -/** -* Sets the content. -* Setting the content to null will remove it from -* the pane - however, the creator of the content must dispose of the content. -* -* @param content the control to be displayed in the content area or null -* -* @exception SWTException
      -*
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • -*
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • -*
    • ERROR_INVALID_ARGUMENT - if the control is not a child of this ViewForm
    • -*
    -*/ -public void setContent(Control content) { - checkWidget(); - if (content != null && content.getParent() != this) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (this.content != null && !this.content.isDisposed()) { - this.content.setBounds(OFFSCREEN, OFFSCREEN, 0, 0); - } - this.content = content; - layout(false); -} -/** - * Sets the layout which is associated with the receiver to be - * the argument which may be null. - *

    - * Note: No Layout can be set on this Control because it already - * manages the size and position of its children. - *

    - * - * @param layout the receiver's new layout or null - * - * @exception SWTException
      - *
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - */ -public void setLayout (Layout layout) { - checkWidget(); - return; -} -void setSelectionBackground (Color color) { - checkWidget(); - if (selectionBackground == color) return; - if (color == null) color = getDisplay().getSystemColor(SELECTION_BACKGROUND); - selectionBackground = color; - redraw(); -} -/** -* Set the control that appears in the top center of the pane. -* Typically this is a toolbar. -* The topCenter is optional. Setting the topCenter to null will remove it from -* the pane - however, the creator of the topCenter must dispose of the topCenter. -* -* @param topCenter the control to be displayed in the top center or null -* -* @exception SWTException
      -*
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • -*
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • -*
    • ERROR_INVALID_ARGUMENT - if the control is not a child of this ViewForm
    • -*
    -*/ -public void setTopCenter(Control topCenter) { - checkWidget(); - if (topCenter != null && topCenter.getParent() != this) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (this.topCenter != null && !this.topCenter.isDisposed()) { - Point size = this.topCenter.getSize(); - this.topCenter.setLocation(OFFSCREEN - size.x, OFFSCREEN - size.y); - } - this.topCenter = topCenter; - layout(false); -} -/** -* Set the control that appears in the top left corner of the pane. -* Typically this is a label such as CLabel. -* The topLeft is optional. Setting the top left control to null will remove it from -* the pane - however, the creator of the control must dispose of the control. -* -* @param c the control to be displayed in the top left corner or null -* -* @exception SWTException
      -*
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • -*
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • -*
    • ERROR_INVALID_ARGUMENT - if the control is not a child of this ViewForm
    • -*
    -*/ -public void setTopLeft(Control c) { - checkWidget(); - if (c != null && c.getParent() != this) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (this.topLeft != null && !this.topLeft.isDisposed()) { - Point size = this.topLeft.getSize(); - this.topLeft.setLocation(OFFSCREEN - size.x, OFFSCREEN - size.y); - } - this.topLeft = c; - layout(false); -} -/** -* Set the control that appears in the top right corner of the pane. -* Typically this is a Close button or a composite with a Menu and Close button. -* The topRight is optional. Setting the top right control to null will remove it from -* the pane - however, the creator of the control must dispose of the control. -* -* @param c the control to be displayed in the top right corner or null -* -* @exception SWTException
      -*
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • -*
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • -*
    • ERROR_INVALID_ARGUMENT - if the control is not a child of this ViewForm
    • -*
    -*/ -public void setTopRight(Control c) { - checkWidget(); - if (c != null && c.getParent() != this) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (this.topRight != null && !this.topRight.isDisposed()) { - Point size = this.topRight.getSize(); - this.topRight.setLocation(OFFSCREEN - size.x, OFFSCREEN - size.y); - } - this.topRight = c; - layout(false); -} -/** -* Specify whether the border should be displayed or not. -* -* @param show true if the border should be displayed -* -* @exception SWTException
      -*
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • -*
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • -*
    -*/ -public void setBorderVisible(boolean show) { - checkWidget(); - if (showBorder == show) return; - - showBorder = show; - if (showBorder) { - borderLeft = borderTop = borderRight = borderBottom = 1; - if ((getStyle() & SWT.FLAT)== 0) highlight = 2; - } else { - borderBottom = borderTop = borderLeft = borderRight = 0; - highlight = 0; - } - layout(false); - redraw(); -} -/** -* If true, the topCenter will always appear on a separate line by itself, otherwise the -* topCenter will appear in the top row if there is room and will be moved to the second row if -* required. -* -* @param show true if the topCenter will always appear on a separate line by itself -* -* @exception SWTException
      -*
    • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    • -*
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • -*
    -*/ -public void setTopCenterSeparate(boolean show) { - checkWidget(); - separateTopCenter = show; - layout(false); -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ViewFormLayout.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ViewFormLayout.java deleted file mode 100644 index 18d4b6d421..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/ViewFormLayout.java +++ /dev/null @@ -1,211 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 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.swt.custom; - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * This class provides the layout for ViewForm - * - * @see ViewForm - */ -class ViewFormLayout extends Layout { - -protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { - ViewForm form = (ViewForm)composite; - Control left = form.topLeft; - Control center = form.topCenter; - Control right = form.topRight; - Control content = form.content; - - Point leftSize = new Point(0, 0); - if (left != null) { - leftSize = computeChildSize(left, SWT.DEFAULT, SWT.DEFAULT, flushCache); - } - Point centerSize = new Point(0, 0); - if (center != null) { - centerSize = computeChildSize(center, SWT.DEFAULT, SWT.DEFAULT, flushCache); - } - Point rightSize = new Point(0, 0); - if (right != null) { - rightSize = computeChildSize(right, SWT.DEFAULT, SWT.DEFAULT, flushCache); - } - Point size = new Point(0, 0); - // calculate width of title bar - if (form.separateTopCenter || - (wHint != SWT.DEFAULT && leftSize.x + centerSize.x + rightSize.x > wHint)) { - size.x = leftSize.x + rightSize.x; - if (leftSize.x > 0 && rightSize.x > 0) size.x += form.horizontalSpacing; - size.x = Math.max(centerSize.x, size.x); - size.y = Math.max(leftSize.y, rightSize.y); - if (center != null){ - size.y += centerSize.y; - if (left != null ||right != null)size.y += form.verticalSpacing; - } - } else { - size.x = leftSize.x + centerSize.x + rightSize.x; - int count = -1; - if (leftSize.x > 0) count++; - if (centerSize.x > 0) count++; - if (rightSize.x > 0) count++; - if (count > 0) size.x += count * form.horizontalSpacing; - size.y = Math.max(leftSize.y, Math.max(centerSize.y, rightSize.y)); - } - - if (content != null) { - if (left != null || right != null || center != null) size.y += 1; // allow space for a vertical separator - Point contentSize = new Point(0, 0); - contentSize = computeChildSize(content, SWT.DEFAULT, SWT.DEFAULT, flushCache); - size.x = Math.max (size.x, contentSize.x); - size.y += contentSize.y; - if (size.y > contentSize.y) size.y += form.verticalSpacing; - } - - size.x += 2*form.marginWidth; - size.y += 2*form.marginHeight; - - if (wHint != SWT.DEFAULT) size.x = wHint; - if (hHint != SWT.DEFAULT) size.y = hHint; - - return size; -} - -Point computeChildSize(Control control, int wHint, int hHint, boolean flushCache) { - Object data = control.getLayoutData(); - if (data == null || !(data instanceof CLayoutData)) { - data = new CLayoutData(); - control.setLayoutData(data); - } - return ((CLayoutData)data).computeSize(control, wHint, hHint, flushCache); -} - -int computeTrim(Control c) { - if (c instanceof Scrollable) { - Rectangle rect = ((Scrollable) c).computeTrim (0, 0, 0, 0); - return rect.width; - } - return c.getBorderWidth () * 2; -} - -protected boolean flushCache(Control control) { - Object data = control.getLayoutData(); - if (data != null && data instanceof CLayoutData) ((CLayoutData)data).flushCache(); - return true; -} - -protected void layout(Composite composite, boolean flushCache) { - ViewForm form = (ViewForm)composite; - Control left = form.topLeft; - Control center = form.topCenter; - Control right = form.topRight; - Control content = form.content; - - Rectangle rect = composite.getClientArea(); - - Point leftSize = new Point(0, 0); - if (left != null && !left.isDisposed()) { - leftSize = computeChildSize(left, SWT.DEFAULT, SWT.DEFAULT, flushCache); - } - Point centerSize = new Point(0, 0); - if (center != null && !center.isDisposed()) { - centerSize = computeChildSize(center, SWT.DEFAULT, SWT.DEFAULT, flushCache); - } - Point rightSize = new Point(0, 0); - if (right != null && !right.isDisposed()) { - rightSize = computeChildSize(right, SWT.DEFAULT, SWT.DEFAULT, flushCache); - } - - int minTopWidth = leftSize.x + centerSize.x + rightSize.x + 2*form.marginWidth + 2*form.highlight; - int count = -1; - if (leftSize.x > 0) count++; - if (centerSize.x > 0) count++; - if (rightSize.x > 0) count++; - if (count > 0) minTopWidth += count * form.horizontalSpacing; - - int x = rect.x + rect.width - form.marginWidth - form.highlight; - int y = rect.y + form.marginHeight + form.highlight; - - boolean top = false; - if (form.separateTopCenter || minTopWidth > rect.width) { - int topHeight = Math.max(rightSize.y, leftSize.y); - if (right != null && !right.isDisposed()) { - top = true; - x -= rightSize.x; - right.setBounds(x, y, rightSize.x, topHeight); - x -= form.horizontalSpacing; - } - if (left != null && !left.isDisposed()) { - top = true; - int trim = computeTrim(left); - int leftW = x - rect.x - form.marginWidth - form.highlight - trim; - leftSize = computeChildSize(left, leftW, SWT.DEFAULT, false); - left.setBounds(rect.x + form.marginWidth + form.highlight, y, leftSize.x, topHeight); - } - if (top) y += topHeight + form.verticalSpacing; - if (center != null && !center.isDisposed()) { - top = true; - int trim = computeTrim(center); - int w = rect.width - 2*form.marginWidth - 2*form.highlight - trim; - centerSize = computeChildSize(center, w, SWT.DEFAULT, false); - center.setBounds(rect.x + rect.width - form.marginWidth - form.highlight - centerSize.x, y, centerSize.x, centerSize.y); - y += centerSize.y + form.verticalSpacing; - } - } else { - int topHeight = Math.max(rightSize.y, Math.max(centerSize.y, leftSize.y)); - if (right != null && !right.isDisposed()) { - top = true; - x -= rightSize.x; - right.setBounds(x, y, rightSize.x, topHeight); - x -= form.horizontalSpacing; - } - if (center != null && !center.isDisposed()) { - top = true; - x -= centerSize.x; - center.setBounds(x, y, centerSize.x, topHeight); - x -= form.horizontalSpacing; - } - if (left != null && !left.isDisposed()) { - top = true; - Rectangle trim = left instanceof Composite ? ((Composite)left).computeTrim(0, 0, 0, 0) : new Rectangle(0, 0, 0, 0); - int w = x - rect.x - form.marginWidth - form.highlight - trim.width; - int h = topHeight - trim.height; - leftSize = computeChildSize(left, w, h, false); - left.setBounds(rect.x + form.marginWidth + form.highlight, y, leftSize.x, topHeight); - } - if (top)y += topHeight + form.verticalSpacing; - } - int oldSeperator = form.separator; - form.separator = -1; - if (content != null && !content.isDisposed()) { - if (left != null || right!= null || center != null){ - form.separator = y; - y++; - } - content.setBounds(rect.x + form.marginWidth + form.highlight, y, rect.width - 2 * form.marginWidth - 2*form.highlight, rect.y + rect.height - y - form.marginHeight - form.highlight); - } - if (oldSeperator != form.separator) { - int t, b; - if (oldSeperator == -1) { - t = form.separator; - b = form.separator + 1; - } else if (form.separator == -1) { - t = oldSeperator; - b = oldSeperator + 1; - } else { - t = Math.min(form.separator, oldSeperator); - b = Math.max(form.separator, oldSeperator); - } - form.redraw(form.borderLeft, t, form.getSize().x - form.borderLeft - form.borderRight, b - t, false); - } -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/package.html b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/package.html deleted file mode 100755 index 3011a3feef..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/package.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - Package-level Javadoc - - -SWT Custom widgets. -

    -Package Specification

    -This package contains the custom widgets which were written to provide the -standard look and feel of the Eclipse platform. - - -- cgit