From 41ac31787f9983e1a0e05b99817fd634ad3d7cef Mon Sep 17 00:00:00 2001 From: Felipe Heidrich Date: Tue, 15 Jul 2003 17:09:16 +0000 Subject: get rid of WidgetTable --- .../gtk/org/eclipse/swt/widgets/Button.java | 16 +-- .../gtk/org/eclipse/swt/widgets/Combo.java | 16 +-- .../gtk/org/eclipse/swt/widgets/Composite.java | 2 +- .../gtk/org/eclipse/swt/widgets/Control.java | 8 +- .../gtk/org/eclipse/swt/widgets/Display.java | 122 ++++++++++++++++----- .../gtk/org/eclipse/swt/widgets/Group.java | 8 +- .../gtk/org/eclipse/swt/widgets/Label.java | 12 +- .../gtk/org/eclipse/swt/widgets/List.java | 4 +- .../gtk/org/eclipse/swt/widgets/Menu.java | 4 +- .../gtk/org/eclipse/swt/widgets/Scrollable.java | 4 +- .../gtk/org/eclipse/swt/widgets/Shell.java | 4 +- .../gtk/org/eclipse/swt/widgets/Slider.java | 4 +- .../gtk/org/eclipse/swt/widgets/Table.java | 8 +- .../gtk/org/eclipse/swt/widgets/TableColumn.java | 4 +- .../gtk/org/eclipse/swt/widgets/Text.java | 8 +- .../gtk/org/eclipse/swt/widgets/ToolBar.java | 2 +- .../gtk/org/eclipse/swt/widgets/Tree.java | 8 +- .../gtk/org/eclipse/swt/widgets/Widget.java | 4 +- .../gtk/org/eclipse/swt/widgets/WidgetTable.java | 107 ------------------ 19 files changed, 152 insertions(+), 193 deletions(-) delete mode 100644 bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/WidgetTable.java diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java index b7aee79c73..947d1a7b10 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Button.java @@ -236,10 +236,10 @@ void createWidget (int index) { void deregister () { super.deregister (); - if (boxHandle != 0) WidgetTable.remove (boxHandle); - if (labelHandle != 0) WidgetTable.remove (labelHandle); - if (imageHandle != 0) WidgetTable.remove (imageHandle); - if (arrowHandle != 0) WidgetTable.remove (arrowHandle); + if (boxHandle != 0) display.removeWidget (boxHandle); + if (labelHandle != 0) display.removeWidget (labelHandle); + if (imageHandle != 0) display.removeWidget (imageHandle); + if (arrowHandle != 0) display.removeWidget (arrowHandle); } int fontHandle () { @@ -401,10 +401,10 @@ void hookEvents () { void register () { super.register (); - if (boxHandle != 0) WidgetTable.put (boxHandle, this); - if (labelHandle != 0) WidgetTable.put (labelHandle, this); - if (imageHandle != 0) WidgetTable.put (imageHandle, this); - if (arrowHandle != 0) WidgetTable.put (arrowHandle, this); + if (boxHandle != 0) display.addWidget (boxHandle, this); + if (labelHandle != 0) display.addWidget (labelHandle, this); + if (imageHandle != 0) display.addWidget (imageHandle, this); + if (arrowHandle != 0) display.addWidget (arrowHandle, this); } void releaseHandle () { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java index 2be2396cd8..01cfb58bc9 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java @@ -407,11 +407,11 @@ GdkColor defaultForeground () { void deregister () { super.deregister (); - if (arrowHandle != 0) WidgetTable.remove (arrowHandle); - WidgetTable.remove (entryHandle); - WidgetTable.remove (listHandle); + if (arrowHandle != 0) display.removeWidget (arrowHandle); + display.removeWidget (entryHandle); + display.removeWidget (listHandle); int imContext = imContext (); - if (imContext != 0) WidgetTable.remove (imContext); + if (imContext != 0) display.removeWidget (imContext); } int fontHandle () { @@ -872,11 +872,11 @@ int parentingHandle() { void register () { super.register (); - if (arrowHandle != 0) WidgetTable.put (arrowHandle, this); - WidgetTable.put (entryHandle, this); - WidgetTable.put (listHandle, this); + if (arrowHandle != 0) display.addWidget (arrowHandle, this); + display.addWidget (entryHandle, this); + display.addWidget (listHandle, this); int imContext = imContext (); - if (imContext != 0) WidgetTable.put (imContext, this); + if (imContext != 0) display.addWidget (imContext, this); } void releaseHandle () { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java index 993effbcea..887f39515f 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java @@ -92,7 +92,7 @@ Control [] _getChildren () { while (i < count) { int handle = OS.g_list_nth_data (list, i); if (handle != 0) { - Widget widget = WidgetTable.get (handle); + Widget widget = display.getWidget (handle); if (widget != null && widget != this) { if (widget instanceof Control) { children [j++] = (Control) widget; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java index 65a78c5249..ffb03147a8 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java @@ -100,9 +100,9 @@ GdkColor defaultForeground () { void deregister () { super.deregister (); - if (fixedHandle != 0) WidgetTable.remove (fixedHandle); + if (fixedHandle != 0) display.removeWidget (fixedHandle); int imHandle = imHandle (); - if (imHandle != 0) WidgetTable.remove (imHandle); + if (imHandle != 0) display.removeWidget (imHandle); } void enableWidget (boolean enabled) { @@ -1997,9 +1997,9 @@ Decorations menuShell () { void register () { super.register (); - if (fixedHandle != 0) WidgetTable.put (fixedHandle, this); + if (fixedHandle != 0) display.addWidget (fixedHandle, this); int imHandle = imHandle (); - if (imHandle != 0) WidgetTable.put (imHandle, this); + if (imHandle != 0) display.addWidget (imHandle, this); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java index 8ab3d6aa1d..111776571c 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java @@ -102,6 +102,17 @@ public class Display extends Device { EventTable eventTable, filterTable; static String APP_NAME = "SWT"; + /* Widget Table */ + int freeSlot; + int [] indexTable; + Widget [] widgetTable; + final static int GROW_SIZE = 1024; + static final int SWT_OBJECT_INDEX; + static { + byte [] buffer = Converter.wcsToMbcs (null, "SWT_OBJECT_INDEX", true); + SWT_OBJECT_INDEX = OS.g_quark_from_string (buffer); + } + /* Input method resources */ Control imControl; int preeditWindow, preeditLabel; @@ -368,6 +379,29 @@ void addPopup (Menu menu) { popups [index] = menu; } +void addWidget (int handle, Widget widget) { + if (handle == 0) return; + if (freeSlot == -1) { + int length = (freeSlot = indexTable.length) + GROW_SIZE; + int[] newIndexTable = new int[length]; + Widget[] newWidgetTable = new Widget [length]; + System.arraycopy (indexTable, 0, newIndexTable, 0, freeSlot); + System.arraycopy (widgetTable, 0, newWidgetTable, 0, freeSlot); + for (int i = freeSlot; i < length - 1; i++) { + newIndexTable[i] = i + 1; + } + newIndexTable[length - 1] = -1; + indexTable = newIndexTable; + widgetTable = newWidgetTable; + } + int index = freeSlot + 1; + OS.g_object_set_qdata (handle, SWT_OBJECT_INDEX, index); + int oldSlot = freeSlot; + freeSlot = indexTable[oldSlot]; + indexTable [oldSlot] = -2; + widgetTable [oldSlot] = widget; +} + /** * Causes the run() method of the runnable to * be invoked by the user-interface thread at the next @@ -604,7 +638,7 @@ int eventProc (int event, int data) { OS.gdk_window_get_user_data (window, user_data); int handle = user_data [0]; if (handle != 0) { - Widget widget = WidgetTable.get (handle); + Widget widget = getWidget (handle); if (widget != null && widget instanceof Control) { control = (Control) widget; if (control.isEnabled ()) break; @@ -653,7 +687,7 @@ int eventProc (int event, int data) { */ public Widget findWidget (int handle) { checkDevice (); - return WidgetTable.get (handle); + return getWidget (handle); } /** @@ -730,7 +764,7 @@ public Control getCursorControl () { int handle = user_data [0]; if (handle == 0) return null; do { - Widget widget = WidgetTable.get (handle); + Widget widget = getWidget (handle); if (widget != null && widget instanceof Control) { Control control = (Control) widget; if (control.getEnabled ()) return control; @@ -927,7 +961,7 @@ public Control getFocusControl () { int handle = OS.gtk_window_get_focus (shellHandle); if (handle == 0) return null; do { - Widget widget = WidgetTable.get (handle); + Widget widget = getWidget (handle); if (widget != null && widget instanceof Control) { Control window = (Control) widget; if (window.getEnabled ()) return window; @@ -1043,23 +1077,28 @@ public Monitor getPrimaryMonitor () { */ public Shell [] getShells () { checkDevice (); - int count = 0; - Shell [] shells = WidgetTable.shells (); - for (int i=0; i @@ -1510,7 +1564,7 @@ public Rectangle map (Control from, Control to, int x, int y, int width, int hei } int mouseHoverProc (int handle) { - Widget widget = WidgetTable.get (handle); + Widget widget = getWidget (handle); if (widget == null) return 0; return widget.hoverProc (handle); } @@ -1611,12 +1665,10 @@ synchronized void register () { */ protected void release () { sendEvent (SWT.Dispose, new Event ()); - Shell [] shells = WidgetTable.shells (); + Shell [] shells = getShells (); for (int i=0; i