Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Northover2002-12-11 14:27:15 -0500
committerSteve Northover2002-12-11 14:27:15 -0500
commit4ff21aa4697517320180a6f91c2aa20189baa2c7 (patch)
treee82635170f39d30db7d87a1cdd820ecbdd972eb6
parentd3b6fe87efd968669c637035ced83210dfd29fd5 (diff)
downloadeclipse.platform.swt-carbon_work.tar.gz
eclipse.platform.swt-carbon_work.tar.xz
eclipse.platform.swt-carbon_work.zip
*** empty log message ***END_CARBON_WORKcarbon_work
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Table.java161
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableColumn.java3
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Tree.java249
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeItem.java37
4 files changed, 393 insertions, 57 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Table.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Table.java
index e3a36bbfcf..f8fac108fa 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Table.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Table.java
@@ -53,9 +53,42 @@ protected void checkSubclass () {
}
public Point computeSize (int wHint, int hHint, boolean changed) {
- checkWidget ();
- //NOT DONE
- return new Point (100, 100);
+ checkWidget();
+ int width = 0;
+ if (wHint == SWT.DEFAULT) {
+ GC gc = new GC (this);
+ for (int i=0; i<itemCount; i++) {
+ //NOT DONE - take into account the icon
+// Rectangle rect = items [i].getBounds ();
+// width = Math.max (width, rect.width);
+ Point extent = gc.stringExtent (items [i].text);
+ width = Math.max (width, extent.x);
+ }
+ gc.dispose ();
+ } else {
+ width = wHint;
+ }
+ if (width <= 0) width = DEFAULT_WIDTH;
+ int height = 0;
+ if (hHint == SWT.DEFAULT) {
+ height = itemCount * getItemHeight ();
+ } else {
+ height = hHint;
+ }
+ if (height <= 0) height = DEFAULT_HEIGHT;
+ Rectangle rect = computeTrim (0, 0, width, height);
+ return new Point (rect.width, rect.height);
+}
+
+public Rectangle computeTrim (int x, int y, int width, int height) {
+ checkWidget();
+ Rect rect = new Rect ();
+ OS.GetDataBrowserScrollBarInset (handle, rect);
+ x -= rect.left;
+ y -= rect.top;
+ width += (rect.left + rect.right) * 3;
+ height += rect.top + rect.bottom;
+ return new Rectangle (x, y, width, height);
}
void createHandle () {
@@ -184,14 +217,17 @@ int defaultThemeFont () {
public void deselect (int index) {
checkWidget();
- ignoreSelect = true;
- int [] id = new int [] {index + 1};
- OS.SetDataBrowserSelectedItems (handle, id.length, id, OS.kDataBrowserItemsRemove);
- ignoreSelect = false;
+ if (0 <= index && index < itemCount) {
+ ignoreSelect = true;
+ int [] id = new int [] {index + 1};
+ OS.SetDataBrowserSelectedItems (handle, id.length, id, OS.kDataBrowserItemsRemove);
+ ignoreSelect = false;
+ }
}
public void deselect (int start, int end) {
checkWidget();
+ //NOT DONE - check range
int length = end - start + 1;
if (length <= 0) return;
int [] ids = new int [length];
@@ -204,6 +240,7 @@ public void deselect (int start, int end) {
public void deselect (int [] indices) {
checkWidget();
if (indices == null) error (SWT.ERROR_NULL_ARGUMENT);
+ //NOT DONE - check range
int length = indices.length;
int [] ids = new int [length];
for (int i=0; i<length; i++) ids [i] = indices [length - i - 1] + 1;
@@ -237,7 +274,9 @@ void destroyItem (TableColumn column) {
item.setImage (columnCount - 1, null);
}
}
- if (columnCount > 1) {
+ if (columnCount == 1) {
+ //NOT DONE - reassign COLUMN_ID when last column deleted
+ } else {
if (OS.RemoveDataBrowserTableViewColumn (handle, column.id) != OS.noErr) {
error (SWT.ERROR_ITEM_NOT_REMOVED);
}
@@ -261,6 +300,14 @@ void destroyItem (TableItem item) {
OS.UpdateDataBrowserItems (handle, 0, 0, null, OS.kDataBrowserItemNoProperty, OS.kDataBrowserNoItem);
}
+public Rectangle getClientArea () {
+ checkWidget();
+ Rect rect = new Rect (), inset = new Rect ();
+ OS.GetControlBounds (handle, rect);
+ OS.GetDataBrowserScrollBarInset (handle, inset);
+ return new Rectangle (inset.left, inset.top, rect.right - rect.left + inset.right, rect.bottom - rect.top + inset.bottom);
+}
+
public TableColumn getColumn (int index) {
checkWidget ();
if (!(0 <=index && index < columnCount)) error (SWT.ERROR_INVALID_RANGE);
@@ -553,6 +600,62 @@ int kEventMouseDown (int nextHandler, int theEvent, int userData) {
return result;
}
+int kEventRawKeyDown (int nextHandler, int theEvent, int userData) {
+ int result = super.kEventRawKeyDown (nextHandler, theEvent, userData);
+ if (result == OS.noErr) return result;
+ /*
+ * Feature in the Macintosh. For some reason, when the user hits an
+ * up or down arrow to traverse the items in a Data Browser, the item
+ * scrolls to the left such that the white space that is normally
+ * visible to the right of the every item is scrolled out of view.
+ * The fix is to do the arrow traversal in Java and not call the
+ * default handler.
+ */
+ int [] keyCode = new int [1];
+ OS.GetEventParameter (theEvent, OS.kEventParamKeyCode, OS.typeUInt32, null, keyCode.length * 4, null, keyCode);
+ switch (keyCode [0]) {
+ case 125: { /* Down */
+ int index = getSelectionIndex ();
+ setSelection (Math.min (itemCount - 1, index + 1));
+ return OS.noErr;
+ }
+ case 126: { /* Up*/
+ int index = getSelectionIndex ();
+ setSelection (Math.max (0, index - 1));
+ return OS.noErr;
+ }
+ }
+ return OS.eventNotHandledErr;
+}
+
+int kEventRawKeyRepeat (int nextHandler, int theEvent, int userData) {
+ int result = super.kEventRawKeyRepeat (nextHandler, theEvent, userData);
+ if (result == OS.noErr) return result;
+ /*
+ * Feature in the Macintosh. For some reason, when the user hits an
+ * up or down arrow to traverse the items in a Data Browser, the item
+ * scrolls to the left such that the white space that is normally
+ * visible to the right of the every item is scrolled out of view.
+ * The fix is to do the arrow traversal in Java and not call the
+ * default handler.
+ */
+ int [] keyCode = new int [1];
+ OS.GetEventParameter (theEvent, OS.kEventParamKeyCode, OS.typeUInt32, null, keyCode.length * 4, null, keyCode);
+ switch (keyCode [0]) {
+ case 125: { /* Down */
+ int index = getSelectionIndex ();
+ setSelection (Math.min (itemCount - 1, index + 1));
+ return OS.noErr;
+ }
+ case 126: { /* Up*/
+ int index = getSelectionIndex ();
+ setSelection (Math.max (0, index - 1));
+ return OS.noErr;
+ }
+ }
+ return OS.eventNotHandledErr;
+}
+
void releaseWidget () {
for (int i=0; i<columnCount; i++) {
TableColumn column = columns [i];
@@ -624,15 +727,18 @@ public void removeSelectionListener(SelectionListener listener) {
public void select (int index) {
checkWidget();
- int [] id = new int [] {index + 1};
- ignoreSelect = true;
- int operation = (style & SWT.SINGLE) != 0 ? OS.kDataBrowserItemsAssign: OS.kDataBrowserItemsAdd;
- OS.SetDataBrowserSelectedItems (handle, id.length, id, operation);
- ignoreSelect = false;
+ if (0 <- index && index < itemCount) {
+ int [] id = new int [] {index + 1};
+ ignoreSelect = true;
+ int operation = (style & SWT.SINGLE) != 0 ? OS.kDataBrowserItemsAssign: OS.kDataBrowserItemsAdd;
+ OS.SetDataBrowserSelectedItems (handle, id.length, id, operation);
+ ignoreSelect = false;
+ }
}
public void select (int start, int end) {
checkWidget();
+ //NOT DONE - check range
int length = end - start + 1;
if (length <= 0) return;
int [] ids = new int [length];
@@ -646,6 +752,7 @@ public void select (int start, int end) {
public void select (int [] indices) {
checkWidget();
if (indices == null) error (SWT.ERROR_NULL_ARGUMENT);
+ //NOT DONE - check range
int length = indices.length;
int [] ids = new int [length];
for (int i=0; i<length; i++) ids [i] = indices [length - i - 1] + 1;
@@ -675,11 +782,13 @@ public void setLinesVisible (boolean show) {
public void setSelection (int index) {
checkWidget();
- int [] id = new int [] {index + 1};
- ignoreSelect = true;
- OS.SetDataBrowserSelectedItems (handle, id.length, id, OS.kDataBrowserItemsAssign);
- ignoreSelect = false;
- showIndex (id [0] - 1);
+ if (0 < index && index < itemCount) {
+ int [] id = new int [] {index + 1};
+ ignoreSelect = true;
+ OS.SetDataBrowserSelectedItems (handle, id.length, id, OS.kDataBrowserItemsAssign);
+ ignoreSelect = false;
+ showIndex (id [0] - 1);
+ }
}
public void setSelection (int start, int end) {
@@ -740,10 +849,18 @@ public void setTopIndex (int index) {
}
void showIndex (int index) {
- OS.RevealDataBrowserItem (handle, index + 1, COLUMN_ID, (byte) OS.kDataBrowserRevealWithoutSelecting);
- int [] top = new int [1], left = new int [1];
- OS.GetDataBrowserScrollPosition (handle, top, left);
- OS.SetDataBrowserScrollPosition (handle, top [0], 0);
+ if (0 <= index && index < itemCount) {
+ //NOT DONE - doesn't work for SWT.CHECK
+ int id = columnCount == 0 ? COLUMN_ID : columns [0].id;
+ short [] width = new short [1];
+ OS.GetDataBrowserTableViewNamedColumnWidth (handle, id, width);
+ Rect rect = new Rect (), inset = new Rect ();
+ OS.GetControlBounds (handle, rect);
+ OS.GetDataBrowserScrollBarInset (handle, inset);
+ OS.SetDataBrowserTableViewNamedColumnWidth (handle, id, (short)(rect.right - rect.left - inset.left - inset.right));
+ OS.RevealDataBrowserItem (handle, index + 1, COLUMN_ID, (byte) OS.kDataBrowserRevealWithoutSelecting);
+ OS.SetDataBrowserTableViewNamedColumnWidth (handle, id, (short)width [0]);
+ }
}
public void showItem (TableItem item) {
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableColumn.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableColumn.java
index d2ff613cf8..e7a7684fb7 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableColumn.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TableColumn.java
@@ -41,6 +41,7 @@ public void addControlListener(ControlListener listener) {
addListener (SWT.Resize,typedListener);
addListener (SWT.Move,typedListener);
}
+
public void addSelectionListener (SelectionListener listener) {
checkWidget ();
if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
@@ -166,7 +167,7 @@ public void setText (String string) {
if (str == 0) error (SWT.ERROR_CANNOT_SET_TEXT);
DataBrowserListViewHeaderDesc desc = new DataBrowserListViewHeaderDesc ();
desc.version = OS.kDataBrowserListViewLatestHeaderDesc;
- //NOT DONE - GP's
+ //NOT DONE - for some reason this call GP's
// OS.GetDataBrowserListViewHeaderDesc (parent.handle, id, desc);
desc.maximumWidth = 0x7FFF;
desc.titleString = str;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Tree.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Tree.java
index a6abd4ac0f..bda8ef95aa 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Tree.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Tree.java
@@ -9,8 +9,10 @@ package org.eclipse.swt.widgets;
import org.eclipse.swt.internal.carbon.OS;
import org.eclipse.swt.internal.carbon.DataBrowserCallbacks;
-import org.eclipse.swt.internal.carbon.Rect;
+import org.eclipse.swt.internal.carbon.DataBrowserCustomCallbacks;
import org.eclipse.swt.internal.carbon.DataBrowserListViewColumnDesc;
+import org.eclipse.swt.internal.carbon.RGBColor;
+import org.eclipse.swt.internal.carbon.Rect;
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
@@ -18,6 +20,7 @@ import org.eclipse.swt.graphics.*;
public class Tree extends Composite {
TreeItem [] items;
+ GC paintGC;
int anchorFirst, anchorLast;
boolean ignoreSelect, ignoreExpand;
static final int CHECK_COLUMN_ID = 1024;
@@ -59,8 +62,40 @@ static int checkStyle (int style) {
public Point computeSize (int wHint, int hHint, boolean changed) {
checkWidget ();
- //NOT DONE
- return new Point (200, 200);
+ int width = 0;
+ if (wHint == SWT.DEFAULT) {
+ TreeItem [] items = getItems ();
+ GC gc = new GC (this);
+ for (int i=0; i<items.length; i++) {
+ Rectangle rect = items [i].getBounds ();
+ width = Math.max (width, rect.width);
+ }
+ gc.dispose ();
+ width = width * 2;
+ } else {
+ width = wHint;
+ }
+ if (width <= 0) width = DEFAULT_WIDTH;
+ int height = 0;
+ if (hHint == SWT.DEFAULT) {
+ height = getItemCount () * getItemHeight ();
+ } else {
+ height = hHint;
+ }
+ if (height <= 0) height = DEFAULT_HEIGHT;
+ Rectangle rect = computeTrim (0, 0, width, height);
+ return new Point (rect.width, rect.height);
+}
+
+public Rectangle computeTrim (int x, int y, int width, int height) {
+ checkWidget();
+ Rect rect = new Rect ();
+ OS.GetDataBrowserScrollBarInset (handle, rect);
+ x -= rect.left;
+ y -= rect.top;
+ width += (rect.left + rect.right) * 3;
+ height += rect.top + rect.bottom;
+ return new Rectangle (x, y, width, height);
}
void createHandle () {
@@ -91,7 +126,8 @@ void createHandle () {
DataBrowserListViewColumnDesc column = new DataBrowserListViewColumnDesc ();
column.headerBtnDesc_version = OS.kDataBrowserListViewLatestHeaderDesc;
column.propertyDesc_propertyID = COLUMN_ID;
- column.propertyDesc_propertyType = OS.kDataBrowserTextType; // OS.kDataBrowserIconAndTextType
+// column.propertyDesc_propertyType = OS.kDataBrowserTextType; // OS.kDataBrowserIconAndTextType
+ column.propertyDesc_propertyType = OS.kDataBrowserCustomType;
column.propertyDesc_propertyFlags = OS.kDataBrowserListViewSelectionColumn | OS.kDataBrowserDefaultPropertyFlags;
//NOT DONE
column.headerBtnDesc_maximumWidth = 0x7FFF;
@@ -105,6 +141,10 @@ void createHandle () {
* the widget has a minimum size. The fix is to force the scroll
* bars to be created by temporarily giving the widget a size and
* then restoring it to zero.
+ *
+ * NOTE: The widget must be visible and SizeControl() must be used
+ * to resize the widget to a minimim size or the widget will not
+ * create the scroll bars. This work around currently flashes.
*/
OS.SizeControl (handle, (short) 0xFF, (short) 0xFF);
OS.SizeControl (handle, (short) 0, (short) 0);
@@ -196,13 +236,105 @@ void destroyItem (TreeItem item) {
item.index = -1;
}
+int drawItemProc (int browser, int id, int property, int itemState, int theRect, int gdDepth, int colorDevice) {
+ int index = id - 1;
+ if (!(0 <= index && index < items.length)) return OS.noErr;
+ TreeItem item = items [index];
+
+// if (false) {
+// int [] port = new int [1], gdh = new int [1];
+// OS.GetGWorld (port, gdh);
+// byte [] buffer = item.text.getBytes();
+// Rect rect = new Rect ();
+// OS.memcpy (rect, theRect, Rect.sizeof);
+// Display display = getDisplay ();
+// Color foreground = null, background = null;
+// if ((itemState & OS.kDataBrowserItemIsSelected) != 0) {
+// foreground = display.getSystemColor (SWT.COLOR_LIST_SELECTION_TEXT);
+// background = display.getSystemColor (SWT.COLOR_LIST_SELECTION);
+// } else {
+// foreground = display.getSystemColor (SWT.COLOR_LIST_FOREGROUND);
+// background = display.getSystemColor (SWT.COLOR_LIST_BACKGROUND);
+// }
+// int red = (short) (background.handle [0] * 255);
+// int green = (short) (background.handle [1] * 255);
+// int blue = (short) (background.handle [2] * 255);
+// RGBColor color = new RGBColor ();
+// color.red = (short) (red << 8 | red);
+// color.green = (short) (green << 8 | green);
+// color.blue = (short) (blue << 8 | blue);
+// OS.RGBForeColor (color);
+// OS.PaintRect (rect);
+// red = (short) (foreground.handle [0] * 255);
+// green = (short) (foreground.handle [1] * 255);
+// blue = (short) (foreground.handle [2] * 255);
+// color.red = (short) (red << 8 | red);
+// color.green = (short) (green << 8 | green);
+// color.blue = (short) (blue << 8 | blue);
+// OS.RGBForeColor (color);
+// OS.MoveTo (rect.left, (short)(rect.top + 13));
+// OS.DrawText (buffer, (short) 0, (short) buffer.length);
+// OS.SetGWorld (port [0], gdh [0]);
+//// System.out.println("x=" + rect.left + " y=" + rect.top + " width=" + (rect.right - rect.left) + " height=" + (rect.bottom - rect.top));
+// return OS.noErr;
+// }
+
+ Rect rect = new Rect ();
+ OS.memcpy (rect, theRect, Rect.sizeof);
+// System.out.println("x=" + rect.left + " y=" + rect.top + " width=" + (rect.right - rect.left) + " height=" + (rect.bottom - rect.top));
+ int x = rect.left;
+ int y = rect.top;
+ int width = rect.right - rect.left;
+ int height = rect.bottom - rect.top;
+ Rect controlRect = new Rect ();
+ OS.GetControlBounds (handle, controlRect);
+ x -= controlRect.left;
+ y -= controlRect.top;
+ GC gc = paintGC == null ? new GC (this) : paintGC;
+ int clip = OS.NewRgn ();
+ OS.GetClip (clip);
+ OS.OffsetRgn (clip, (short)-controlRect.left, (short)-controlRect.top);
+ gc.setClipping (Region.carbon_new (clip));
+ OS.DisposeRgn (clip);
+ Display display = getDisplay ();
+ Color foreground = item.foreground != null ? item.foreground : display.getSystemColor (SWT.COLOR_LIST_FOREGROUND);
+ Color background = item.background != null ? item.background : display.getSystemColor (SWT.COLOR_LIST_BACKGROUND);
+ gc.setForeground (foreground);
+ gc.setBackground (background);
+ gc.fillRectangle (x, y, width, height);
+ Image image = item.image;
+ if (image != null) {
+ Rectangle bounds = image.getBounds ();
+ gc.drawImage (image, 0, 0, bounds.width, bounds.height, x, y, bounds.width, height);
+ x += bounds.width + 2;
+ }
+ Point extent = gc.stringExtent (item.text);
+ if ((itemState & OS.kDataBrowserItemIsSelected) != 0) {
+ gc.setForeground (display.getSystemColor (SWT.COLOR_LIST_SELECTION_TEXT));
+ gc.setBackground (display.getSystemColor (SWT.COLOR_LIST_SELECTION));
+ gc.fillRectangle (x, y, extent.x, height);
+ }
+ gc.drawString (item.text, x, y + (Math.max (0, (height - extent.y) / 2)));
+ if (paintGC == null) gc.dispose ();
+ return OS.noErr;
+}
+
+public Rectangle getClientArea () {
+ checkWidget();
+ Rect rect = new Rect (), inset = new Rect ();
+ OS.GetControlBounds (handle, rect);
+ OS.GetDataBrowserScrollBarInset (handle, inset);
+ return new Rectangle (inset.left, inset.top, rect.right - rect.left + inset.right, rect.bottom - rect.top + inset.bottom);
+}
+
public TreeItem getItem (Point point) {
checkWidget ();
if (point == null) error (SWT.ERROR_NULL_ARGUMENT);
- //OPTIMIZE
- org.eclipse.swt.internal.carbon.Point pt = new org.eclipse.swt.internal.carbon.Point ();
- OS.SetPt (pt, (short) point.x, (short) point.y);
Rect rect = new Rect ();
+ OS.GetControlBounds (handle, rect);
+ org.eclipse.swt.internal.carbon.Point pt = new org.eclipse.swt.internal.carbon.Point ();
+ OS.SetPt (pt, (short) (point.x + rect.left), (short) (point.y + rect.top));
+ //OPTIMIZE
for (int i=0; i<items.length; i++) {
TreeItem item = items [i];
if (item != null) {
@@ -290,6 +422,13 @@ public int getSelectionCount () {
return count [0];
}
+int hitTestProc (int browser, int id, int property, int theRect, int mouseRect) {
+// int index = id - 1;
+// if (!(0 <= index && index < items.length)) return 0;
+// TreeItem item = items [index];
+ return 1;
+}
+
void hookEvents () {
super.hookEvents ();
Display display= getDisplay();
@@ -299,6 +438,13 @@ void hookEvents () {
callbacks.v1_itemDataCallback = display.itemDataProc;
callbacks.v1_itemNotificationCallback = display.itemNotificationProc;
OS.SetDataBrowserCallbacks (handle, callbacks);
+ DataBrowserCustomCallbacks custom = new DataBrowserCustomCallbacks ();
+ custom.version = OS.kDataBrowserLatestCustomCallbacks;
+ OS.InitDataBrowserCustomCallbacks (custom);
+ custom.v1_drawItemCallback = display.drawItemProc;
+ custom.v1_hitTestCallback = display.hitTestProc;
+ custom.v1_trackingCallback = display.trackingProc;
+ OS.SetDataBrowserCustomCallbacks (handle, custom);
}
int itemDataProc (int browser, int id, int property, int itemData, int setValue) {
@@ -321,16 +467,16 @@ int itemDataProc (int browser, int id, int property, int itemData, int setValue)
}
break;
}
- case COLUMN_ID: {
- String text = item.text;
- char [] buffer = new char [text.length ()];
- text.getChars (0, buffer.length, buffer, 0);
- int ptr = OS.CFStringCreateWithCharacters (OS.kCFAllocatorDefault, buffer, buffer.length);
- if (ptr == 0) error (SWT.ERROR_CANNOT_SET_TEXT);
- OS.SetDataBrowserItemDataText (itemData, ptr);
- OS.CFRelease (ptr);
- break;
- }
+// case COLUMN_ID: {
+// String text = item.text;
+// char [] buffer = new char [text.length ()];
+// text.getChars (0, buffer.length, buffer, 0);
+// int ptr = OS.CFStringCreateWithCharacters (OS.kCFAllocatorDefault, buffer, buffer.length);
+// if (ptr == 0) error (SWT.ERROR_CANNOT_SET_TEXT);
+// OS.SetDataBrowserItemDataText (itemData, ptr);
+// OS.CFRelease (ptr);
+// break;
+// }
case OS.kDataBrowserItemIsContainerProperty: {
for (int i=0; i<items.length; i++) {
if (items [i] != null && items [i].parentItem == item) {
@@ -411,14 +557,45 @@ int itemNotificationProc (int browser, int id, int message) {
}
}
OS.AddDataBrowserItems (handle, id, ids.length, ids, 0);
- //BUG - items that are added in the expand callback should draw checked but don't
-// OS.UpdateDataBrowserItems (handle, id, ids.length, ids, OS.kDataBrowserItemNoProperty, OS.kDataBrowserNoItem);
break;
}
}
return OS.noErr;
}
+int kEventControlDraw (int nextHandler, int theEvent, int userData) {
+ GC currentGC = paintGC;
+ if (currentGC == null) paintGC = new GC (this);
+ int result = super.kEventControlDraw (nextHandler, theEvent, userData);
+ if (currentGC == null) {
+ paintGC.dispose ();
+ paintGC = null;
+ }
+ return result;
+}
+
+int kEventMouseDown (int nextHandler, int theEvent, int userData) {
+ int result = super.kEventMouseDown (nextHandler, theEvent, userData);
+ if (result == OS.noErr) return result;
+ /*
+ * Feature in the Macintosh. For some reason, when the user
+ * clicks on the data browser, focus is assigned, then lost
+ * and then reassigned causing kEvenControlSetFocusPart events.
+ * The fix is to ignore kEvenControlSetFocusPart when the user
+ * clicks and send the focus events from kEventMouseDown.
+ */
+ Display display = getDisplay ();
+ Control oldFocus = display.getFocusControl ();
+ display.ignoreFocus = true;
+ result = OS.CallNextEventHandler (nextHandler, theEvent);
+ display.ignoreFocus = false;
+ if (oldFocus != this) {
+ if (oldFocus != null) oldFocus.sendFocusEvent (false);
+ if (isEnabled ()) sendFocusEvent (true);
+ }
+ return result;
+}
+
void releaseWidget () {
for (int i=0; i<items.length; i++) {
TreeItem item = items [i];
@@ -485,6 +662,7 @@ public void setSelection (TreeItem [] items) {
ignoreSelect = true;
OS.SetDataBrowserSelectedItems (handle, ids.length, ids, OS.kDataBrowserItemsAssign);
ignoreSelect = false;
+ if (items.length > 0) showItem (items [0], true);
}
public void showItem (TreeItem item) {
@@ -511,9 +689,29 @@ void showItem (TreeItem item, boolean scroll) {
for (int i=path.length-1; i>=0; --i) {
path [i].setExpanded (true);
}
- int options = OS.kDataBrowserRevealWithoutSelecting;
- if (scroll) options |= OS.kDataBrowserRevealAndCenterInView;
- OS.RevealDataBrowserItem (handle, item.id, COLUMN_ID, (byte)options);
+// if (scroll) {
+// short [] width = new short [1];
+// OS.GetDataBrowserTableViewNamedColumnWidth (handle, COLUMN_ID, width);
+// Rect rect = new Rect (), inset = new Rect ();
+// OS.GetControlBounds (handle, rect);
+// OS.GetDataBrowserScrollBarInset (handle, inset);
+// OS.SetDataBrowserTableViewNamedColumnWidth (handle, COLUMN_ID, (short)(rect.right - rect.left - inset.left - inset.right));
+// OS.RevealDataBrowserItem (handle, item.id, COLUMN_ID, (byte) OS.kDataBrowserRevealWithoutSelecting);
+// OS.SetDataBrowserTableViewNamedColumnWidth (handle, COLUMN_ID, (short)width [0]);
+// }
+ if (scroll) {
+ Rectangle treeRect = getClientArea ();
+ Rectangle itemRect = item.getBounds ();
+ if (treeRect.contains (itemRect.x, itemRect.y)) return;
+ OS.RevealDataBrowserItem (handle, item.id, COLUMN_ID, (byte) OS.kDataBrowserRevealWithoutSelecting);
+ int [] top = new int [1], left = new int [1];
+ OS.GetDataBrowserScrollPosition (handle, top, left);
+ OS.SetDataBrowserScrollPosition (handle, top [0], 0);
+ itemRect = item.getBounds ();
+ if (!treeRect.contains (itemRect.x, itemRect.y)) {
+ OS.RevealDataBrowserItem (handle, item.id, COLUMN_ID, (byte) OS.kDataBrowserRevealWithoutSelecting);
+ }
+ }
}
public void showSelection () {
@@ -523,4 +721,11 @@ public void showSelection () {
if (selection.length > 0) showItem (selection [0], true);
}
+int trackingProc (int browser, int id, int property, int theRect, int startPt, int modifiers) {
+// int index = id - 1;
+// if (!(0 <= index && index < items.length)) return 0;
+// TreeItem item = items [index];
+ return 1;
+}
+
}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeItem.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeItem.java
index 2084d8ff0f..e89cb91a3c 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeItem.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/TreeItem.java
@@ -7,7 +7,8 @@ package org.eclipse.swt.widgets;
* http://www.eclipse.org/legal/cpl-v10.html
*/
-import org.eclipse.swt.internal.carbon.*;
+import org.eclipse.swt.internal.carbon.OS;
+import org.eclipse.swt.internal.carbon.Rect;
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
@@ -17,6 +18,7 @@ public class TreeItem extends Item {
TreeItem parentItem;
int id, index = -1;
boolean checked;
+ Color foreground, background;
public TreeItem (Tree parent, int style) {
super (parent, style);
@@ -57,8 +59,7 @@ protected void checkSubclass () {
public Color getBackground () {
checkWidget ();
- //NOT DONE
- return getDisplay ().getSystemColor (SWT.COLOR_WHITE);
+ return background != null ? background : getDisplay ().getSystemColor (SWT.COLOR_LIST_BACKGROUND);
}
public Rectangle getBounds () {
@@ -66,7 +67,15 @@ public Rectangle getBounds () {
Rect rect = new Rect();
OS.GetDataBrowserItemPartBounds (parent.handle, id, Tree.COLUMN_ID, OS.kDataBrowserPropertyEnclosingPart, rect);
int x = rect.left, y = rect.top;
- int width = rect.right - rect.left;
+ int width = 0;
+ if (image != null) {
+ Rectangle bounds = image.getBounds ();
+ width += bounds.width + 2;
+ }
+ GC gc = new GC (parent);
+ Point extent = gc.stringExtent (text);
+ gc.dispose ();
+ width += extent.x;
int height = rect.bottom - rect.top;
OS.GetControlBounds (parent.handle, rect);
x -= rect.left;
@@ -95,8 +104,7 @@ public boolean getExpanded () {
public Color getForeground () {
checkWidget ();
- //NOT DONE
- return getDisplay ().getSystemColor (SWT.COLOR_BLACK);
+ return foreground != null ? foreground : getDisplay ().getSystemColor (SWT.COLOR_LIST_FOREGROUND);
}
public boolean getGrayed () {
@@ -144,15 +152,15 @@ public void setBackground (Color color) {
if (color != null && color.isDisposed ()) {
SWT.error (SWT.ERROR_INVALID_ARGUMENT);
}
- //NOT DONE
+ background = color;
+ redraw ();
}
public void setChecked (boolean checked) {
checkWidget ();
if ((parent.style & SWT.CHECK) == 0) return;
this.checked = checked;
- int parentID = parentItem == null ? OS.kDataBrowserNoItem : parentItem.id;
- OS.UpdateDataBrowserItems (parent.handle, parentID, 1, new int[] {id}, OS.kDataBrowserItemNoProperty, OS.kDataBrowserNoItem);
+ redraw ();
}
public void setExpanded (boolean expanded) {
@@ -171,7 +179,8 @@ public void setForeground (Color color) {
if (color != null && color.isDisposed ()) {
SWT.error (SWT.ERROR_INVALID_ARGUMENT);
}
- //NOT DONE
+ foreground = color;
+ redraw ();
}
public void setGrayed (boolean grayed) {
@@ -183,16 +192,20 @@ public void setGrayed (boolean grayed) {
public void setImage (Image image) {
checkWidget ();
super.setImage (image);
- int parentID = parentItem == null ? OS.kDataBrowserNoItem : parentItem.id;
- OS.UpdateDataBrowserItems (parent.handle, parentID, 1, new int[] {id}, OS.kDataBrowserItemNoProperty, OS.kDataBrowserNoItem);
+ redraw ();
}
public void setText (String string) {
checkWidget ();
if (string == null) error (SWT.ERROR_NULL_ARGUMENT);
super.setText (string);
+ redraw ();
+}
+
+void redraw () {
int parentID = parentItem == null ? OS.kDataBrowserNoItem : parentItem.id;
OS.UpdateDataBrowserItems (parent.handle, parentID, 1, new int[] {id}, OS.kDataBrowserItemNoProperty, OS.kDataBrowserNoItem);
+
}
}

Back to the top