[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[platform-swt-dev] mac os x port: native Tree patches


Hi, I implemented the grayed property in Tree/TreeItem from carbon2.

What I did:
1. Added the boolean field "grayed" to "TreeItem" and implemented the methods "get/setGrayed"
2. Extended functionality of "Tree´s" "itemDataProc" so that it sets the grayed property correctly and sends corresponding events.
3. Adjusted "Tree´s" "itemNotification" due to strange behaviour when the twistie or the checkbox was doubleClicked.
-> The behavior now is not to send a "SWT.DefaultSelection" event after twistie or checkbox have been hit twice.
4. Added three constants to "OS".
5. Tested against Junit Tests. -> Didn´t get worse because of new functionality.
6. Tested in slefhosted eclipse. -> see above.


Here are the files:


Index: OS.java
===================================================================
RCS file: /home/eclipse/org.eclipse.swt/Eclipse SWT PI/carbon/org/eclipse/swt/internal/carbon/OS.java,v
retrieving revision 1.66
diff -u -r1.66 OS.java
--- OS.java	19 Dec 2002 22:17:28 -0000	1.66
+++ OS.java	29 Dec 2002 00:41:02 -0000
@@ -170,6 +170,8 @@
 	public static final int kDataBrowserNoItem = 0;
 	public static final int kDataBrowserOrderIncreasing = 1;
 	public static final int kDataBrowserPropertyEnclosingPart = 0;
+	public static final int kDataBrowserPropertyDisclosurePart = ('d'<<24) + ('i'<<16) + ('s'<<8) + 'c';
+	public static final int kDataBrowserPropertyCheckboxPart = ('c'<<24) + ('h'<<16) + ('b'<<8) + 'x';
 	public static final int kDataBrowserPropertyIsMutable = 1 << 0;
 	public static final int kDataBrowserRevealOnly = 0;
 	public static final int kDataBrowserRevealAndCenterInView = 1 << 0;
@@ -404,6 +406,7 @@
 	public static final int kThemeBrushListViewBackground = 10; 
 	public static final int kThemeButtonOff = 0;
 	public static final int kThemeButtonOn = 1;
+	public static final int kThemeButtonMixed = 2;
 	public static final int kThemeCheckBox = 1;
 	public static final int kThemeCrossCursor = 5;
 	public static final int kThemeCurrentPortFont = 200;
Index: TreeItem.java
===================================================================
RCS file: /home/eclipse/org.eclipse.swt/Eclipse SWT/carbon2/org/eclipse/swt/widgets/TreeItem.java,v
retrieving revision 1.1
diff -u -r1.1 TreeItem.java
--- TreeItem.java	12 Dec 2002 13:48:19 -0000	1.1
+++ TreeItem.java	29 Dec 2002 00:30:48 -0000
@@ -18,6 +18,7 @@
 	TreeItem parentItem;
 	int id, index = -1;
 	boolean checked;
+	boolean grayed;
 	Color foreground, background;
 
 public TreeItem (Tree parent, int style) {
@@ -110,8 +111,7 @@
 public boolean getGrayed () {
 	checkWidget ();
 	if ((parent.style & SWT.CHECK) == 0) return false;
-	//NOT DONE
-	return false;
+	return grayed;
 }
 
 public int getItemCount () {
@@ -186,7 +186,8 @@
 public void setGrayed (boolean grayed) {
 	checkWidget ();
 	if ((parent.style & SWT.CHECK) == 0) return;
-	//NOT DONE
+	this.grayed = grayed;
+	redraw();
 }
 
 public void setImage (Image image) {
Index: Tree.java
===================================================================
RCS file: /home/eclipse/org.eclipse.swt/Eclipse SWT/carbon2/org/eclipse/swt/widgets/Tree.java,v
retrieving revision 1.2
diff -u -r1.2 Tree.java
--- Tree.java	12 Dec 2002 22:04:58 -0000	1.2
+++ Tree.java	29 Dec 2002 00:24:25 -0000
@@ -25,6 +25,7 @@
 	boolean ignoreSelect, ignoreExpand;
 	static final int CHECK_COLUMN_ID = 1024;
 	static final int COLUMN_ID = 1025;
+	private org.eclipse.swt.internal.carbon.Point mouseClickLocation;
 
 public Tree (Composite parent, int style) {
 	super (parent, checkStyle (style));
@@ -156,6 +157,7 @@
 		if (items [i] != null && items [i].parentItem == parentItem) count++;
 	}
 	if (index == -1) index = count;
+	if (index > count) error(SWT.ERROR_INVALID_ARGUMENT); 
 	item.index = index;
 	for (int i=0; i<items.length; i++) {
 		if (items [i] != null && items [i].parentItem == parentItem) {
@@ -456,13 +458,24 @@
 			if (setValue != 0) {
 				short [] theData = new short [1];
 				OS.GetDataBrowserItemDataButtonValue (itemData, theData);
-				item.checked = theData [0] == OS.kThemeButtonOn;
+				if (theData[0]==0){		  //  theData [0] == OS.kThemeButtonOff
+					item.checked = false;
+					item.grayed  = false;
+				}
+				else if (theData[0]==1){  //  theData [0] == OS.kThemeButtonOn
+					item.checked = true;
+					item.grayed  = false;
+				}
+				else if (theData[0] >= 2){  //  theData [0] == OS.kThemeButtonOn | OS.kThemeButtonMixed
+					item.checked = false;
+					item.grayed  = true;
+				}
 				Event event = new Event ();
 				event.item = item;
 				event.detail = SWT.CHECK;
 				postEvent (SWT.Selection, event);
 			} else {
-				short theData = (short)(item.checked ? OS.kThemeButtonOn : OS.kThemeButtonOff);
+				short theData = (short)(item.grayed ? 2 :  item.checked ? OS.kThemeButtonOn : OS.kThemeButtonOff);
 				OS.SetDataBrowserItemDataButtonValue (itemData, theData);
 			}
 			break;
@@ -481,6 +494,7 @@
 			for (int i=0; i<items.length; i++) {
 				if (items [i] != null && items [i].parentItem == item) {
 					OS.SetDataBrowserItemDataBooleanValue (itemData, true);
+					break;
 				}
 			}
 			break;
@@ -528,9 +542,21 @@
 			break;
 		}	
 		case OS.kDataBrowserItemDoubleClicked: {
-			Event event = new Event ();
-			event.item = item;
-			postEvent (SWT.DefaultSelection, event);
+			boolean processDoubleClick = false;
+			org.eclipse.swt.internal.carbon.Rect rect = new org.eclipse.swt.internal.carbon.Rect();
+			OS.GetDataBrowserItemPartBounds(handle, item.id, Tree.COLUMN_ID, 
+					OS.kDataBrowserPropertyDisclosurePart, rect);
+			processDoubleClick = (mouseClickLocation.h < rect.left || mouseClickLocation.h > rect.right);
+			if((style & SWT.MULTI) != 0 && !processDoubleClick)  {
+				OS.GetDataBrowserItemPartBounds(handle, item.id, Tree.CHECK_COLUMN_ID, 
+						OS.kDataBrowserPropertyCheckboxPart, rect);
+				processDoubleClick = (mouseClickLocation.h < rect.left || mouseClickLocation.h > rect.right);
+			}
+			if(processDoubleClick) {
+				Event event = new Event ();
+				event.item = item;
+				postEvent (SWT.DefaultSelection, event);
+			}
 			break;
 		}
 		case OS.kDataBrowserContainerClosed: {
@@ -557,6 +583,7 @@
 				}
 			}
 			OS.AddDataBrowserItems (handle, id, ids.length, ids, 0);
+			item.redraw();
 			break;
 		}
 	}
@@ -575,8 +602,22 @@
 }
 
 int kEventMouseDown (int nextHandler, int theEvent, int userData) {
-	int result = super.kEventMouseDown (nextHandler, theEvent, userData);
+	int result = -1;
+	
+	/* store Location of mouseClick for processing in itemNotification*/ 	
+	int sizeof = org.eclipse.swt.internal.carbon.Point.sizeof;
+	mouseClickLocation = new org.eclipse.swt.internal.carbon.Point ();
+	OS.GetEventParameter (theEvent, OS.kEventParamMouseLocation, OS.typeQDPoint, null, sizeof, null, mouseClickLocation);
+	int [] theWindow = new int [1];
+	int part = OS.FindWindow (mouseClickLocation, theWindow);
+	Rect windowRect = new Rect ();
+	OS.GetWindowBounds (theWindow [0], (short) OS.kWindowContentRgn, windowRect);
+	mouseClickLocation.h = (short) (mouseClickLocation.h - windowRect.left);
+	mouseClickLocation.v = (short) (mouseClickLocation.v - windowRect.top);
+
+	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



Hope this helps martin