Dear
Eclipse Gurus:
I am
aware of the myriad warnings about subclassing SWT widgets, but I'm trying to
learn about those limitations in greater depth.
My
objective is to make the SashForm resize its subcomponents
dynamically as the divider is dragged. I have succeeded in doing this by
creating essentially a complete copy of the SashForm
(DynamicSashForm) and commenting out one line of the
DynamicSashForm onDragSash event.
This works fine,
but there is one aesthetic problem. The Sash draws a
"rough" pattern over the divider as it is being dragged. To
defeat this, I'm attempting to override the drawBand method (I
believe this is where the "rough" pattern is being
drawn).
BUT when I create my copy of the Sash
(DynamicSash), I run into perplexing problems. Understand
that since many of the functions in Sash and Control
are declared as "package", for DynamicSash I have
no choice but to declare my DynamicSash as
org.eclipse.swt.widgets.DynamicSash. DynamicSash
is a complete copy of Sash and is a descendant
of Control.
To
implement DynamicSash, I replace all
Sash references in DynamicSashForm with
DynamicSash.
The
observable results are bizzare. When I instantiate my
DynamicSashForm, I get the following stack trace (see below)
which is the first of many issues. I don't know exactly what is
going on, but my guess is that Eclipse must be doing something unusual
in the class loading functions. If anyone can
explain why I'm getting the IllegalAccessError, it will
likely shed light on numerious other strange, strange behaviors that I get
when I try other angles of attack to circumvent this
problems.
Similarly strange behaviors result if I simply
try to subclass the Sash. It's hard to explain, but
it seems as if the system loads my DynamicSash class,
while other parts of the system treat the class as if it were the original
SWT Sash. For example, using the debugger
to single-step step through the drag event handler seems
to ignore my descendant methods, even though my
DynamicSash is provably being instantiated (as evidenced
by both a constructor diagnostic and by the debugger itself, that confirms
my object is of type DynamicSash).
I've
checked the method signatures until I am blue in the face. The system
is ignoring my descendant methods, except for the
constructor.
Does
anyone understand how this could be happening?
TIA,
Dave
java.lang.IllegalAccessError: tried
to access method org.eclipse.swt.widgets.Widget.checkBits(IIIIIII)I from class
org.eclipse.swt.widgets.DynamicSash at
org.eclipse.swt.widgets.DynamicSash.checkStyle(DynamicSash.java:114) at
org.eclipse.swt.widgets.DynamicSash.<init>(DynamicSash.java:72) at
com.corticon.eclipse.common.ui.DynamicSashForm.layout(DynamicSashForm.java:218) at
com.corticon.eclipse.common.ui.DynamicSashForm$1.handleEvent(DynamicSashForm.java:84) at
org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82) at
org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:796) at
org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:820) at
org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:801) at
org.eclipse.swt.widgets.Control.WM_SIZE(Control.java:4171) at
org.eclipse.swt.widgets.Scrollable.WM_SIZE(Scrollable.java:312) at
org.eclipse.swt.widgets.Composite.WM_SIZE(Composite.java:875) at
org.eclipse.swt.widgets.Control.windowProc(Control.java:3037) at
org.eclipse.swt.widgets.Display.windowProc(Display.java:3338) at
org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method) at
org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:1462) at
org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77) at
org.eclipse.swt.widgets.Control.windowProc(Control.java:3050) at
org.eclipse.swt.widgets.Display.windowProc(Display.java:3338) at
org.eclipse.swt.internal.win32.OS.SetWindowPos(Native Method) at
org.eclipse.swt.widgets.Widget.SetWindowPos(Widget.java:1044) at
org.eclipse.swt.widgets.Control.setBounds(Control.java:1882) at
org.eclipse.swt.widgets.Control.setBounds(Control.java:1861) at
org.eclipse.swt.layout.FillLayout.layout(FillLayout.java:148) at
org.eclipse.swt.widgets.Composite.WM_SIZE(Composite.java:884) at
org.eclipse.swt.widgets.Control.windowProc(Control.java:3037) at
org.eclipse.swt.widgets.Display.windowProc(Display.java:3338) at
org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method) at
org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:1462) at
org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77) at
org.eclipse.swt.widgets.Control.windowProc(Control.java:3050) at
org.eclipse.swt.widgets.Display.windowProc(Display.java:3338) at
org.eclipse.swt.internal.win32.OS.EndDeferWindowPos(Native Method) at
org.eclipse.swt.widgets.Composite.resizeChildren(Composite.java:432) at
org.eclipse.swt.widgets.Composite.resizeChildren(Composite.java:398) at
org.eclipse.swt.widgets.Composite.setResizeChildren(Composite.java:499) at
org.eclipse.swt.widgets.Composite.WM_SIZE(Composite.java:887) at
org.eclipse.swt.widgets.Control.windowProc(Control.java:3037) at
org.eclipse.swt.widgets.Display.windowProc(Display.java:3338) at
org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method) at
org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:1462) at
org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77) at
org.eclipse.swt.widgets.Control.windowProc(Control.java:3050) at
org.eclipse.swt.widgets.Display.windowProc(Display.java:3338) at
org.eclipse.swt.internal.win32.OS.SetWindowPos(Native Method) at
org.eclipse.swt.widgets.Widget.SetWindowPos(Widget.java:1044) at
org.eclipse.swt.widgets.Control.setBounds(Control.java:1882) at
org.eclipse.swt.widgets.Control.setBounds(Control.java:1861) at
org.eclipse.swt.layout.FillLayout.layout(FillLayout.java:148) at
org.eclipse.swt.widgets.Composite.WM_SIZE(Composite.java:884) at
org.eclipse.swt.widgets.Control.windowProc(Control.java:3037) at
org.eclipse.swt.widgets.Display.windowProc(Display.java:3338) at
org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method) at
org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:1462) at
org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77) at
org.eclipse.swt.widgets.Control.windowProc(Control.java:3050) at
org.eclipse.swt.widgets.Display.windowProc(Display.java:3338) at
org.eclipse.swt.internal.win32.OS.SetWindowPos(Native Method) at
org.eclipse.swt.widgets.Widget.SetWindowPos(Widget.java:1044) at
org.eclipse.swt.widgets.Control.setBounds(Control.java:1882) at
org.eclipse.swt.widgets.Control.setBounds(Control.java:1861) at
org.eclipse.swt.layout.FillLayout.layout(FillLayout.java:148) at
org.eclipse.swt.widgets.Composite.WM_SIZE(Composite.java:884) at
org.eclipse.swt.widgets.Control.windowProc(Control.java:3037) at
org.eclipse.swt.widgets.Display.windowProc(Display.java:3338) at
org.eclipse.swt.internal.win32.OS.DefWindowProcW(Native Method) at
org.eclipse.swt.internal.win32.OS.DefWindowProc(OS.java:1462) at
org.eclipse.swt.widgets.Scrollable.callWindowProc(Scrollable.java:77) at
org.eclipse.swt.widgets.Control.windowProc(Control.java:3050) at
org.eclipse.swt.widgets.Display.windowProc(Display.java:3338) at
org.eclipse.swt.internal.win32.OS.SetWindowPos(Native Method) at
org.eclipse.swt.widgets.Widget.SetWindowPos(Widget.java:1044) at
org.eclipse.swt.widgets.Control.setBounds(Control.java:1882) at
org.eclipse.swt.widgets.Control.setBounds(Control.java:1861) at
org.eclipse.swt.widgets.Control.setBounds(Control.java:1926) at
org.eclipse.ui.internal.LayoutPart.setBounds(LayoutPart.java:290) at
org.eclipse.ui.internal.presentations.PresentablePart.setBounds(PresentablePart.java:115) at
org.eclipse.ui.internal.presentations.DefaultPartPresentation.layout(DefaultPartPresentation.java:723) at
org.eclipse.ui.internal.presentations.DefaultPartPresentation.setControlSize(DefaultPartPresentation.java:733) at
org.eclipse.ui.internal.presentations.DefaultPartPresentation.selectPart(DefaultPartPresentation.java:1123) at
org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:946) at
org.eclipse.ui.internal.PartStack.setSelection(PartStack.java:921) at
org.eclipse.ui.internal.PartStack.showPart(PartStack.java:1020) at
org.eclipse.ui.internal.PartStack.add(PartStack.java:290) at
org.eclipse.ui.internal.EditorStack.add(EditorStack.java:110) at
org.eclipse.ui.internal.EditorSashContainer.addEditor(EditorSashContainer.java:59) at
org.eclipse.ui.internal.EditorAreaHelper.openEditor(EditorAreaHelper.java:266) at
org.eclipse.ui.internal.EditorManager$4.run(EditorManager.java:697) at
org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69) at
org.eclipse.ui.internal.EditorManager.createEditorTab(EditorManager.java:686) at
org.eclipse.ui.internal.EditorManager.openInternalEditor(EditorManager.java:782) at
org.eclipse.ui.internal.EditorManager.openEditorFromDescriptor(EditorManager.java:585) at
org.eclipse.ui.internal.EditorManager.openEditor(EditorManager.java:573) at
org.eclipse.ui.internal.WorkbenchPage.busyOpenEditorBatched(WorkbenchPage.java:2201) at
org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:2134) at
org.eclipse.ui.internal.WorkbenchPage.access$6(WorkbenchPage.java:2126) at
org.eclipse.ui.internal.WorkbenchPage$9.run(WorkbenchPage.java:2113) at
org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69) at
org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2108) at
org.eclipse.ui.ide.IDE.openEditor(IDE.java:299) at
org.eclipse.ui.actions.OpenFileAction.openFile(OpenFileAction.java:96) at
org.eclipse.ui.actions.OpenSystemEditorAction.run(OpenSystemEditorAction.java:94) at
org.eclipse.ui.views.navigator.OpenActionGroup.runDefaultAction(OpenActionGroup.java:111) at
org.eclipse.ui.views.navigator.MainActionGroup.runDefaultAction(MainActionGroup.java:293) at
org.eclipse.ui.views.navigator.ResourceNavigator.handleOpen(ResourceNavigator.java:624) at
org.eclipse.ui.views.navigator.ResourceNavigator$6.open(ResourceNavigator.java:388) at
org.eclipse.jface.viewers.StructuredViewer$2.run(StructuredViewer.java:429) at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:615) at
org.eclipse.core.runtime.Platform.run(Platform.java:747) at
org.eclipse.jface.viewers.StructuredViewer.fireOpen(StructuredViewer.java:427) at
org.eclipse.jface.viewers.StructuredViewer.handleOpen(StructuredViewer.java:635) at
org.eclipse.jface.viewers.StructuredViewer$6.handleOpen(StructuredViewer.java:731) at
org.eclipse.jface.util.OpenStrategy.fireOpenEvent(OpenStrategy.java:211) at
org.eclipse.jface.util.OpenStrategy.access$2(OpenStrategy.java:206) at
org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:238) at
org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82) at
org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:796) at
org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:2772) at
org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2431) at
org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1377) at
org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1348) at
org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:254) at
org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:141) at
org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:96) at
org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:335) at
org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:273) at
org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:129) at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at
java.lang.reflect.Method.invoke(Method.java:324) at
org.eclipse.core.launcher.Main.basicRun(Main.java:183) at
org.eclipse.core.launcher.Main.run(Main.java:644) at
org.eclipse.core.launcher.Main.main(Main.java:628)
David
Lynch General Manager
SOTA Enterprises, Inc. 690 South La Luna Avenue Ojai, California
93023 Voice 805-640-1212 Fax 805-640-1907 Pager 626-932-2140 mailto:davidlynch@xxxxxxxx

|