Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarin Wright2001-05-18 06:25:56 -0400
committerDarin Wright2001-05-18 06:25:56 -0400
commit3e4fc4400f54e51207e1b92bdc1232e6e68d5e88 (patch)
tree3a47ad5727e750d31a2d475c6abb70e016394dfb
downloadeclipse.platform.debug-3e4fc4400f54e51207e1b92bdc1232e6e68d5e88.tar.gz
eclipse.platform.debug-3e4fc4400f54e51207e1b92bdc1232e6e68d5e88.tar.xz
eclipse.platform.debug-3e4fc4400f54e51207e1b92bdc1232e6e68d5e88.zip
*** empty log message ***
-rw-r--r--.gitignore11
-rw-r--r--org.eclipse.debug.core/.classpath9
-rw-r--r--org.eclipse.debug.core/.cvsignore1
-rw-r--r--org.eclipse.debug.core/.options1
-rw-r--r--org.eclipse.debug.core/.vcm_meta6
-rw-r--r--org.eclipse.debug.core/build.properties2
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/DebugEvent.java204
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/DebugException.java39
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/DebugPlugin.java226
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointListener.java62
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointManager.java253
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugConstants.java66
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugEventListener.java30
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugStatusConstants.java61
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunch.java79
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchListener.java36
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchManager.java151
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/ILauncher.java96
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/IStreamListener.java34
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/Launch.java259
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpointSupport.java87
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugElement.java175
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugTarget.java52
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDisconnect.java51
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILauncherDelegate.java109
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/IProcess.java75
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISourceLocator.java68
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStackFrame.java60
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStep.java91
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java49
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java58
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISuspendResume.java64
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/ITerminate.java47
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/IThread.java57
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValue.java100
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValueModification.java55
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/IVariable.java78
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/package.html57
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/package.html176
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java487
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreResources.properties55
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreUtils.java58
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java160
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java241
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/Launcher.java113
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ListenerList.java142
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ProcessMonitor.java72
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/RuntimeProcess.java202
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java86
-rw-r--r--org.eclipse.debug.core/doc/hglegal.htm19
-rw-r--r--org.eclipse.debug.core/doc/ngibmcpy.gifbin0 -> 1542 bytes
-rw-r--r--org.eclipse.debug.core/doc/org_eclipse_debug_core.html36
-rw-r--r--org.eclipse.debug.core/doc/org_eclipse_debug_core_launchers.html95
-rw-r--r--org.eclipse.debug.core/exportplugin.xml28
-rw-r--r--org.eclipse.debug.core/plugin.jars1
-rw-r--r--org.eclipse.debug.core/plugin.xml37
-rw-r--r--org.eclipse.debug.ui/.classpath12
-rw-r--r--org.eclipse.debug.ui/.cvsignore1
-rw-r--r--org.eclipse.debug.ui/.options1
-rw-r--r--org.eclipse.debug.ui/.vcm_meta6
-rw-r--r--org.eclipse.debug.ui/build.properties2
-rw-r--r--org.eclipse.debug.ui/doc/hglegal.htm19
-rw-r--r--org.eclipse.debug.ui/doc/ngibmcpy.gifbin0 -> 1542 bytes
-rw-r--r--org.eclipse.debug.ui/doc/org_eclipse_debug_ui.html32
-rw-r--r--org.eclipse.debug.ui/doc/org_eclipse_debug_ui_debugModelPresentations.html56
-rw-r--r--org.eclipse.debug.ui/exportplugin.xml32
-rw-r--r--org.eclipse.debug.ui/icons/full/clcl16/clear_co.gifbin0 -> 162 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/clcl16/disconnect_co.gifbin0 -> 227 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/clcl16/qnames_co.gifbin0 -> 132 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/clcl16/rem_all_co.gifbin0 -> 117 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/clcl16/rem_co.gifbin0 -> 97 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/clcl16/resume_co.gifbin0 -> 128 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/clcl16/stepinto_co.gifbin0 -> 144 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/clcl16/stepover_co.gifbin0 -> 159 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/clcl16/stepreturn_co.gifbin0 -> 144 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/clcl16/suspend_co.gifbin0 -> 102 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/clcl16/terminate_co.gifbin0 -> 109 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/clcl16/tnames_co.gifbin0 -> 181 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/ctool16/debug_exc.gifbin0 -> 166 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/ctool16/run_exc.gifbin0 -> 125 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/cview16/breakpoint_view.gifbin0 -> 132 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/cview16/console_view.gifbin0 -> 120 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/cview16/debug_persp.gifbin0 -> 240 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/cview16/debug_view.gifbin0 -> 138 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/cview16/process_view.gifbin0 -> 170 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/cview16/variable_view.gifbin0 -> 134 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/cview16/watchlist_view.gifbin0 -> 148 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dlcl16/clear_co.gifbin0 -> 91 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dlcl16/disconnect_co.gifbin0 -> 97 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dlcl16/qnames_co.gifbin0 -> 95 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dlcl16/rem_all_co.gifbin0 -> 80 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dlcl16/rem_co.gifbin0 -> 66 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dlcl16/resume_co.gifbin0 -> 79 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dlcl16/stepinto_co.gifbin0 -> 85 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dlcl16/stepover_co.gifbin0 -> 96 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dlcl16/stepreturn_co.gifbin0 -> 85 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dlcl16/suspend_co.gifbin0 -> 76 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dlcl16/terminate_co.gifbin0 -> 85 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dlcl16/tnames_co.gifbin0 -> 101 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dtool16/debug_exc.gifbin0 -> 104 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/dtool16/run_exc.gifbin0 -> 94 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/clear_co.gifbin0 -> 122 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/disconnect_co.gifbin0 -> 162 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/qnames_co.gifbin0 -> 122 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/rem_all_co.gifbin0 -> 111 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/rem_co.gifbin0 -> 97 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/resume_co.gifbin0 -> 97 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/stepinto_co.gifbin0 -> 144 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/stepover_co.gifbin0 -> 159 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/stepreturn_co.gifbin0 -> 144 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/suspend_co.gifbin0 -> 102 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/terminate_co.gifbin0 -> 108 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/elcl16/tnames_co.gifbin0 -> 145 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/etool16/debug_exc.gifbin0 -> 138 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/etool16/run_exc.gifbin0 -> 122 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/eview16/breakpoint_view.gifbin0 -> 165 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/eview16/console_view.gifbin0 -> 121 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/eview16/debug_persp.gifbin0 -> 176 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/eview16/debug_view.gifbin0 -> 166 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/eview16/process_view.gifbin0 -> 172 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/eview16/variable_view.gifbin0 -> 161 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/eview16/watchlist_view.gifbin0 -> 179 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/obj16/brkp_obj.gifbin0 -> 128 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/obj16/brkpd_obj.gifbin0 -> 124 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/obj16/debugt_obj.gifbin0 -> 179 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/obj16/debugtt_obj.gifbin0 -> 161 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/obj16/expression_obj.gifbin0 -> 155 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/obj16/ldebug_obj.gifbin0 -> 166 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/obj16/lrun_obj.gifbin0 -> 141 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/obj16/osprc_obj.gifbin0 -> 184 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/obj16/osprct_obj.gifbin0 -> 248 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/obj16/stckframe_obj.gifbin0 -> 100 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/obj16/thread_obj.gifbin0 -> 215 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/obj16/threads_obj.gifbin0 -> 162 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/obj16/threadt_obj.gifbin0 -> 216 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/ovr16/stcksync_ov.gifbin0 -> 79 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/wizban/debug_wiz.gifbin0 -> 2538 bytes
-rw-r--r--org.eclipse.debug.ui/icons/full/wizban/run_wiz.gifbin0 -> 2494 bytes
-rw-r--r--org.eclipse.debug.ui/plugin.jars1
-rw-r--r--org.eclipse.debug.ui/plugin.properties34
-rw-r--r--org.eclipse.debug.ui/plugin.xml189
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugView.java160
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AddToInspectorAction.java37
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BasicContentProvider.java90
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BreakpointsContentProvider.java92
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BreakpointsView.java254
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ChangeVariableValueAction.java199
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ClearOutputAction.java32
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ColorManager.java33
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleDocument.java433
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleGotoLineAction.java104
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleOutputTextStore.java63
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsolePreferencePage.java76
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleView.java210
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleViewer.java168
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleViewerAction.java48
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ControlAction.java56
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ControlActionDelegate.java145
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/CopyToClipboardActionDelegate.java89
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugAction.java34
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugContentProvider.java267
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugDropDownAction.java32
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugMenuManager.java26
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPerspective.java59
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPluginImages.java216
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPreferencePage.java53
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java1111
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIResources.properties252
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIUtils.java74
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugView.java506
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DelegatingModelPresentation.java460
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DisconnectActionDelegate.java37
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/EnableDisableBreakpointAction.java125
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ExecutionAction.java261
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IDebugPreferenceConstants.java42
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IInternalDebugUIConstants.java51
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectItem.java41
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorAction.java56
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorContentProvider.java234
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorList.java38
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorView.java159
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorViewAddToInspectorAction.java64
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchDropDownAction.java98
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchSelectionAction.java71
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWithAction.java132
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizard.java217
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardDialog.java55
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardNode.java104
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardProjectSelectionPage.java290
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardSelectionPage.java232
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LauncherPropertyPage.java250
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchesView.java219
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchesViewer.java87
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchesViewerFilter.java66
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LazyModelPresentation.java159
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/OpenBreakpointMarkerAction.java55
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/OpenMarkerAction.java57
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ProcessesContentProvider.java61
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RelaunchActionDelegate.java65
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RelaunchHistoryLaunchAction.java53
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RelaunchLastAction.java70
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveAllBreakpointsAction.java86
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveAllFromInspectorAction.java33
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveBreakpointAction.java77
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveFromInspectorAction.java55
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveTerminatedAction.java82
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ResumeActionDelegate.java56
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RunAction.java33
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RunDropDownAction.java32
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ShowQualifiedAction.java58
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ShowTypesAction.java61
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/StepActionDelegate.java57
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/StepIntoActionDelegate.java37
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/StepOverActionDelegate.java36
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/StepReturnActionDelegate.java36
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/StringMatcher.java409
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/SuspendActionDelegate.java50
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/TerminateActionDelegate.java38
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/TerminateAllAction.java66
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/TerminateAndRemoveActionDelegate.java59
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/VariablesContentProvider.java98
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/VariablesView.java162
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugUITools.java116
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugModelPresentation.java161
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugUIConstants.java387
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugUIEventFilter.java56
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/ui/IDebugViewAdapter.java57
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/ui/ILaunchWizard.java61
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/ui/package.html87
229 files changed, 16726 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..c550c6af7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,11 @@
+bin/
+*~
+*.rej
+*.bak
+*.patch
+javacore.*
+heapdump.*
+core.*
+Snap.*
+target/
+
diff --git a/org.eclipse.debug.core/.classpath b/org.eclipse.debug.core/.classpath
new file mode 100644
index 000000000..13b851a2c
--- /dev/null
+++ b/org.eclipse.debug.core/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="lib" path="C:\eclipse\jre\lib\rt.jar"/>
+ <classpathentry kind="src" path="Eclipse Debug Core"/>
+ <classpathentry kind="lib" path="C:\eclipse\plugins\org.apache.xerces\xerces.jar"/>
+ <classpathentry kind="lib" path="C:\eclipse\plugins\org.eclipse.core.resources\resources.jar"/>
+ <classpathentry kind="lib" path="C:\eclipse\plugins\org.eclipse.core.runtime\runtime.jar"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.debug.core/.cvsignore b/org.eclipse.debug.core/.cvsignore
new file mode 100644
index 000000000..c5e82d745
--- /dev/null
+++ b/org.eclipse.debug.core/.cvsignore
@@ -0,0 +1 @@
+bin \ No newline at end of file
diff --git a/org.eclipse.debug.core/.options b/org.eclipse.debug.core/.options
new file mode 100644
index 000000000..a3e35f6ef
--- /dev/null
+++ b/org.eclipse.debug.core/.options
@@ -0,0 +1 @@
+org.eclipse.debug.core/debug=true \ No newline at end of file
diff --git a/org.eclipse.debug.core/.vcm_meta b/org.eclipse.debug.core/.vcm_meta
new file mode 100644
index 000000000..aae2e1b3e
--- /dev/null
+++ b/org.eclipse.debug.core/.vcm_meta
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-description>
+ <nature id="org.eclipse.jdt.core.javanature"/>
+ <builder name="org.eclipse.jdt.core.javabuilder">
+ </builder>
+</project-description>
diff --git a/org.eclipse.debug.core/build.properties b/org.eclipse.debug.core/build.properties
new file mode 100644
index 000000000..69173dbf3
--- /dev/null
+++ b/org.eclipse.debug.core/build.properties
@@ -0,0 +1,2 @@
+build.includes=.options,plugin.jars,plugin.xml
+build.vaj.Eclipse\ Debug\ Core=Eclipse Debug Core \ No newline at end of file
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugEvent.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugEvent.java
new file mode 100644
index 000000000..33fdcb1ad
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugEvent.java
@@ -0,0 +1,204 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import java.util.EventObject;
+
+/**
+ * A debug event describes an event in a program being debugged.
+ * Debug model implementations are required to generate debug events as
+ * specified by this class. Debug events also describe the creation and
+ * termiation of system processes.
+ * <p>
+ * The following list defines the events that are required to
+ * be generated for each element type, and when the event should be created.
+ * The object that an event is associated
+ * with is available from the event's <code>getSource</code> method. Creation
+ * events are guaranteed to occur in a top down order - that is, parents are created
+ * before children. Termination events are guaranteed to occur in a bottom up order -
+ * that is, children before parents. However, termination events are not guaranteed
+ * for all elements that are created. That is, terminate events can be coalesced - a
+ * terminate event for a parent signals that all children have been terminated.
+ * </p>
+ * <p>
+ * The generic <code>CHANGE</code> event can be fired at any time by any element.
+ * Generally, a client of a debug model, such as as a UI, can get sufficient
+ * information to update by listening/responding to the other event kinds. However,
+ * if a debug model needs to inform clients of a change that is not specified
+ * by create/terminate/suspend/resume, the <code>CHANGE</code> event may be used.
+ * For example, generally, the only way a thread or any of its children can change
+ * state between a suspend and resume operation, is if the thread or owning debug
+ * target is termianted. However, if a debug model supports some other operation
+ * that would allow a debug element to change state while suspended, the debug model
+ * would fire a change event for that element.
+ * </p>
+ * <ul>
+ * <li><code>IDebugTarget</code>
+ * <ul>
+ * <li><code>CREATE</code> - a debug target has been created and is ready
+ * to begin a debug session.</li>
+ * <li><code>TERMINATE</code> - a debug target has terminated and the debug
+ * session has ended.</li>
+ * </ul>
+ * </li>
+ * <li><code>IThread</code>
+ * <ul>
+ * <li><code>CREATE</code> - a thread has been created in a debug target.</li>
+ * <li><code>TERMINATE</code> - a thread has ended.</li>
+ * <li><code>SUSPEND</code> - a thread has suspended. Event detail provides
+ * the reason for the suspension, or -1 if unknown:<ul>
+ * <li>STEP_END - a request to step has completed</li>
+ * <li>BREAKPOINT - a breakpoint has been hit</li>
+ * <li>CLIENT_REQUEST - a user request has caused the thread to suspend</li>
+ * </ul>
+ * </li>
+ * <li><code>RESUME</code> - a thread has resumed. Event detail provides
+ * the reason for the resume, or -1 if unknown:<ul>
+ * <li>STEP_START - a thread is being resumed because of a request to step</li>
+ * <li>CLIENT_REQUEST - a thread is being resumed</li>
+ * </ul>
+ * </li>
+ * </ul>
+ * </li>
+ * <li><code>IStackFrame</code> - no events are specified for stack frames.
+ * When a thread is suspended, it has children (stack frames). When a thread resumes,
+ * stack frames are unavailable.
+ * </li>
+ * <li><code>IVariable</code> - no events are specified for variables.
+ * When a thread is suspended, stack frames have variables. When a thread resumes,
+ * variables are unavailable.
+ * </li>
+ * <li><code>IValue</code> - no events are specified for values.
+ * </li>
+ * <li><code>IProcess</code>
+ * <ul>
+ * <li><code>CREATE</code> - a system process has been created.</li>
+ * <li><code>TERMINATE</code> - a system process has terminated.</li>
+ * </ul>
+ * </li>
+ * </ul>
+ * <p>
+ * Clients may instantiate this class. Clients are not intended to subclass this class.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public final class DebugEvent extends EventObject {
+
+ /**
+ * Resume event.
+ */
+ public static final int RESUME= 0x0001;
+
+ /**
+ * Suspend event.
+ */
+ public static final int SUSPEND= 0x0002;
+
+ /**
+ * Create event.
+ */
+ public static final int CREATE= 0x0004;
+
+ /**
+ * Terminate event.
+ */
+ public static final int TERMINATE= 0x0008;
+
+ /**
+ * Change event.
+ */
+ public static final int CHANGE= 0x0010;
+
+ /**
+ * Step start detail. Indicates a thread was resumed by a step action.
+ */
+ public static final int STEP_START= 0x0001;
+
+ /**
+ * Step end detail. Indicates a thread was suspended due
+ * to the completion of a step action.
+ */
+ public static final int STEP_END= 0x0002;
+
+ /**
+ * Breakpoint detail. Indicates a thread was suspended by
+ * a breakpoint.
+ */
+ public static final int BREAKPOINT= 0x0004;
+
+ /**
+ * Client request detail. Indicates a thread was suspended due
+ * to a client request.
+ */
+ public static final int CLIENT_REQUEST= 0x0008;
+
+ /**
+ * The kind of event - one of the kind constants defined by
+ * this class.
+ */
+ private int fKind= 0;
+
+ /**
+ * The detail of the event - one of the detail constants defined by
+ * this class.
+ */
+ private int fDetail= -1;
+ /**
+ * Constructs a new debug event of the given kind with a detail code of -1.
+ *
+ * @param eventSource the object that generated the event
+ * @param kind the kind of debug envent (one of the
+ * constants in <code>IDebugEventConstants</code>)
+ */
+ public DebugEvent(Object eventSource, int kind) {
+ this(eventSource, kind, -1);
+ }
+
+ /**
+ * Constructs a new debug event of the given kind with the given detail.
+ *
+ * @param eventSource the object that generated the event
+ * @param kind the kind of debug envent (one of the
+ * kine constants defined by this class)
+ * @param detail extra information about the event (one of the
+ * detail constants defined by this class), or -1 if
+ * unspecified
+ */
+ public DebugEvent(Object eventSource, int kind, int detail) {
+ super(eventSource);
+ if ((kind & (RESUME | SUSPEND | CREATE | TERMINATE | CHANGE)) == 0)
+ throw new IllegalArgumentException("kind is not one of the allowed constants, see IDebugEventConstants");
+ if (detail != -1 && (detail & (STEP_END | STEP_START | BREAKPOINT | CLIENT_REQUEST)) == 0)
+ throw new IllegalArgumentException("detail is not one of the allowed constants, see IDebugEventConstants");
+ fKind= kind;
+ fDetail= detail;
+ }
+
+ /**
+ * Returns a constant describing extra detail about the event - one
+ * of the detail constants defined by this class, or -1 if unspecified.
+ *
+ * @return the detail code
+ */
+ public int getDetail() {
+ return fDetail;
+ }
+
+ /**
+ * Returns this event's kind - one of the kind constants defined by this class.
+ */
+ public int getKind() {
+ return fKind;
+ }
+
+}
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugException.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugException.java
new file mode 100644
index 000000000..0480f26bc
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugException.java
@@ -0,0 +1,39 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+
+
+/**
+ * A checked exception representing a failure.
+ * <p>
+ * Clients may instantiate this class. Clients are not intended to subclass this class.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see IStatus
+ */
+public class DebugException extends CoreException {
+
+ /**
+ * Constructs a new debug exception with the given status object.
+ *
+ * @param status the status object to be associated with this exception
+ * @see IStatus
+ */
+ public DebugException(IStatus status) {
+ super(status);
+ }
+
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugPlugin.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugPlugin.java
new file mode 100644
index 000000000..8b38fe6bc
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/DebugPlugin.java
@@ -0,0 +1,226 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.debug.core.model.IProcess;
+import org.eclipse.debug.internal.core.*;
+import org.eclipse.core.runtime.*;
+
+/**
+ * There is one instance of the debug plugin available from
+ * <code>DebugPlugin.getDefault()</code>. The debug plugin provides:
+ * <ul>
+ * <li>access to the breakpoint manager</li>
+ * <li>access to the launch manager</li>
+ * <li>access to the registered launcher extensions</li>
+ * <li>registration for debug events</li>
+ * <li>notification of debug events</li>
+ * </ul>
+ * <p>
+ * Clients may not instantiate or subclass this class.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public class DebugPlugin extends Plugin {
+
+ /**
+ * The singleton debug plug-in instance.
+ */
+ private static DebugPlugin fgDebugPlugin= null;
+
+ /**
+ * The collection of launcher extensions.
+ */
+ private Launcher[] fLaunchers= new Launcher[0];
+
+ /**
+ * The singleton breakpoint manager.
+ */
+ private BreakpointManager fBreakpointManager;
+
+ /**
+ * The singleton launch manager.
+ */
+ private LaunchManager fLaunchManager;
+
+ /**
+ * The collection of debug event listeners.
+ */
+ private ListenerList fEventListeners= new ListenerList(20);
+
+ /**
+ * Internal state...<code>true</code> if this plugin is in the
+ * process of shutting down.
+ */
+ private boolean fShuttingDown= false;
+
+ /**
+ * Returns the singleton instance of the debug plug-in.
+ */
+ public static DebugPlugin getDefault() {
+ return fgDebugPlugin;
+ }
+
+ /**
+ * Constructs the debug plug-in.
+ * <p>
+ * An instance of this plug-in runtime class is automatically created
+ * when the facilities provided by the Resources plug-in are required.
+ * <b>Clients must never explicitly instantiate a plug-in runtime class.</b>
+ * </p>
+ *
+ * @param pluginDescriptor the plug-in descriptor for the
+ * debug plug-in
+ */
+ public DebugPlugin(IPluginDescriptor descriptor) {
+ super(descriptor);
+ fgDebugPlugin= this;
+ }
+
+ /**
+ * Adds the given listener to the collection of registered debug
+ * event listeners. Has no effect if an identical listener is already
+ * registered.
+ *
+ * @param listener the listener to add
+ */
+ public void addDebugEventListener(IDebugEventListener listener) {
+ fEventListeners.add(listener);
+ }
+
+ /**
+ * Notifies all registered debug event listeners of the given event.
+ *
+ * @param event the debug event to fire
+ */
+ public void fireDebugEvent(DebugEvent event) {
+ if (fShuttingDown || event == null)
+ return;
+
+ Object[] listeners= fEventListeners.getListeners();
+ for (int i= 0; i < listeners.length; i++) {
+ ((IDebugEventListener) listeners[i]).handleDebugEvent(event);
+ }
+ }
+
+ /**
+ * Returns the breakpoint manager.
+ *
+ * @return the breakpoint manager
+ * @see IBreakpointManager
+ */
+ public IBreakpointManager getBreakpointManager() {
+ return fBreakpointManager;
+ }
+
+ /**
+ * Returns a collection of launcher extensions. Launchers represent
+ * and provide access to launcher extensions, delaying instantiation of
+ * the underlying launcher delegates until required.
+ *
+ * @return an array of launchers
+ * @see org.eclipse.debug.core.model.ILauncherDelegate
+ */
+ public ILauncher[] getLaunchers() {
+ return fLaunchers;
+ }
+
+ /**
+ * Returns the launch manager.
+ *
+ * @return the launch manager
+ * @see ILaunchManager
+ */
+ public ILaunchManager getLaunchManager() {
+ return fLaunchManager;
+ }
+
+ /**
+ * Loads all launcher extensions.
+ *
+ * @exception CoreException if creation of a launcher extension fails
+ */
+ protected void loadLaunchers() throws CoreException {
+ IPluginDescriptor descriptor= getDescriptor();
+ IExtensionPoint extensionPoint= descriptor.getExtensionPoint(IDebugConstants.EXTENSION_POINT_LAUNCHER);
+ IConfigurationElement[] infos= extensionPoint.getConfigurationElements();
+ fLaunchers= new Launcher[infos.length];
+ for (int i= 0; i < infos.length; i++) {
+ fLaunchers[i]= new Launcher(infos[i]);
+ }
+ }
+
+ /**
+ * Removes the given listener from the collection of registered debug
+ * event listeners. Has no effect if an identical listener is not already
+ * registered.
+ *
+ * @param listener the listener to remove
+ */
+ public void removeDebugEventListener(IDebugEventListener listener) {
+ fEventListeners.remove(listener);
+ }
+
+ /**
+ * Shuts down this debug plug-in and discards all plug-in state.
+ * <p>
+ * This method will be automatically invoked by the platform when
+ * the platform is shut down.
+ * </p>
+ * <b>Clients must never explicitly call this method.</b>
+ *
+ * @exception CoreException if this plug-in fails to shut down
+ */
+ public void shutdown() throws CoreException {
+ fShuttingDown= true;
+ super.shutdown();
+ fLaunchManager.shutdown();
+ fBreakpointManager.shutdown();
+ fgDebugPlugin= null;
+ }
+
+ /**
+ * Starts up the debug plug-in. This involves creating the launch and
+ * breakpoint managers, creating proxies to all launcher extensions,
+ * and restoring all persisted breakpoints.
+ * <p>
+ * This method is automatically invoked by the platform
+ * the first time any code in this plug-in is executed.
+ * </p>
+ * <b>Clients must never explicitly call this method.</b>
+ *
+ * @see Plugin#startup
+ * @exception CoreException if this plug-in fails to start up
+ */
+ public void startup() throws CoreException {
+ fLaunchManager= new LaunchManager();
+ fBreakpointManager= new BreakpointManager();
+ loadLaunchers();
+ fBreakpointManager.startup();
+ }
+
+ /**
+ * Creates and returns a new process representing the given
+ * <code>java.lang.Process</code>. A streams proxy is created
+ * for the I/O streams in the system process.
+ *
+ * @param process the system process to wrap
+ * @param label the label assigned to the process
+ * @return the process
+ * @see IProcess
+ */
+ public static IProcess newProcess(Process process, String label) {
+ return new RuntimeProcess(process, label);
+ }
+}
+
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointListener.java
new file mode 100644
index 000000000..10c8009e9
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointListener.java
@@ -0,0 +1,62 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IMarkerDelta;
+
+/**
+ * A breakpoint listener is notified of breakpoint additions,
+ * removals, and changes. Listeners register and deregister with the
+ * breakpoint manager.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see IBreakpointManager
+ */
+
+public interface IBreakpointListener {
+
+ /**
+ * Notifies this listener that the given breakpoint has been added.
+ *
+ * @param breakpoint the added breakpoint
+ */
+ public void breakpointAdded(IMarker breakpoint);
+ /**
+ * Notifies this listener that the given breakpoint has been removed.
+ * If the given marker has been removed because it has been deleted,
+ * the associated marker delta is also provided such that any attributes
+ * of the marker can still be accessed.
+ *
+ * @param breakpoint the removed breakpoint
+ * @param delta the associated marker delta, or <code>null</code> when
+ * the breakpoint is removed from the breakpoint manager without
+ * being deleted
+ *
+ * @see org.eclipse.core.resources.IMarkerDelta
+ */
+ public void breakpointRemoved(IMarker breakpoint, IMarkerDelta delta);
+
+ /**
+ * Notifies this listener that an attribute of the given breakpoint has
+ * changed, as described by the delta.
+ *
+ * @param breakpoint the changed breakpoint
+ * @param delta the marker delta that describes the change
+ *
+ * @see org.eclipse.core.resources.IMarkerDelta
+ */
+ public void breakpointChanged(IMarker breakpoint, IMarkerDelta delta);
+
+} \ No newline at end of file
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointManager.java
new file mode 100644
index 000000000..89a2ed266
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/IBreakpointManager.java
@@ -0,0 +1,253 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * The breakpoint manager manages the collection of breakpoints
+ * in the workspace. A breakpoint suspends the execution of a
+ * program being debugged. The kinds of breakpoint supported by each
+ * debug architecture and the information required to create those
+ * breakpoints is dictated by each debug architecture.
+ * <p>
+ * Breakpoints are implemented by markers. The debug plug-in defines a root
+ * breakpoint marker of which all breakpoints should be subtypes. The
+ * debug plug-in also defines a common line breakpoint. Convenience methods
+ * are defined to configure the attributes of breakpoints defined by
+ * the debug plug-in. See <code>configureBreakpoint(IMarker, String, boolean)</code>
+ * and <code>configureLineBreakpoint(IMarker, String, boolean, int, int, int)</code>.
+ * </p>
+ * <p>All breakpoints have:<ul>
+ * <li> a model identifier, specifying the identifier of the debug model the breakpoint
+ * is intended for</li>
+ * <li> a enabled attribute, specifying if the breakpoint is enabled or disabled</li>.
+ * </ul>
+ * Additionally, all line breakpoints have a line number and/or a character start and
+ * end range.
+ * </p>
+ * <p>
+ * Breakpoint creation is a client responsibility. Creation of a breakpoint requires
+ * the creation of a marker. It is a client responsibility to determine which
+ * resource a breakpoint marker should be associated/persisted with. Breakpoints
+ * are only considered active when registered with the breakpoint manager.
+ * </p>
+ * <p>
+ * As launches are registered and deregistered, the breakpoint
+ * manager automatically adds and removes debug targets associated with those
+ * lauches, as breakpoint listeners.
+ * Debug targets (implementors of <code>IBreakpointSupport</code>) are
+ * informed of breakpoint additions, removals, and changes if they
+ * respond <code>true</code> to <code>supportsBreakpoints()</code>.
+ * A debug target is responsible for installing all existing
+ * (applicable) breakpoints when created.
+ * </p>
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see IMarker
+ * @see org.eclipse.debug.core.model.IBreakpointSupport
+ */
+public interface IBreakpointManager {
+
+ /**
+ * Configures the given breakpoint's <code>MODEL_IDENTIFIER</code>
+ * and <code>ENABLED</code> attributes to the given values.
+ * This is a convenience method for
+ * <code>IMarker.setAttribute(String, String)</code> and
+ * <code>IMarker.setAttribute(String, boolean)</code>.
+ *
+ * @param breakpoint the breakpoint marker to configure
+ * @param modelIdentifier the identifier of the debug model plug-in
+ * the breakpoint is associated with
+ * @param enabled the initial value of the enabled attribute of the
+ * breakpoint marker
+ *
+ * @exception CoreException if setting an attribute fails
+ * @see IMarker#setAttribute(String, String)
+ * @see IMarker#setAttribute(String, boolean)
+ */
+ void configureBreakpoint(IMarker breakpoint, String modelIdentifier, boolean enabled) throws CoreException;
+
+ /**
+ * Configures the given breakpoint's <code>MODEL_IDENTIFIER</code>,
+ * <code>ENABLED</code>, <code>LINE_NUMBER</code>, <code>CHAR_START</code>,
+ * and <code>CHAR_END</code> attributes to the given values.
+ * This is a convenience method for
+ * <code>IMarker.setAttribute(String, String)</code>,
+ * <code>IMarker.setAttribute(String, boolean)</code>, and
+ * <code>IMarker.setAttribute(String, int)</code>.
+ *
+ * @param breakpoint the line breakpoint marker to configure
+ * @param modelIdentifier the identifier of the debug model plug-in
+ * the breakpoint is associated with
+ * @param enabled the initial value of the enabled attribute of the
+ * breakpoint marker
+ * @param lineNumber the line number the breakpoint is associated with, or -1
+ * if unknown
+ * @param charStart the index in an associated source element, of the first
+ * character associated with the breakoint, or -1 if unknown
+ * @param charEnd the index in an associated source element, of the last
+ * character associated with the breakoint, or -1 if unknown
+ *
+ * @exception CoreException if setting an attribute fails
+ * @see IMarker#setAttribute(String, String)
+ * @see IMarker#setAttribute(String, boolean)
+ * @see IMarker#setAttribute(String, int)
+ */
+ void configureLineBreakpoint(IMarker breakpoint, String modelIdentifier, boolean enabled, int lineNumber, int charStart, int charEnd) throws CoreException;
+
+ /**
+ * Adds the given breakpoint to the collection of active breakpoints
+ * in the workspace and notifies all registered listeners. This has no effect
+ * if the given breakpoint is already registered.
+ *
+ * @param breakpoint the breakpoint to add
+ *
+ * @exception DebugException if adding fails. Reasons include:<ul>
+ * <li>CONFIGURATION_INVALID - the required <code>MODEL_IDENTIFIER</code> attribute
+ * is not set on the breakpoint marker.</li>
+ * <li>A <code>CoreException</code> occurred while verifying the <code>MODEL_IDENTIFIER</code>
+ * attribute.</li>
+ * </ul>
+ */
+ void addBreakpoint(IMarker breakpoint) throws DebugException;
+
+ /**
+ * Returns a collection of all existing breakpoints.
+ * Returns an empty array if no breakpoints exist.
+ *
+ * @return an array of breakpoint markers
+ */
+ IMarker[] getBreakpoints();
+
+ /**
+ * Returns a collection of all breakpoints registered for the
+ * given debug model. Answers an empty array if no breakpoints are registered
+ * for the given debug model.
+ *
+ * @param modelIdentifier identifier of a debug model plug-in
+ * @return an array of breakpoint markers
+ */
+ IMarker[] getBreakpoints(String modelIdentifier);
+
+ /**
+ * Returns the value of the <code>ENABLED</code> attribute of the
+ * given breakpoint - <code>true</code> if the breakpoint is enabled,
+ * otherwise <code>false</code>. By default, if the attribute has not
+ * been set, a breakpoint is considered enabled.
+ * Note, this method returns <code>false</code>
+ * if an exception occurs while accessing the attribute. This is
+ * a convenience method for
+ * <code>IMarker.getAttribute(String, boolean)</code>.
+ *
+ * @param breakpoint the breakpoint
+ * @return whether the breakpoint is enabled
+ * @see IMarker#getAttribute(String, boolean)
+ */
+ boolean isEnabled(IMarker breakpoint);
+
+ /**
+ * Sets the value of the <code>ENABLED</code> attribute of the
+ * given breakpoint. This is a convenience method for
+ * <code>IMarker.setAttribute(String, boolean)</code>.
+ *
+ * @exception CoreException if setting the attribute fails
+ * @see IMarker#setAttribute(String, boolean)
+ */
+ void setEnabled(IMarker breakpoint, boolean value) throws CoreException;
+
+ /**
+ * Returns whether the given breakpoint is currently
+ * registered with this breakpoint manager.
+ *
+ * @return whether the breakpoint is registered
+ */
+ boolean isRegistered(IMarker marker);
+
+ /**
+ * Returns the value of the <code>LINE_NUMBER</code> attribute of the
+ * given breakpoint or -1 if the attribute is not present or
+ * an exception occurs while accessing the attribute. This is a
+ * convenience method for <code>IMarker.getAttribute(String, int)</code>.
+ *
+ * @param breakpoint the breakpoint
+ * @return the breakpoint's line number, or -1 if unknown
+ */
+ int getLineNumber(IMarker breakpoint);
+
+ /**
+ * Returns the value of the <code>CHAR_START</code> attribute of the
+ * given breakpoint or -1 if the attribute is not present, or
+ * an exception occurs while accessing the attribute. This is a
+ * convenience method for <code>IMarker.getAttribute(String, int)</code>
+ *
+ * @param breakpoint the breakpoint
+ * @return the breakpoint's char start value, or -1 if unknown
+ */
+ int getCharStart(IMarker breakpoint);
+
+ /**
+ * Returns the value of the <code>CHAR_END</code> attribute of the
+ * given breakpoint or -1 if the attribute is not present or
+ * an exception occurs while accessing the attribute.
+ * This is a convenience method for <code>IMarker.getAttribute(String, int)</code>.
+ *
+ * @param breakpoint the breakpoint
+ * @return the breakpoint's char end value, or -1 if unknown
+ */
+ int getCharEnd(IMarker breakpoint);
+
+ /**
+ * Returns the value of the <code>MODEL_IDENTIFIER</code> attribute of the
+ * given breakpoint or <code>null</code> if the attribute is not present or
+ * an exception occurs while accessing the attribute. This is a convenience method
+ * for <code>IMarker.getAttribute(String, String)</code>.
+ *
+ * @param breakpoint the breakpoint
+ * @return the breakpoint's debug model plug-in identifier, or <code>null</code>
+ * if an exception occurs retrieving the attribute
+ */
+ String getModelIdentifier(IMarker breakpoint);
+
+ /**
+ * Removes the given breakpoint from the breakpoint manager, and notifies all
+ * registered listeners. The marker is deleted if the <code>delete</code> flag is
+ * true. Has no effect if the given breakpoint is not currently registered.
+ *
+ * @param breakpoint the breakpoint to remove
+ * @param delete whether the breakpoint marker should be deleted
+ * @exception CoreException if an exception occurs while deleting the marker.
+ */
+ void removeBreakpoint(IMarker breakpoint, boolean delete) throws CoreException;
+
+ /**
+ * Adds the given listener to the collection of registered breakpoint listeners.
+ * Has no effect if an identical listener is already registered.
+ *
+ * @param listener the listener to add
+ */
+ void addBreakpointListener(IBreakpointListener listener);
+
+ /**
+ * Removes the given listener from the collection of registered breakpoint listeners.
+ * Has no effect if an identical listener is not already registered.
+ *
+ * @param listener the listener to remove
+ */
+ void removeBreakpointListener(IBreakpointListener listener);
+
+}
+
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugConstants.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugConstants.java
new file mode 100644
index 000000000..15763c7d4
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugConstants.java
@@ -0,0 +1,66 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+/**
+ * Defines constants for the debug tools infrastructure plug-in.
+ * <p>
+ * Constants only; not intended to be implemented.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public interface IDebugConstants {
+
+ /**
+ * Debug infrastructure plug-in identifier
+ * (value <code>"org.eclipse.debug.core"</code>).
+ */
+ public static final String PLUGIN_ID = "org.eclipse.debug.core";
+
+ /**
+ * Launcher extension point identifier
+ * (value <code>"launchers"</code>).
+ */
+ public static final String EXTENSION_POINT_LAUNCHER= "launchers";
+
+ /**
+ * Root breakpoint marker type
+ * (value <code>"org.eclipse.debug.core.breakpoint"</code>).
+ */
+ public static final String BREAKPOINT_MARKER = PLUGIN_ID + ".breakpoint";
+
+ /**
+ * Line breakpoint marker type.
+ * (value <code>"org.eclipse.debug.core.lineBreakpoint"</code>).
+ */
+ public static final String LINE_BREAKPOINT_MARKER = PLUGIN_ID + ".lineBreakpoint";
+
+ /**
+ * Debug model identifier breakpoint marker attribute
+ * (value <code>"modelIdentifier"</code>).
+ * This attribute is a <code>String<code> corresponding to the identifier
+ * of a debug model plugin a breakpoint is associated with.
+ *
+ * @see org.eclipse.core.resources.IMarker.getAttribute(String, String)
+ */
+ public static final String MODEL_IDENTIFIER = "modelIdentifier";
+
+ /**
+ * Enabled breakpoint marker attribute (value <code>"enabled"</code>).
+ * The attribute is a <code>boolean</code> corresponding to the
+ * enabled state of a breakpoint.
+ *
+ * @see org.eclipse.core.resources.IMarker.getAttribute(String, boolean)
+ */
+ public final static String ENABLED= "enabled";
+
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugEventListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugEventListener.java
new file mode 100644
index 000000000..4d077b56e
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugEventListener.java
@@ -0,0 +1,30 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+/**
+ * A debug event listener registers with the debug model manager
+ * to receive event notification from all programs being debugged.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see DebugEvent
+ */
+public interface IDebugEventListener {
+ /**
+ * Notifies this listener of the given debug event.
+ *
+ * @param event the debug event
+ */
+ public void handleDebugEvent(DebugEvent event);
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugStatusConstants.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugStatusConstants.java
new file mode 100644
index 000000000..080681369
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/IDebugStatusConstants.java
@@ -0,0 +1,61 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+/**
+ * Defines status codes relevant to the debug plug-in. When a
+ * debug exception is thrown, it contain a status object describing
+ * the cause of the exception. The status objects originating from the
+ * debug plug-in use the codes defined in this interface.
+ * <p>
+ * Constants only; not intended to be implemented.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see IStatus
+ */
+public interface IDebugStatusConstants {
+
+ /**
+ * Indicates a request made of a debug element has failed
+ * on the target side.
+ */
+ public static final int TARGET_REQUEST_FAILED = 5010;
+
+ /**
+ * Indicates a request is not supported by the capabilities of a debug element.
+ * For example, a request was made to terminate an element that does not
+ * support termination.
+ */
+ public static final int NOT_SUPPORTED = 5011;
+
+ /**
+ * Indicates that a request made of a debug element or manager has failed
+ * on the client side (that is, before the request was sent to the debug target).
+ */
+ public static final int REQUEST_FAILED = 5012;
+
+ /**
+ * Indicates an internal error. This is an unexpected state.
+ */
+ public static final int INTERNAL_ERROR = 5013;
+
+ /**
+ * Indicates an improperly configured breakpoint. Breakpoints have a minimal
+ * set of required attributes as defined by the breakpoint manager.
+ *
+ * @see IBreakpointManager
+ */
+ public static final int CONFIGURATION_INVALID = 5014;
+
+}
+
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunch.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunch.java
new file mode 100644
index 000000000..15066af7a
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunch.java
@@ -0,0 +1,79 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.model.*;
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * A launch is the result of launching a debug session
+ * and/or one or more system processes.
+ * <p>
+ * This interface is not intended to be implemented by clients. Clients
+ * should create instances of this interface by using the implementation
+ * provided by the class <code>Launch</code>.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see Launch
+ */
+public interface ILaunch extends ITerminate, IAdaptable {
+ /**
+ * Returns the children of this launch - at least one of a debug target
+ * and/or one or more processes.
+ *
+ * @return an array (element type:<code>IDebugTarget</code> or <code>IProcess</code>)
+ */
+ Object[] getChildren();
+ /**
+ * Returns the debug target associated with this launch, or <code>null</code>
+ * if no debug target is associated with this launch.
+ *
+ * @return the debug target associated with this launch, or <code>null</code>
+ */
+ IDebugTarget getDebugTarget();
+ /**
+ * Returns the object that was launched. Cannot return <code>null</code>.
+ *
+ * @return the launched object
+ */
+ Object getElement();
+ /**
+ * Returns the launcher that was used to launch. Cannot return <code>null</code>.
+ *
+ * @return the launcher
+ */
+ ILauncher getLauncher();
+ /**
+ * Returns the processes that were launched,
+ * or an empty collection if no processes were launched.
+ *
+ * @return array of processes
+ */
+ IProcess[] getProcesses();
+ /**
+ * Returns the source locator to use for locating source elements for
+ * the debug target associated with this launch, or <code>null</code>
+ * if source mapping is not supported.
+ *
+ * @return the source locator
+ */
+ ISourceLocator getSourceLocator();
+ /**
+ * Returns the mode of this launch - one of the mode constants defined by
+ * the launch manager.
+ *
+ * @return the launch mode
+ * @see ILaunchManager
+ */
+ public String getLaunchMode();
+
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchListener.java
new file mode 100644
index 000000000..bb359ca03
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchListener.java
@@ -0,0 +1,36 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+/**
+ * A launch listener is notified of launches as they
+ * are registered and deregistered with the launch manager.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see ILaunch
+ */
+public interface ILaunchListener {
+ /**
+ * Notifies this listener that the specified launch has been deregistered.
+ *
+ * @param launch the deregistered launch
+ */
+ void launchDeregistered(ILaunch launch);
+ /**
+ * Notifies this listener that the specified launch has been registered.
+ *
+ * @param launch the registered launch
+ */
+ void launchRegistered(ILaunch launch);
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchManager.java
new file mode 100644
index 000000000..caabfb457
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchManager.java
@@ -0,0 +1,151 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.model.IDebugTarget;
+import org.eclipse.debug.core.model.IProcess;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * The launch manager manages the set of registered launches, maintaining
+ * a collection of active processes and debug targets. Clients interested
+ * in launch notification may register with the launch manager.
+ * <p>
+ * For convenience, a default launcher may be associated with a project.
+ * The preference is stored as a persistent property with the project.
+ * The debug UI plug-in uses this preference to help determine which
+ * launcher to invoke when the the run or debug button is pressed, based on
+ * the selection in the workbench. If a launcher cannot be determined,
+ * the user is prompted to choose a launcher.
+ * </p>
+ * <p>
+ * Clients are not intended to implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see ILaunch
+ * @see ILaunchListener
+ */
+public interface ILaunchManager extends IAdaptable {
+ /**
+ * A launch in a normal, non-debug mode(value <code>"run"</code>).
+ */
+ public static final String RUN_MODE= "run";
+ /**
+ * A launch in a special debug mode (value <code>"debug"</code>).
+ */
+ public static final String DEBUG_MODE= "debug";
+
+ /**
+ * Adds the given listener to the collection of registered launch listeners.
+ * Has no effect if an identical listener is already registerd.
+ *
+ * @param listener the listener to register
+ */
+ void addLaunchListener(ILaunchListener listener);
+ /**
+ * Deregisters the specified launch and notifies listeners. Has no effect
+ * if an identical launch is not already registered.
+ *
+ * @param launch the launch to deregister
+ */
+ void deregisterLaunch(ILaunch launch);
+ /**
+ * Returns the launch the given process is contained in, or <code>null</code>
+ * no registered launches contains the process.
+ *
+ * @param process the process for which to find a launch
+ * @return the launch containing the process, or <code>null</code> if none
+ */
+ ILaunch findLaunch(IProcess process);
+ /**
+ * Returns the launch the given debug target is contained
+ * in, or <code>null</code> no registered launches contain the debug target.
+ *
+ * @param target the debug target for which to find a launch
+ * @return the launch containing the debug target, or <code>null</code> if none
+ */
+ ILaunch findLaunch(IDebugTarget target);
+ /**
+ * Returns the collection of debug targets currently registered with this
+ * launch manager.
+ *
+ * @return an array of debug targets
+ */
+ IDebugTarget[] getDebugTargets();
+ /**
+ * Returns the default launcher for the given project,
+ * or <code>null</code> if no default launcher has been set.
+ * The default launcher is stored as a persistent property
+ * with a project.
+ *
+ * @param project the project for which to retrieve a default launcher
+ * @return the defualt launcher, or <code>null</code> if none
+ * @exception CoreException if an error occurs accessing the
+ * persistent property
+ */
+ ILauncher getDefaultLauncher(IProject project) throws CoreException;
+
+ /**
+ * Returns the collection of registered launchers that can operate in the
+ * specified mode - run or debug.
+ *
+ * @return an array of launchers
+ */
+ ILauncher[] getLaunchers(String mode);
+
+ /**
+ * Returns the collection of registered launchers.
+ *
+ * @return an array of launchers
+ */
+ ILauncher[] getLaunchers();
+ /**
+ * Returns the collection of launches currently registered
+ * with this launch manager.
+ *
+ * @return an array of launches
+ */
+ ILaunch[] getLaunches();
+ /**
+ * Returns the collection of processes currently registered with this
+ * launch manager.
+ *
+ * @return an array of processes
+ */
+ IProcess[] getProcesses();
+ /**
+ * Registers the specified launch with this launch manager.
+ * Has no effect if an identical launch is already registered.
+ *
+ * @param launch the launch to register
+ */
+ void registerLaunch(ILaunch launch);
+ /**
+ * Removes the given listener from the collection of registered launch listeners.
+ * Has no effect if an identical listener is not already registerd.
+ *
+ * @param listener the listener to deregister
+ */
+ void removeLaunchListener(ILaunchListener listener);
+ /**
+ * Sets the default launcher for the given project as a persistent property.
+ *
+ * @param project the project for which to set the preference
+ * @param launcher the launcher preference
+ * @exception CoreException if an error occurs setting the persistent property
+ */
+ void setDefaultLauncher(IProject project, ILauncher launcher) throws CoreException;
+}
+
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILauncher.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILauncher.java
new file mode 100644
index 000000000..25568c622
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILauncher.java
@@ -0,0 +1,96 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.model.ILauncherDelegate;
+import org.eclipse.core.runtime.IConfigurationElement;
+import java.util.Set;
+
+/**
+ * A launcher is a proxy to a launcher extension (<code>"org.eclipse.debug.core.launchers"</code>).
+ * It manages the attributes of a launcher extension, and lazily instantiates the
+ * delegate when required.
+ * <p>
+ * This interface is not intended to be implemented by clients. Clients
+ * that define a launcher extension implement the <code>ILauncherDelegate</code>
+ * interface.
+ * </p>
+ * <p>
+ * <b>NOTE:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see ILauncherDelegate
+ */
+public interface ILauncher {
+ /**
+ * Returns the result of invoking this underlying launcher extension's launch
+ * method. This causes the extension to be instantiated (if not already).
+ *
+ * @param elements the elements providing context for the launch
+ * @param mode the mode in which to launch - run or debug
+ * @return whether the launch was successful
+ * @see ILauncherDelegate
+ */
+ boolean launch(Object[] elements, String mode);
+
+ /**
+ * Returns the modes that the underlying launcher extension
+ * supports - run and/or debug. This will not cause the extension to
+ * be instantiated.
+ *
+ * @return a set of <code>String</code> constants - one or both of
+ * <code>ILaunchManager.RUN_MODE</code>, <code>ILaunchManager.DEBUG_MODE</code>
+ * @see ILaunchManager
+ */
+ Set getModes();
+
+ /**
+ * Returns the identifier of the perspective associated with the
+ * underlying launcher extension. This attribute determines the layout
+ * used by the debug UI plug-in when presenting this launch.
+ * This will not cause the extension to be instantiated.
+ *
+ * @return a perspective identifier, as defined by the
+ * <code>"org.eclipse.ui.perspective"</code> extension point
+ */
+ String getPerspectiveIdentifier();
+
+ /**
+ * Returns the label defined by the underlying launcher extension.
+ * This will not cause the extension to be instantiated.
+ *
+ * @return a human readable label
+ */
+ String getLabel();
+
+ /**
+ * Returns the configuration element associated with the underlying
+ * extension. This will not cause the extension to be instantiated.
+ *
+ * @return the extension's configuration element
+ */
+ IConfigurationElement getConfigurationElement();
+
+ /**
+ * Returns the unique identifier of the underlying launcher extension.
+ * This will not cause the extension to be instantiated.
+ *
+ * @return the extension's identifier attribute
+ */
+ String getIdentifier();
+
+ /**
+ * Returns the underlying launcher delegate associated with this
+ * launcher. This causes the launcher delegate to be instantiated (if
+ * not already).
+ *
+ * @return the underlying launcher extension
+ */
+ ILauncherDelegate getDelegate();
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IStreamListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IStreamListener.java
new file mode 100644
index 000000000..6a642f559
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/IStreamListener.java
@@ -0,0 +1,34 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.model.IStreamMonitor;
+
+/**
+ * An stream listener is notified of changes
+ * to a stream monitor.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see IStreamMonitor
+ */
+public interface IStreamListener {
+ /**
+ * Notifies this listener that text has been appended to
+ * the given stream monitor.
+ *
+ * @param text the appended text
+ * @paran monitor the stream monitor to which text was appended
+ */
+ public void streamAppended(String text, IStreamMonitor monitor);
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/Launch.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/Launch.java
new file mode 100644
index 000000000..983028b36
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/Launch.java
@@ -0,0 +1,259 @@
+package org.eclipse.debug.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.model.*;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.PlatformObject;
+import java.util.*;
+
+/**
+ * An implementation of <code>ILaunch</code>.
+ * <p>
+ * Clients may instantiate this class. Clients may subclass this class.
+ * All of the methods in this class that are part of the launcher interface are
+ * final. Clients that subclass this class are not intended to change the behavior
+ * or implementation of the provided methods. Subclassing is only intended
+ * to add additional information to a specific launch. For example, a client that
+ * implements a launch object representing a Java launch might store a classpath
+ * with the launch.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see ILaunch
+ * @see ILaunchManager
+ */
+
+public class Launch extends PlatformObject implements ILaunch {
+ /**
+ * Shared, immutable empty collection used for efficiency.
+ */
+ private static List fgEmptyChildren= Collections.EMPTY_LIST;
+
+ /**
+ * The target being debugged, or <code>null</code> if
+ * there is no debug target.
+ */
+ private IDebugTarget fTarget= null;
+
+ /**
+ * The element that was launched.
+ */
+ private Object fElement= null;
+
+ /**
+ * The launcher that was used.
+ */
+ private ILauncher fLauncher= null;
+
+ /**
+ * The system processes resulting from the launch.
+ */
+ private IProcess[] fProcesses= null;
+
+ /**
+ * The source locator to use in the debug session
+ * or <code>null</code> if not available.
+ */
+ private ISourceLocator fLocator= null;
+
+ /**
+ * The mode this launch was launched in.
+ */
+ private String fMode;
+
+ /**
+ * Collection of children.
+ */
+ private List fChildren= null;
+
+ /**
+ * Constructs a launch based on the specified attributes. A launch must
+ * have at least one of a process or debug target.
+ *
+ * @param launcher the launcher that created this launch
+ * @param mode the mode of this launch - run or debug
+ * @param locator the source locator to use for this debug session, or
+ * <code>null</code> if not supported
+ * @param processes the processes created by this launch, empty
+ * or <code>null</code> if none
+ * @param target the debug target created by this launch, or <code>null</code>
+ * if none
+ */
+ public Launch(ILauncher launcher, String mode, Object launchedElement, ISourceLocator locator, IProcess[] processes, IDebugTarget target) {
+ super();
+ fLauncher= launcher;
+ fElement= launchedElement;
+ fLocator= locator;
+ if (processes == null) {
+ fProcesses= new IProcess[0];
+ } else {
+ fProcesses= processes;
+ }
+ fTarget= target;
+ fMode= mode;
+ initialize();
+ }
+
+ /**
+ * @see ITerminate
+ */
+ public final boolean canTerminate() {
+ return !isTerminated();
+ }
+
+ /**
+ * @see ILaunch
+ */
+ public final Object[] getChildren() {
+ return fChildren.toArray();
+ }
+
+ /**
+ * @see ILaunch
+ */
+ public final IDebugTarget getDebugTarget() {
+ return fTarget;
+ }
+
+ /**
+ * @see ILaunch
+ */
+ public final Object getElement() {
+ return fElement;
+ }
+
+ /**
+ * @see ILaunch
+ */
+ public final ILauncher getLauncher() {
+ return fLauncher;
+ }
+
+ /**
+ * @see ILaunch
+ */
+ public final IProcess[] getProcesses() {
+ return fProcesses;
+ }
+
+ /**
+ * @see ILaunch
+ */
+ public final ISourceLocator getSourceLocator() {
+ return fLocator;
+ }
+
+ /**
+ * Build my children collection.
+ */
+ private final void initialize() {
+
+ IProcess[] ps= getProcesses();
+ if (ps != null) {
+ fChildren= new ArrayList(ps.length + 1);
+ for (int i= 0; i < ps.length; i++) {
+ fChildren.add(ps[i]);
+ }
+ }
+ if (getDebugTarget() != null) {
+ if (fChildren == null) {
+ fChildren= new ArrayList(1);
+ }
+ fChildren.add(getDebugTarget());
+ }
+ if (fChildren == null) {
+ fChildren= fgEmptyChildren;
+ }
+ }
+
+ /**
+ * @see ITerminate
+ */
+ public final boolean isTerminated() {
+ Iterator children= fChildren.iterator();
+ while (children.hasNext()) {
+ ITerminate t= (ITerminate) children.next();
+ if (!t.isTerminated()) {
+ if (t instanceof IDisconnect) {
+ IDisconnect d= (IDisconnect)t;
+ if (!d.isDisconnected()) {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ }
+ return true;
+ }
+
+ /**
+ * @see ITerminate
+ */
+ public final void terminate() throws DebugException {
+ MultiStatus status= new MultiStatus(DebugPlugin.getDefault().getDescriptor().getUniqueIdentifier(), IDebugStatusConstants.REQUEST_FAILED, "Terminate failed", null);
+ IProcess[] ps= getProcesses();
+
+ // terminate the system processes
+ if (ps != null) {
+ for (int i = 0; i < ps.length; i++) {
+ IProcess process = ps[i];
+ if (process.canTerminate()) {
+ try {
+ process.terminate();
+ } catch (DebugException e) {
+ status.merge(e.getStatus());
+ }
+ }
+ }
+ }
+
+ // disconnect debug target if it is still connected
+ IDebugTarget target= getDebugTarget();
+ if (target != null) {
+ if (target.canTerminate()) {
+ try {
+ target.terminate();
+ } catch (DebugException e) {
+ status.merge(e.getStatus());
+ }
+ } else {
+ if (target.canDisconnect()) {
+ try {
+ target.disconnect();
+ } catch (DebugException de) {
+ status.merge(de.getStatus());
+ }
+ }
+ }
+ }
+ if (status.isOK())
+ return;
+ IStatus[] children= status.getChildren();
+ if (children.length == 1) {
+ throw new DebugException(children[0]);
+ } else {
+ throw new DebugException(status);
+ }
+ }
+
+ /**
+ * @see ILaunch
+ */
+ public final String getLaunchMode() {
+ return fMode;
+ }
+}
+
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpointSupport.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpointSupport.java
new file mode 100644
index 000000000..5a40d2d28
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpointSupport.java
@@ -0,0 +1,87 @@
+package org.eclipse.debug.core.model;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.IBreakpointListener;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IMarkerDelta;
+
+/**
+ * Breakpoint support defines functionality for
+ * debug targets supporting breakpoints. The breakpoint manager
+ * automatically adds debug targets as breakpoint listeners,
+ * as launches are registered. The breakpoint
+ * manager only informs a debug target of breakpoint changes
+ * (that is, add/remove/change) if the target returns <code>true</code>
+ * from <code>supportsBreakpoint(IMarker)</code>. The breakpoint manager
+ * removes debug targets from its listener list as launches
+ * are deregistered.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public interface IBreakpointSupport extends IBreakpointListener {
+
+ /**
+ * Returns whether this target currently supports the given breakpoint.
+ * The breakpoint manager calls this method before calling an
+ * added/removed/changed method to verify this listener is interested
+ * in the given breakpoint.
+ * <p>
+ * Generally, a debug target is only interested in breakpoints that
+ * originated from its debug model, and only if the debug target has
+ * not been terminated.
+ * </p>
+ *
+ * @param breakpoint the breakpoint being added/removed/changed
+ * @return whether this target is currently interested in the breakpoint
+ */
+ boolean supportsBreakpoint(IMarker breakpoint);
+
+ /**
+ * Installs the given breakpoint in this target. The breakpoint should
+ * be deferred if it cannot be installed immediately. This method is only
+ * called if this listener supports the given breakpoint.
+ *
+ * @param breakpoint the added breakpoint
+ * @see IBreakpointListener
+ * @see #supportsBreakpoint(IMarker)
+ */
+ public void breakpointAdded(IMarker breakpoint);
+
+ /**
+ * Uninstalls the given breakpoint from this target if currently installed.
+ * This method is only called if this listener supports the given breakpoint.
+ *
+ * @param breakpoint the removed breakpoint
+ * @see IBreakpointListener
+ * @see #supportsBreakpoint(IMarker)
+ */
+ public void breakpointRemoved(IMarker breakpoint, IMarkerDelta delta);
+
+ /**
+ * An attribute of the given breakpoint has changed, as described
+ * by the delta. If the breakpoint is applicable to this target
+ * the attribute change should be reflected. For example, the enabled
+ * state may have changed, and should be updated in the target. This
+ * method is only called if this listener supports the given breakpoint.
+ *
+ * @param breakpoint the changed breakpoint
+ * @see IBreakpointListener
+ * @see #supportsBreakpoint(IMarker)
+ */
+ public void breakpointChanged(IMarker breakpoint, IMarkerDelta delta);
+
+}
+
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugElement.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugElement.java
new file mode 100644
index 000000000..c30da9168
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugElement.java
@@ -0,0 +1,175 @@
+package org.eclipse.debug.core.model;
+
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.ILaunch;
+
+/**
+ * A debug element represents an artifact in a program being
+ * debugged.
+ * <p>
+ * Some methods on debug elements require communication
+ * with the target program. Such methods may throw a <code>DebugException</code>
+ * with a status code of <code>TARGET_REQUEST_FAILED</code>
+ * when unable to complete a request due to a failure on the target.
+ * Methods that require communication with the target program or require
+ * the target to be in a specific state (for example, suspended), are declared
+ * as such.
+ * </p>
+ * <p>
+ * Debug elements are language independent. However, language specific
+ * features can be made available via the adpater mechanism provided by
+ * <code>IAdaptable</code>, or by extending the debug element interfaces.
+ * A debug model is responsible for declaring any special adapters
+ * its debug elements implement.
+ * </p>
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public interface IDebugElement extends IAdaptable {
+
+ /**
+ * Debug target type.
+ *
+ * @see IDebugTarget
+ */
+ public static final int DEBUG_TARGET= 0x0002;
+
+ /**
+ * Thread type.
+ *
+ * @see IThread
+ */
+ public static final int THREAD= 0x0004;
+
+ /**
+ * Stack frame type.
+ *
+ * @see IStackFrame
+ */
+ public static final int STACK_FRAME= 0x0008;
+
+ /**
+ * Variable type.
+ *
+ * @see IVariable
+ */
+ public static final int VARIABLE= 0x0010;
+
+ /**
+ * Value type.
+ *
+ * @see IValue
+ */
+ public static final int VALUE= 0x0012;
+
+ /**
+ * Returns the children of this debug element, or an empty collection
+ * if this element has no children.
+ *
+ * @return array of debug elements
+ * @exception DebugException if unable to retrieve this element's children
+ * from the target
+ */
+ IDebugElement[] getChildren() throws DebugException;
+ /**
+ * Returns the debug target this element originated from.
+ *
+ * @return a debug target
+ */
+ IDebugTarget getDebugTarget();
+ /**
+ * Returns the type of this element, encoded as an integer - one
+ * of the constants defined in this interface.
+ *
+ * @return debug element type constant
+ */
+ int getElementType();
+ /**
+ * Returns the launch this element originated from, or
+ * <code>null</code> if this element is not registered with
+ * a launch. This is a convenience method for
+ * <code>ILaunchManager.findLaunch(getDebugTarget())</code>.
+ *
+ * @return this element's launch, or <code>null</code> if not registered
+ */
+ ILaunch getLaunch();
+ /**
+ * Returns the name of this element. Name format is debug model
+ * specific, and should be specified by a debug model.
+ *
+ * @return this element's name
+ * @exception DebugException if unable to retrieve this element's name from
+ * the target
+ */
+ String getName() throws DebugException;
+ /**
+ * Returns the parent of this debug element, or <code>null</code>
+ * if this element has no parent.
+ *
+ * @return this element's parent, or <code>null</code> if none
+ */
+ IDebugElement getParent();
+ /**
+ * Returns the process associated with this debug element,
+ * or <code>null</code> if no process is associated with this element.
+ * This is a convenience method - it returns the process associated with
+ * this element's debug target, if any.
+ *
+ * @return this element's process, or <code>null</code> if none
+ */
+ IProcess getProcess();
+ /**
+ * Returns the source locator that can be used to locate source elements
+ * associated with this element or <code>null</code> if source lookup
+ * is not supported. This is a convenience method - it
+ * returns the source locator associated with this element's launch.
+ *
+ * @return this element's source locator, or <code>null</code> if none
+ */
+ ISourceLocator getSourceLocator();
+ /**
+ * Returns the stack frame containing this element,
+ * or <code>null</code> if this element is not contained in a stack frame.
+ *
+ * @return this element's stack frame, or <code>null</code> if none
+ */
+ IStackFrame getStackFrame();
+ /**
+ * Returns the thread containing this element,
+ * or <code>null</code> if this element is not contained in a thread.
+ *
+ * @return this element's thread, or <code>null</code> if none
+ */
+ IThread getThread();
+ /**
+ * Returns whether this element has children.
+ *
+ * @return whether this element has children
+ * @exception DebugException if unable to determine if this element has children
+ */
+ boolean hasChildren() throws DebugException;
+ /**
+ * Returns the unique identifier of the plug-in
+ * this debug element originated from.
+ *
+ * @return plug-in identifier
+ */
+ String getModelIdentifier();
+}
+
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugTarget.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugTarget.java
new file mode 100644
index 000000000..3d410b5a1
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDebugTarget.java
@@ -0,0 +1,52 @@
+package org.eclipse.debug.core.model;
+
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import java.util.List;
+
+/**
+ * A debug target is a debuggable execution context. For example, a debug target
+ * may represent a debuggable process or a virtual machine. A debug target is the root
+ * of the debug element hierarchy. A debug target has element type <code>DEBUG_TARGET</code>,
+ * children of type <code>THREAD</code>, and no parent. Minimally, a debug target supports
+ * the following capabilities:
+ * <ul>
+ * <li>terminate
+ * <li>suspend/resume
+ * <li>breakpoints
+ * <li>diconnect
+ * </ul>
+ * <p>
+ * Generally, launching a debug session results in the creation of a
+ * debug target. Launching is a client responsibility, as is debug target
+ * creation.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see ITerminate
+ * @see ISuspendResume
+ * @see IBreakpointSupport
+ * @see IDisconnect
+ * @see org.eclipse.debug.core.ILaunch
+ */
+public interface IDebugTarget extends IDebugElement, ITerminate, ISuspendResume, IBreakpointSupport, IDisconnect {
+ /**
+ * Returns the system process associated with this debug target
+ * or <code>null</code> if no system process is associated with
+ * this debug target.
+ */
+ IProcess getProcess();
+}
+
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDisconnect.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDisconnect.java
new file mode 100644
index 000000000..8c08860c6
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IDisconnect.java
@@ -0,0 +1,51 @@
+package org.eclipse.debug.core.model;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugException;
+
+/**
+ * Provides the ability to end a debug session with a target program
+ * and allow the target to continue running.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see IDebugTarget
+ */
+public interface IDisconnect {
+ /**
+ * Returns whether this element can currently disconnect.
+ *
+ * @return whether this element can currently disconnect
+ */
+ boolean canDisconnect();
+ /**
+ * Disconnects this element from its target. Generally, disconnecting
+ * ends a debug session with a debug target, but allows the target
+ * program to continue running.
+ *
+ * @exception DebugException on failure. Reasons include:<ul>
+ * <li>TARGET_REQUEST_FAILED - The request failed in the target
+ * <li>NOT_SUPPORTED - The capability is not supported by the target
+ * </ul>
+ */
+ public void disconnect() throws DebugException;
+ /**
+ * Returns whether this element is disconnected.
+ *
+ * @return whether this element is disconnected
+ */
+ public boolean isDisconnected();
+}
+
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILauncherDelegate.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILauncherDelegate.java
new file mode 100644
index 000000000..1cb59e7d8
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ILauncherDelegate.java
@@ -0,0 +1,109 @@
+package org.eclipse.debug.core.model;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.ILauncher;
+
+/**
+ * A launcher delegate is an implementation of the
+ * <code>org.eclipse.debug.core.launchers</code> extension point. The
+ * debug plug-in creates a proxy to each launcher extension, and
+ * lazily instantiates an extension when required. A launch delegate
+ * starts a debug session with a specific debug model, and/or
+ * launches one or more system processes, registering the result
+ * with the launch manager.
+ * <p>
+ * A launcher extension is defined in <code>plugin.xml</code>.
+ * Following is an example definition of a launcher extension.
+ * <pre>
+ * &lt;extension point="org.eclipse.debug.core.launchers"&gt;
+ * &lt;launcher
+ * id="com.example.ExampleIdentifier"
+ * class="com.example.ExmapleLauncher"
+ * modes="run, debug"
+ * label="Example Launcher"
+ * wizard="com.example.ExampleLaunchWizard"
+ * layout="com.example.JavaLayout"&gt;
+ * &lt;/launcher&gt;
+ * &lt;/extension&gt;
+ * </pre>
+ * The attributes are specified as follows:
+ * <ul>
+ * <li><code>id</code> specifies a unique identifier for this launcher.</li>
+ * <li><code>class</code> specifies the fully qualified name of the java class
+ * that implements this interface.</li>
+ * <li><code>modes</code> specifies a comma separated list of the modes this
+ * launcher supports - <code>"run"</code> and/or <code>"debug</code>.</li>
+ * <li><code>label</code> specifies a human readable label for this launcher
+ * extension.</li>
+ * <li><code>wizard</code> specifies the fully qualified name of the java class
+ * that implements <code>org.eclipse.debug.ui.ILaunchWizard</code>. The debug UI
+ * may invoke the wizard to perform a launch, or this launcher extension
+ * may present the wizard when asked to launch.</li>
+ * <li></code>layout</code> specifies the identifier of a layout that should be
+ * used to present the resulting launch.</li>
+ * </ul>
+ * </p>
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see org.eclipse.debug.core.ILaunch
+ * @see org.eclipse.debug.core.Launch
+ * @see org.eclipse.debug.core.ILaunchManager
+ * @see org.eclipse.debug.core.ILauncher
+ */
+public interface ILauncherDelegate {
+ /**
+ * Notifies this launcher delegate to launch in the given mode,
+ * register the resulting launch with the launch manager.
+ * Returns <code>true</code> if successful, otherwise <code>false</code>.
+ * This typically results in the creation of one or more processes and/or
+ * a debug target. The collection of elements provides context for
+ * launch. The determination of which or how many objects to launch
+ * is launcher dependent. This method blocks until the launch is
+ * complete. The given launcher is the owner of this delegate.
+ * <p>
+ * For example, when the debug UI invokes a launcher, the
+ * collection of elements passed in represent the selected elements
+ * in the UI, and the mode specified will be run or debug (depending on
+ * which launch button was pressed). A launcher will generally examine the
+ * element collection to determine what to launch. For example, if the
+ * collection contains one launchable program, or one runnable program
+ * can be inferred from the collection, the launcher will launch
+ * that program. If the collection contains more than one runnable
+ * program, or more than one runnable program can be inferred from the
+ * collection, the launcher may ask the user to select a program to launch.
+ * </p>
+ * <p>
+ * Launching the program itself usually requires running an external
+ * program specific to a debug architecture/debug model, and wrapping the
+ * result in a debug target or process that can be registered in a launch object.
+ * </p>
+ *
+ * @param elements an array of objects providing a context for the launch
+ * @param mode run or debug (as defined by <code>ILaunchManager.RUN_MODE</code>,
+ * <code>ILaunchManager.DEBUG_MODE</code>)
+ * @param launcher the proxy to this lazily instantiated extension which needs
+ * to be supplied in the resulting launch object
+ * @return whether the launch succeeded
+ *
+ * @see org.eclipse.debug.core.ILaunch
+ * @see org.eclipse.debug.core.Launch
+ * @see IDebugTarget
+ * @see IProcess
+ * @see org.eclipse.debug.core.ILaunchManager#registerLaunch
+ */
+ boolean launch(Object[] elements, String mode, ILauncher launcher);
+}
+
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IProcess.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IProcess.java
new file mode 100644
index 000000000..4fd4c79f0
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IProcess.java
@@ -0,0 +1,75 @@
+package org.eclipse.debug.core.model;
+
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * A process represents a program running in normal (non-debug) mode.
+ * Processes support setting and getting of client defined attributes.
+ * This way, clients can annotate a process with any extra information
+ * important to them. For example, classpath annotations, or command
+ * line arguments used to launch the process may be important to a client.
+ * <p>
+ * Clients may implement this interface, however, the debug plug-in
+ * provides an implementation of this interface for a
+ * <code>java.lang.Process</code>.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see org.eclipse.debug.core.DebugPlugin#newProcess(Process, String)
+ */
+public interface IProcess extends IAdaptable, ITerminate {
+
+ /**
+ * Returns a human-readable label for this process.
+ *
+ * @return a label
+ */
+ String getLabel();
+ /**
+ * Returns the <code>ILaunch</code> this element originated from, or
+ * <code>null</code> if this element has not yet been registered with
+ * an <code>ILaunch</code>. This is a convenience method for
+ * <code>ILaunchManager.findLaunch(IProcess)</code>.
+ *
+ * @return the launch this process is contained in
+ */
+ ILaunch getLaunch();
+ /**
+ * Returns a proxy to the standard input, output, and error streams
+ * for this process, or <code>null</code> if not supported.
+ *
+ * @return a streams proxy, or <code>null</code> if not supported
+ */
+ IStreamsProxy getStreamsProxy();
+
+ /**
+ * Sets the value of a client defined attribute.
+ *
+ * @param key the attribute key
+ * @param value the attribute value
+ */
+ void setAttribute(String key, String value);
+
+ /**
+ * Returns the value of a client defined attribute.
+ *
+ * @param key the attribute key
+ * @return value the attribute value, or <code>null</code> if undefined
+ */
+ String getAttribute(String key);
+
+}
+
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISourceLocator.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISourceLocator.java
new file mode 100644
index 000000000..ec5f7de14
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISourceLocator.java
@@ -0,0 +1,68 @@
+package org.eclipse.debug.core.model;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.model.IStackFrame;
+
+/**
+ * A source locator locates source elements for stack frames. Each
+ * debug session launch (optionally) specifies a source locator which is
+ * used to locate source for that debug session. If a launch does not
+ * provide a source locator, source cannot not be displayed.
+ * Abstraction of source lookup allows clients to hide implementation
+ * details of source location and representation.
+ * <p>
+ * Generally, an implementor of a debug model will also implement launchers
+ * and source locators that work together as a whole. That is, the implementation
+ * if a source locator will have knowledge of how to locate a source element
+ * for a stack frame. For example, a Java stack frame could define API which
+ * specifies a source file name. A Java source locator would use this information
+ * to locate the associated file in the workspace.
+ * </p>
+ * <p>
+ * Source is displayed by the debug UI plug-in. The debug UI uses a source locator
+ * to resolve an object representing the source for a stack frame, and then uses
+ * a debug model presentation to determine the editor and editor input to use to
+ * display the actual source in an editor.
+ * </p>
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see org.eclipse.debug.core.ILaunch
+ * @see IStackFrame
+ * @see org.eclipse.debug.ui.IDebugModelPresentation
+ */
+public interface ISourceLocator {
+
+ /**
+ * Returns a source element that corresponds to the given stack frame, or
+ * <code>null</code> if a source element could not be located. The object returned
+ * by this method will be used by the debug UI plug-in to display source.
+ * The debug UI uses the debug model presentation associated
+ * with the given stack frame's debug model to translate a source object into an
+ * {editor input, editor id} pair in which to display source.
+ * <p>
+ * For example, a java source locator could return an object representing a
+ * compilation unit or class file. The java debug model presentation would
+ * then be responsible for providing an editor input and editor id for each
+ * compilation unit and class file such that the debug UI could display source.
+ * </p>
+ *
+ * @param stackFrame the stack frame for which to locate source
+ * @return an object representing a source element.
+ */
+ Object getSourceElement(IStackFrame stackFrame);
+
+}
+
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStackFrame.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStackFrame.java
new file mode 100644
index 000000000..cc67dc053
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStackFrame.java
@@ -0,0 +1,60 @@
+package org.eclipse.debug.core.model;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugException;
+
+/**
+ * A stack frame represents a stack frame in a suspended thread. A
+ * stack frame has element type <code>STACK_FRAME</code>, and a parent
+ * of type <code>THREAD</code>. The children of a stack frame are of
+ * type <code>VARIABLE</code>, and represent the visible variables in
+ * the stack frame. Minimally, a stack frame supports
+ * the following capabilities:
+ * <ul>
+ * <li>suspend/resume (convenience to resume this stack frame's thread)
+ * <li>stepping
+ * </ul>
+ * <p>
+ * An implementation may choose to re-use or discard
+ * stack frames on iterative thread suspensions. Clients
+ * cannot assume that stack frames are identical or equal across
+ * iterative thread suspensions and must check for equality on iterative
+ * suspensions if they wish to re-use the objects.
+ * </p>
+ * <p>
+ * An implementation that preserves equality
+ * across iterative suspensions may display more desirable behavior in
+ * some clients. For example, if stack frames are preserved
+ * while stepping, a UI client would be able to update the UI incrementally,
+ * rather than collapse and redraw the entire list.
+ * </p>
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see ISuspendResume
+ * @see IStep
+ */
+public interface IStackFrame extends IDebugElement, IStep, ISuspendResume {
+ /**
+ * Returns the line number of the instruction pointer in
+ * this stack frame that corresponds to a line in an associated source
+ * element, or <code>-1</code> if line number information
+ * is unavailable.
+ *
+ * @return line number of instruction pointer in this stack frame
+ * @exception DebugException if unable to retrieve this stack frame's line number
+ * from the target
+ */
+ int getLineNumber() throws DebugException;
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStep.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStep.java
new file mode 100644
index 000000000..4a31a6da2
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStep.java
@@ -0,0 +1,91 @@
+package org.eclipse.debug.core.model;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugException;
+
+/**
+ * Provides the ability to step into, over, and return
+ * from the current statement in a thread.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public interface IStep {
+ /**
+ * Returns whether this element can currently perform a step into.
+ *
+ * @return whether this element can currently perform a step into
+ */
+ boolean canStepInto();
+ /**
+ * Returns whether this element can currently perform a step over.
+ *
+ * @return whether this element can currently perform a step over
+ */
+ boolean canStepOver();
+ /**
+ * Returns whether this element can currently perform a step return.
+ *
+ * @return whether this element can currently perform a step return
+ */
+ boolean canStepReturn();
+ /**
+ * Returns whether this element is currently stepping.
+ * <p>
+ * For example, a thread is considered to be stepping
+ * after the <code>stepOver</code> call until the step over is completed,
+ * a breakpoint is reached, an exception is thrown, or the thread or is
+ * terminated.
+ * </p>
+ *
+ * @return whether this element is currently stepping
+ */
+ public boolean isStepping();
+ /**
+ * Steps into the current statement, generating <code>RESUME</code>
+ * and <code>SUSPEND</code> events for this thread. Can only be called
+ * when this thread is suspended. Implementations may choose to implement
+ * stepping as blocking or non-blocking.
+ *
+ * @exception DebugException on failure. Reasons include:<ul>
+ * <li>TARGET_REQUEST_FAILED - The request failed in the target</li>
+ * <li>NOT_SUPPORTED - The capability is not supported by the target</li>
+ * </ul>
+ */
+ void stepInto() throws DebugException;
+ /**
+ * Steps over the current statement, generating <code>RESUME</code>
+ * and <code>SUSPEND</code> events for this thread. Can only be called
+ * when this thread is suspended. Implementations may choose to implement
+ * stepping as blocking or non-blocking.
+ *
+ * @exception DebugException on failure. Reasons include:<ul>
+ * <li>TARGET_REQUEST_FAILED - The request failed in the target</li>
+ * <li>NOT_SUPPORTED - The capability is not supported by the target</li>
+ * </ul>
+ */
+ void stepOver() throws DebugException;
+ /**
+ * Steps to the next return statement in the current scope,
+ * generating <code>RESUME</code> and <code>SUSPEND</code> events for
+ * this thread. Can only be called when this thread is suspended.
+ * Implementations may choose to implement stepping as blocking or non-blocking.
+ *
+ * @exception DebugException on failure. Reasons include:<ul>
+ * <li>TARGET_REQUEST_FAILED - The request failed in the target</li>
+ * <li>NOT_SUPPORTED - The capability is not supported by the target</li>
+ * </ul>
+ */
+ void stepReturn() throws DebugException;
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java
new file mode 100644
index 000000000..a74b8636e
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java
@@ -0,0 +1,49 @@
+package org.eclipse.debug.core.model;
+import org.eclipse.debug.core.IStreamListener;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+/**
+ * A stream monitor manages the contents of a stream a process
+ * is writing to, and notifies registered listeners of changes in
+ * the stream.
+ * <p>
+ * Clients may implement this interface. Generally, a client that
+ * provides an implementation of the <code>IStreamsProxy</code>
+ * interface must also provide an implementation of this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see IStreamsProxy
+ */
+public interface IStreamMonitor {
+ /**
+ * Adds the given listener to the registered listeners.
+ * Has no effect if an identical listener is already registered.
+ *
+ * @param the listener to add
+ */
+ public void addListener(IStreamListener listener);
+ /**
+ * Returns the current contents of the stream. An empty
+ * String is returned if the stream is empty.
+ *
+ * @return the stream contents as a <code>String</code>
+ */
+ public String getContents();
+ /**
+ * Removes the given listener from the registered listeners.
+ * Has no effect if the listener is not already registered.
+ *
+ * @param the listener to remove
+ */
+ public void removeListener(IStreamListener listener);
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java
new file mode 100644
index 000000000..fb87118ee
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java
@@ -0,0 +1,58 @@
+package org.eclipse.debug.core.model;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import java.io.IOException;
+
+/**
+ * A streams proxy acts as proxy between the streams of an
+ * process and interested clients. This abstraction allows
+ * implementations of <code>IProcess</code> to handle I/O related
+ * to the standard input, output, and error streams associated
+ * with a process.
+ * <p>
+ * Clients implementing the <code>IProcess</code> interface must also
+ * provide an implementation of this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see IProcess
+ * @see org.eclipse.debug.core.DebugPlugin#newProcess(Process, String)
+ */
+public interface IStreamsProxy {
+ /**
+ * Returns a monitor for the error stream of this proxy's process,
+ * or <code>null</code> if not supported.
+ * The monitor is connected to the error stream of the
+ * associated process.
+ *
+ * @return an input stream monitor, or <code>null</code> if none
+ */
+ public IStreamMonitor getErrorStreamMonitor();
+ /**
+ * Returns a monitor for the output stream of this proxy's process,
+ * or <code>null</code> if not supported.
+ * The monitor is connected to the output stream of the
+ * associated process.
+ *
+ * @return an input stream monitor, or <code>null</code> if none
+ */
+ public IStreamMonitor getOutputStreamMonitor();
+ /**
+ * Writes the given text to the output stream connected to the
+ * standard input stream of a this proxy's process.
+ *
+ * @exception IOException when an error occurs writing to the
+ * underlying <code>OutputStream</code>.
+ *
+ */
+ public void write(String input) throws IOException;
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISuspendResume.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISuspendResume.java
new file mode 100644
index 000000000..9aea82aee
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ISuspendResume.java
@@ -0,0 +1,64 @@
+package org.eclipse.debug.core.model;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugException;
+
+/**
+ * Provides the ability to suspend and resume a thread
+ * or debug target.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public interface ISuspendResume {
+ /**
+ * Returns whether this element can currently be resumed.
+ *
+ * @return whether this element can currently be resumed
+ */
+ public boolean canResume();
+ /**
+ * Returns whether this element can currently be suspended.
+ *
+ * @return whether this element can currently be suspended
+ */
+ public boolean canSuspend();
+ /**
+ * Returns whether this element is currently suspened.
+ *
+ * @return whether this element is currently suspened
+ */
+ public boolean isSuspended();
+ /**
+ * Causes this element to resume its execution. Has no effect
+ * on an element that is not suspended. This call is non-blocking.
+ *
+ * @exception DebugException on failure. Reasons include:<ul>
+ * <li>TARGET_REQUEST_FAILED - The request failed in the target
+ * <li>NOT_SUPPORTED - The capability is not supported by the target
+ * </ul>
+ */
+ public void resume() throws DebugException;
+ /**
+ * Causes this element to suspend its execution.
+ * Has no effect on an already suspened element.
+ * Implementations may be blocking or non-blocking.
+ *
+ * @exception DebugException on failure. Reasons include:<ul>
+ * <li>TARGET_REQUEST_FAILED - The request failed in the target
+ * <li>NOT_SUPPORTED - The capability is not supported by the target
+ * </ul>
+ */
+ public void suspend() throws DebugException;
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ITerminate.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ITerminate.java
new file mode 100644
index 000000000..6c25dd40a
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/ITerminate.java
@@ -0,0 +1,47 @@
+package org.eclipse.debug.core.model;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugException;
+
+/**
+ * Provides the ability to terminate an execution
+ * context - for example, a thread, debug target or process.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public interface ITerminate {
+ /**
+ * Returns whether this element can be terminated.
+ *
+ * @return whether this element can be terminated
+ */
+ boolean canTerminate();
+ /**
+ * Returns whether this element is terminated.
+ *
+ * @return whether this element is terminated
+ */
+ public boolean isTerminated();
+ /**
+ * Causes this element to terminate. Implementations may be
+ * blocking or non-blocking.
+ *
+ * @exception DebugException on failure. Reasons include:<ul>
+ * <li>TARGET_REQUEST_FAILED - The request failed in the target
+ * <li>NOT_SUPPORTED - The capability is not supported by the target
+ * </ul>
+ */
+ public void terminate() throws DebugException;
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IThread.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IThread.java
new file mode 100644
index 000000000..200b7c10c
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IThread.java
@@ -0,0 +1,57 @@
+package org.eclipse.debug.core.model;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugException;
+
+/**
+ * A thread represents a thread of execution in a debug target. A
+ * thread has element type <code>THREAD</code>, and a parent
+ * of type <code>DEBUG_TARGET</code>. The children of a thread are of
+ * type <code>STACK_FRAME</code>. A thread only has children when
+ * suspended, and children are returned in top-down order.
+ * Minimally, a thread supports the following capabilities:
+ * <ul>
+ * <li>suspend/resume
+ * <li>stepping
+ * <li>termiante
+ * </ul>
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see ISuspendResume
+ * @see IStep
+ * @see ITerminate
+ * @see IStackFrame
+ */
+
+public interface IThread extends IDebugElement, ISuspendResume, IStep, ITerminate {
+ /**
+ * Returns the priority of this thread. The meaning of this
+ * number is operating-system dependent.
+ *
+ * @return thread priority
+ * @exception DebugException if unable to retrieve this thread's priority from
+ * the target
+ */
+ int getPriority() throws DebugException;
+ /**
+ * Returns the top stack frame or <code>null</code> if there is
+ * currently no top stack frame.
+ *
+ * @return the top stack frame, or <code>null</code> if none
+ * @exception DebugException if unable to retrieve this thread's top stack frame
+ * from the target
+ */
+ IStackFrame getTopStackFrame() throws DebugException;
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValue.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValue.java
new file mode 100644
index 000000000..381a33834
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValue.java
@@ -0,0 +1,100 @@
+package org.eclipse.debug.core.model;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugException;
+
+/**
+ * A value represents the value of a variable.
+ * A value does not have a parent - instead it has an associated variable.
+ * A value representing a complex data structure has
+ * children of type <code>VARIABLE</code>.
+ * <p>
+ * An implementation may choose to re-use or discard
+ * values on iterative thread suspensions. Clients
+ * cannot assume that values are identical or equal across
+ * iterative thread suspensions and must check for equality on iterative
+ * suspensions if they wish to re-use the objects.
+ * </p>
+ * <p>
+ * An implementation that preserves equality
+ * across iterative suspensions may display more desirable behavior in
+ * some clients. For example, if variables are preserved
+ * while stepping, a UI client would be able to update the UI incrementally,
+ * rather than collapse and redraw the entire list or tree.
+ * </p>
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see IVariable
+ */
+
+
+public interface IValue extends IDebugElement {
+
+ /**
+ * Returns a description of the type of data this value contains
+ * or references.
+ *
+ * @return reference type
+ * @exception DebugException if unable to retrieve this value's reference type
+ * name from the target
+ */
+ String getReferenceTypeName() throws DebugException;
+
+ /**
+ * Returns this value as a <code>String</code>.
+ *
+ * @return value
+ * @exception DebugException if unable to retrieve this value's value description
+ * from the target
+ */
+ String getValueString() throws DebugException;
+
+ /**
+ * Returns the name of this element. Implementations of <code>IValue</code>
+ * return <code>null</code>. Values do not have names.
+ *
+ * @return <code>null</code>
+ */
+ String getName();
+
+ /**
+ * Returns the variable this value is bound to, or <code>null</code>
+ * if this value is not bound to a variable.
+ *
+ * @return a variable, or <code>null</code> if none
+ */
+ IVariable getVariable();
+
+ /**
+ * Returns the parent of this element. Implementations of <code>IVariable</code>
+ * return <code>null</code>. Values do not have parents.
+ *
+ * @return <code>null</code>
+ */
+ IDebugElement getParent();
+
+ /**
+ * Returns whether this value is currently allocated.
+ * <p>
+ * For example, if this value represents
+ * an object that has been garbage collected, <code>false</code> would
+ * be returned.
+ * </p>
+ * @return whether this value is currently allocated
+ * @exception DebugException if unable to determine if this value is currently
+ * allocated on the target
+ */
+ boolean isAllocated() throws DebugException;
+} \ No newline at end of file
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValueModification.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValueModification.java
new file mode 100644
index 000000000..dc8d0f5b2
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IValueModification.java
@@ -0,0 +1,55 @@
+package org.eclipse.debug.core.model;
+
+import org.eclipse.debug.core.DebugException;
+
+/**
+ * Provides the ability to modify the value of a variable in
+ * the target.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see IVariable
+ */
+public interface IValueModification {
+
+ /**
+ * Attempts to set the value of this variable to the
+ * value of the given expression.
+ *
+ * @param expression an expression to generate a new value
+ * @exception DebugException on failure. Reasons include:<ul>
+ * <li>TARGET_REQUEST_FAILED - The request failed in the target
+ * <li>NOT_SUPPORTED - The capability is not supported by the target
+ * </ul>
+ */
+ public void setValue(String expression) throws DebugException;
+
+ /**
+ * Returns whether this varaible supports value modification.
+ *
+ * @return whether this varaible supports value modification
+ */
+ public boolean supportsValueModification();
+
+ /**
+ * Returns whether the given expression is valid to be used in
+ * setting a new value for this variable.
+ *
+ * @param expression an expression to generate a new value
+ * @return whether the expression is acceptable
+ * @exception DebugException on failure. Reasons include:<ul>
+ * <li>TARGET_REQUEST_FAILED - The request failed in the target
+ * <li>NOT_SUPPORTED - The capability is not supported by the target
+ * </ul>
+ */
+ public boolean verifyValue(String expression) throws DebugException;
+
+}
+
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IVariable.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IVariable.java
new file mode 100644
index 000000000..7ab9313c4
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IVariable.java
@@ -0,0 +1,78 @@
+package org.eclipse.debug.core.model;
+
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugException;
+
+/**
+ * A variable represents a visible variable in a stack frame,
+ * or the child of a value. A variable has a type of <code>VARIABLE</code>.
+ * A variable's parent may be of type
+ * <code>STACK_FRAME</code> or <code>VALUE</code>.
+ * Each variable has a value which may in turn
+ * have children. A variable itself does not have children.
+ * A variable may support value modification.
+ * <p>
+ * An implementation may choose to re-use or discard
+ * variables on iterative thread suspensions. Clients
+ * cannot assume that variables are identical or equal across
+ * iterative thread suspensions and must check for equality on iterative
+ * suspensions if they wish to re-use the objects.
+ * </p>
+ * <p>
+ * An implementation that preserves equality
+ * across iterative suspensions may display more desirable behavior in
+ * some clients. For example, if variables are preserved
+ * while stepping, a UI client would be able to update the UI incrementally,
+ * rather than collapse and redraw the entire list or tree.
+ * </p>
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * @see IValue
+ * @see IStackFrame
+ * @see IValueModification
+ */
+public interface IVariable extends IDebugElement, IValueModification {
+ /**
+ * Returns the children of this elemnet. Implementations of
+ * <code>IVariable</code> return an empty collection.
+ *
+ * @return an empty collection
+ * @see IDebugElement
+ * @exception DebugException if an unable to retrieve children from
+ * the target
+ */
+ IDebugElement[] getChildren() throws DebugException;
+
+ /**
+ * Returns the value of this variable.
+ *
+ * @return variable value
+ * @exception DebugException if unable to retrieve this variable's value
+ * from the target
+ */
+ IValue getValue() throws DebugException;
+
+ /**
+ * Returns a description of the type of data this variable is
+ * declared to reference. Note that the type of a variable
+ * and the type of its value are not always the same.
+ *
+ * @return declared type of variable
+ * @exception DebugException if unable to retrieve this variables reference type
+ * name from the target
+ */
+ String getReferenceTypeName() throws DebugException;
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/package.html b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/package.html
new file mode 100644
index 000000000..59c1b7ba2
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/package.html
@@ -0,0 +1,57 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
+<title>Eclipse Debug Tools</title>
+</head>
+
+<body bgcolor="#FFFFFF">
+
+<h3>The Debug Model</h3>
+
+<p><strong>Note:</strong> this package is part of an interim API that is still under
+development and expected to change significantly before reaching stability. It is being
+made available at this early stage to soloicit feedback from pioneering adopters on the
+understanding that any code that uses this API will almost certainly be broken
+(repeatedly) as the API evolves.</p>
+
+<p>A language independent &quot;debug model&quot; is represented by the set of interfaces
+defined in <font face="Courier">org.eclipse.debug.core.model</font>. A client implements a debug
+model by providing an implementation of these interfaces in a plug-in. (There is no
+explicit extension point that represents a debug model). Each debug architecture will have
+its own way of initiating a debug session. Generally, each debug model will provide one or
+more launchers capable of initiating a debug session. A &quot;launcher&quot; is an
+extension point defined by the debug plug-in. A launcher is responsible for starting a
+debug session, and registering the result with the debug plug-in. Launching is a client
+responsibility.</p>
+
+<p>The common elements defined by the debug plug-in are:
+
+<ul>
+ <li>Debug Target - a debug target represents a debuggable program - for example, a virtual
+ machine or a process.</li>
+ <li>Thread - a debug target may contain one or more threads</li>
+ <li>Stack Frame - a thread that is suspended may contain one or more stack frames</li>
+ <li>Variable - a stack frame may contain variables</li>
+ <li>Value - each variable has a value, and a value may contain more variables (to represent
+ complex data structures and objects)</li>
+ <li>Process - a program running in normal (non-debug) mode</li>
+</ul>
+
+<h4>Rendering &amp; Presentation</h4>
+
+<p>Debug model elements and breakpoints are displayed in the workbench. To support
+configurable and extensible presentation, the debug UI plug-in defines the <font
+face="Courier">debugModelPresentations</font> extension point. Extensions of this kind
+register for a specific debug model. It is intended that an implementation of a debug
+model will also provide an implementation of a debug model presentation. The presentation
+provides:
+
+<ul>
+ <li>an image for a debug element or breakpoint</li>
+ <li>a label for a debug element or breakpoint</li>
+ <li>an editor input that should be used to display the debug element or breakpoint</li>
+</ul>
+</body>
+</html>
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/package.html b/org.eclipse.debug.core/core/org/eclipse/debug/core/package.html
new file mode 100644
index 000000000..81476871a
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/package.html
@@ -0,0 +1,176 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
+<title>Eclipse Debug Tools</title>
+</head>
+
+<body bgcolor="#FFFFFF">
+
+<p>Provides support for launching programs and defines interfaces for a debug model to
+support an extensible set debug architectures.</p>
+
+<h2>Package Specification</h2>
+
+<p><strong>Note</strong>: this package is part of an interim API that is still under
+development and expected to change significantly before reaching stability. It is being
+made available at this early stage to soloicit feedback from pioneering adopters on the
+understanding that any code that uses this API will almost certainly be broken
+(repeatedly) as the API evolves.</p>
+
+<p>Eclipse Debug Tools provides classes and interfaces to support the launching,
+registration, and manipulation of debuggable and non-debuggable programs. An extensible
+set of debug architectures and languages are supported by the definition of a &quot;debug
+model&quot; - a set of interfaces representing common artifacts in debuggable programs.
+The debug plug-in itself does not provide any implementations of a debug model. It is
+intended that third parties providing an integrated set of development tools for a
+specific language will also implement a debug model for that language, using an underlying
+debug architecture of their choice. For example, Java Tooling provides an implementation
+of a debug model based on the standard Java Debug Interface (JDI).</p>
+
+<h4>The Debug Model</h4>
+
+<p>The &quot;debug model&quot; is represented by the set of interfaces defined in <font
+face="Courier">org.eclipse.debug.core.model</font>. A client implements a debug model by
+providing an implementation of these interfaces in a plug-in. (There is no explicit
+extension point that represents a debug model). Each debug architecture will have its own
+way of initiating a debug session. Generally, each debug model will provide one or more
+launchers capable of initiating a debug session. A &quot;launcher&quot; is an extension
+point defined by the debug plug-in. A launcher is responsible for starting a debug
+session, and registering the result with the debug plug-in. Launching is a client
+responsibility.</p>
+
+<p>The common elements defined by the debug plug-in are:
+
+<ul>
+ <li>Debug Target - a debug target represents a debuggable program - for example, a virtual
+ machine or a process.</li>
+ <li>Thread - a debug target may contain one or more threads</li>
+ <li>Stack Frame - a thread that is suspended may contain one or more stack frames</li>
+ <li>Variable - a stack frame may contain variables</li>
+ <li>Value - each variable has a value, and a value may contain more variables (to represent
+ complex data structures and objects)</li>
+</ul>
+
+<h5>Rendering &amp; Presentation</h5>
+
+<p>Debug model elements and breakpoints are displayed in the workbench. To support
+configurable and extensible presentation, the<font face="Courier"> debugModelPresentations</font>
+extension point is used. Extensions may be registered for a specific debug model. It is
+intended that an implementation of a debug model will also provide an implementation of a
+debug model presentation. The presentation provides:
+
+<ul>
+ <li>an image for a debug element or breakpoint</li>
+ <li>a label for a debug element or breakpoint</li>
+ <li>an editor input that should be used to display the debug element or breakpoint</li>
+</ul>
+
+<h4>Breakpoints</h4>
+
+<p>Breakpoints are used to suspend the execution of a program being debugged. There are
+many kinds of breakpoints - line breakpoints, conditional line breakpoints, hit count
+breakpoints, exception breakpoints, etc. The kinds of breakpoints supported by each debug
+architecture (for example, JDI), and the information required to create those breakpoints
+is dictated by each debug architecture. Thus, Eclipse Debug Tools supports an extensible
+set of breakpoint types.</p>
+
+<p>Eclipse Debug Tools provides a breakpoint manager that maintains the collection of all
+known breakpoints. Clients add and remove breakpoints via this manager. Breakpoints are
+represented by markers in the workspace, providing persistence and an extensible set of
+breakpoint attributes. Eclipse Debug Tools defines the root breakpoint marker and the
+common line breakpoint marker, as well as the attributes for these markers. Breakpoint
+creation is a client responsibility - that is, choosing which resource to associate a
+breakpoint with.</p>
+
+<p>The breakpoint definitions in plug-in <font face="Courier New">org.eclipse.debug.core</font>
+are as follows: </p>
+<font SIZE="2">
+
+<p><font face="Courier">&lt;extension id=&quot;breakpoint&quot;
+point=&quot;org.eclipse.core.resources.markers&quot;&gt;<br>
+&nbsp;&nbsp;&nbsp; &lt;super type=&quot;org.eclipse.core.resources.marker&quot;/&gt;<br>
+&nbsp;&nbsp;&nbsp; &lt;persisted value=&quot;true&quot;/&gt;</font></font><br>
+<font face="Courier" SIZE="2">&nbsp;&nbsp;&nbsp; &lt;attribute
+name=&quot;modelIdentifier&quot;/&gt;<br>
+&nbsp;&nbsp;&nbsp; &lt;attribute name=&quot;enabled&quot;/&gt;<br>
+&lt;/extension&gt;</font></p>
+
+<p><font face="Courier" SIZE="2">&lt;extension id=&quot;lineBreakpoint&quot;
+point=&quot;org.eclipse.core.resources.markers&quot;&gt;<br>
+&nbsp;&nbsp;&nbsp; &lt;super type=&quot;org.eclipse.debug.core.breakpoint&quot;/&gt;<br>
+&nbsp;&nbsp;&nbsp; &lt;super type=&quot;org.eclipse.core.resources.textmarker&quot;/&gt;<br>
+&nbsp;&nbsp;&nbsp; &lt;persisted value=&quot;true&quot;/&gt;<br>
+&lt;/extension&gt;</font></p>
+
+<h5>Breakpoint Creation</h5>
+
+<p>The breakpoint lifecycle begins with breakpoint creation. The location in which a
+breakpoint may be placed, and the attributes that its debug target requires to install the
+breakpoint is specific to each debug model. For this reason, breakpoint creation is a
+client responsibility. Generically, the breakpoint creation scenario involves the
+following steps:
+
+<ol>
+ <li>Creation of a (subtype of the) breakpoint marker. This requires that a marker be created
+ with all appropriate attributes. For convenience, the breakpoint manager has API for
+ configuring default values for required attributes on markers.</li>
+ <li>Registration of the breakpoint marker with the breakpoint manager. A breakpoint is not
+ considered active until it is registered with the breakpoint manager.</li>
+</ol>
+
+<p>Note that verifying the location of the breakpoint is valid is also a client
+responsibility.</p>
+
+<h5>Persistence</h5>
+
+<p>Breakpoints are persisted via the standard marker mechanism. Breakpoints defined with
+the <font face="Courier New">persisted</font> attribute as <font face="Courier New">false</font>
+will not be persisted. Breakpoints are restored at workspace startup time by the
+breakpoint manager - that is, all persisted markers which are a subtype of the root
+breakpoint marker are added to the breakpoint manager. To allow for selective persistence
+of breakpoints, the root breakpoint marker defines a &quot;persisted&quot; attribute. If
+this value is set to false, the breakpoint will not be persisted.</p>
+
+<h5>Change Notification</h5>
+
+<p>As breakpoint markers are modified (created, removed, and attribute values are
+changed), resource deltas are created by the platform. The breakpoint manager translates
+pertinent resource deltas into breakpoint change notifications (breakpoint
+added/removed/changed messages). Interested listeners may register with the breakpoint
+manager. The breakpoint manager only fires change notifications for registered
+breakpoints. This simplifies breakpoint processing for clients, as resource delta
+traversal and analysis is not required. Thus clients have two options - listening to
+resource deltas from the platform, or listening to change notification from the breakpoint
+manager. However, clients should be careful to note that breakpoints marker deltas should
+only be considered as breakpoint changes if a breakpoint is currently active (registered
+with the breakpoint manager).</p>
+
+<h5>Deletion</h5>
+
+<p>Removing a breakpoint from the breakpoint manager signals the end of the breakpoint
+lifecycle. A breakpoint may be removed with the method <font face="Courier">org.eclipse.debug.core.IBreakpointManager.removeBreakpoint(IMarker)</font>,
+or by deleting the underlying marker (in the later case, the breakpoint manager notices a
+breakpoint has been deleted, and automatically removes it).</p>
+
+<h5>Extensibility</h5>
+
+<p>Clients can define new kinds of breakpoints with the appropriate plug-in XML and
+subtyping any of the defined breakpoint markers. For example, a client may define an
+exception breakpoint as a subtype of the root breakpoint, or a client might define a
+conditional breakpoint as a subtype of the line breakpoint. The breakpoint manager does
+not define generic breakpoints of these types since the attributes required are debug
+model dependent.</p>
+
+<h5>Target Notification</h5>
+
+<p>Debug targets are notified of breakpoints via the <font face="Courier New">IBreakpointListener</font>
+mechanism. The breakpoint manager only notifies debug targets of breakpoints
+added/changed/removed, after a target has been created. Since breakpoints are often in
+existence before a debug target is launched, a debug target is responsible for querying
+the breakpoint manager for breakpoints in existence when it is created - see <font
+face="Courier">org.eclipse.debug.core.IBreakpointManager.getBreakpoints(String)</font>,
+which provides a list of active breakpoints for a specific debug model.</p>
+</body>
+</html>
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java
new file mode 100644
index 000000000..03114c808
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java
@@ -0,0 +1,487 @@
+package org.eclipse.debug.internal.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.debug.core.*;
+import org.eclipse.debug.core.model.IBreakpointSupport;
+import org.eclipse.debug.core.model.IDebugTarget;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Vector;
+
+/**
+ * The breakpoint manager manages all registered breakpoints
+ * for the debug plugin. It is instantiated by the debug plugin.
+ *
+ * @see IBreakpointManager
+ */
+public class BreakpointManager implements IBreakpointManager, IResourceChangeListener, ILaunchListener {
+
+ private final static String PREFIX= "breakpoint_manager.";
+ private final static String ERROR= PREFIX + "error.";
+ private final static String OLD_MARKER= ERROR + "old_marker";
+ private final static String ADAPTER= ERROR + "adapter";
+ private final static String LABEL_PROPERTY= ERROR + "label_property";
+ private final static String EXTENSION= ERROR + "extension";
+ private final static String ASSOCIATED_RESOURCE= ERROR + "associated_resource";
+ private final static String REQUIRED_ATTRIBUTES= ERROR + "required_attributes";
+ private final static String LINE_NUMBER= ERROR + "line_number";
+ private final static String CREATION_FAILED= ERROR + "creation_failed";
+ private final static String UNSUPPORTED_EXTENSION= ERROR + "unsupported_extension";
+ private final static String INSTALLATION_FAILED= ERROR + "installation_failed";
+ private final static String REMOVE_FAILED= ERROR + "remove_failed";
+ private final static String ENABLE= ERROR + "enable";
+ private final static String HIT_COUNT= ERROR + "hit_count";
+ private final static String TARGET= ERROR + "target";
+
+ /**
+ * Constants for breakpoint add/remove/change updates
+ */
+ private final static int ADDED = 0;
+ private final static int REMOVED = 1;
+ private final static int CHANGED = 2;
+
+ /**
+ * A collection of breakpoint registered with this manager.
+ *
+ */
+ protected Vector fBreakpoints;
+
+ /**
+ * Collection of breakpoint listeners.
+ */
+ protected ListenerList fBreakpointListeners= new ListenerList(6);
+
+ /**
+ * Singleton resource delta visitor
+ */
+ protected static BreakpointManagerVisitor fgVisitor;
+
+ /**
+ * The set of attributes used to configure a breakpoint
+ */
+ protected static final String[] fgBreakpointAttributes= new String[]{IDebugConstants.MODEL_IDENTIFIER, IDebugConstants.ENABLED};
+
+ /**
+ * The set of attributes used to configure a line breakpoint
+ */
+ protected static final String[] fgLineBreakpointAttributes= new String[]{IDebugConstants.MODEL_IDENTIFIER, IDebugConstants.ENABLED, IMarker.LINE_NUMBER, IMarker.CHAR_START, IMarker.CHAR_END};
+
+ /**
+ * Constructs a new breakpoint manager.
+ */
+ public BreakpointManager() {
+ fBreakpoints= new Vector(15);
+ }
+
+ /**
+ * Registers this manager as a resource change listener and launch
+ * listener. Loads the list of breakpoints from the breakpoint markers in the
+ * workspace. This method should only be called on initial startup of
+ * the debug plugin.
+ *
+ * @exception CoreException if an error occurrs retreiving breakpoint markers
+ */
+ public void startup() throws CoreException {
+ getWorkspace().addResourceChangeListener(this);
+ getLaunchManager().addLaunchListener(this);
+ IMarker[] breakpoints= null;
+ IWorkspaceRoot root= getWorkspace().getRoot();
+ breakpoints= root.findMarkers(IDebugConstants.BREAKPOINT_MARKER, true, IResource.DEPTH_INFINITE);
+
+ for (int i = 0; i < breakpoints.length; i++) {
+ IMarker marker= breakpoints[i];
+ try {
+ addBreakpoint(marker);
+ } catch (DebugException e) {
+ logError(e);
+ }
+ }
+ }
+
+ /**
+ * Removes this manager as a resource change listener
+ */
+ public void shutdown() {
+ getWorkspace().removeResourceChangeListener(this);
+ getLaunchManager().removeLaunchListener(this);
+ }
+
+
+ /**
+ * Convenience method to get the launch manager.
+ */
+ protected ILaunchManager getLaunchManager() {
+ return DebugPlugin.getDefault().getLaunchManager();
+ }
+
+ /**
+ * Convenience method to get the workspace
+ */
+ protected IWorkspace getWorkspace() {
+ return ResourcesPlugin.getWorkspace();
+ }
+
+ /**
+ * @see IBreakpointManager
+ */
+ public IMarker[] getBreakpoints() {
+ IMarker[] temp= new IMarker[fBreakpoints.size()];
+ fBreakpoints.copyInto(temp);
+ return temp;
+ }
+
+ /**
+ * @see IBreakpointManager
+ */
+ public IMarker[] getBreakpoints(String modelIdentifier) {
+ Vector temp= new Vector(fBreakpoints.size());
+ if (!fBreakpoints.isEmpty()) {
+ Iterator bps= fBreakpoints.iterator();
+ while (bps.hasNext()) {
+ IMarker bp= (IMarker) bps.next();
+ String id= getModelIdentifier(bp);
+ if (id != null && id.equals(modelIdentifier)) {
+ temp.add(bp);
+ }
+ }
+ }
+ IMarker[] m= new IMarker[temp.size()];
+ temp.copyInto(m);
+ return m;
+ }
+
+ /**
+ * @see IBreakpointManager
+ */
+ public int getLineNumber(IMarker breakpoint) {
+ return breakpoint.getAttribute(IMarker.LINE_NUMBER, -1);
+ }
+
+ /**
+ * @see IBreakpointManager
+ */
+ public int getCharStart(IMarker breakpoint) {
+ return breakpoint.getAttribute(IMarker.CHAR_START, -1);
+ }
+
+ /**
+ * @see IBreakpointManager
+ */
+ public int getCharEnd(IMarker breakpoint) {
+ return breakpoint.getAttribute(IMarker.CHAR_END, -1);
+ }
+
+ /**
+ * Returns the model identifier for the given breakpoint.
+ */
+ public String getModelIdentifier(IMarker breakpoint) {
+ return (String) breakpoint.getAttribute(IDebugConstants.MODEL_IDENTIFIER, (String)null);
+ }
+
+ /**
+ * @see IBreakpointManager
+ */
+ public boolean isEnabled(IMarker marker) {
+ return marker.getAttribute(IDebugConstants.ENABLED, true);
+ }
+
+ /**
+ * @see IBreakpointManager
+ */
+ public boolean isRegistered(IMarker marker) {
+ return fBreakpoints.contains(marker);
+ }
+
+ /**
+ * @see IBreakpointManager
+ */
+ public void removeBreakpoint(IMarker breakpoint, boolean delete) throws CoreException {
+ if (fBreakpoints.remove(breakpoint)) {
+ fireUpdate(breakpoint, null, REMOVED);
+ if (delete) {
+ breakpoint.delete();
+ }
+ }
+ }
+
+ /**
+ * @see IBreakpointManager
+ */
+ public void addBreakpoint(IMarker breakpoint) throws DebugException {
+ if (!fBreakpoints.contains(breakpoint)) {
+ verifyBreakpoint(breakpoint);
+ fBreakpoints.add(breakpoint);
+ fireUpdate(breakpoint, null, ADDED);
+ }
+ }
+
+ /**
+ * Verifies that the breakpoint marker has the minimal required attributes,
+ * and throws a debug exception if not.
+ */
+ protected void verifyBreakpoint(IMarker breakpoint) throws DebugException {
+ try {
+ String id= (String) breakpoint.getAttribute(IDebugConstants.MODEL_IDENTIFIER);
+ if (id == null) {
+ throw new DebugException(new Status(IStatus.ERROR, DebugPlugin.getDefault().getDescriptor().getUniqueIdentifier(),
+ IDebugStatusConstants.CONFIGURATION_INVALID, DebugCoreUtils.getResourceString(REQUIRED_ATTRIBUTES), null));
+ }
+ } catch (CoreException e) {
+ throw new DebugException(e.getStatus());
+ }
+ }
+
+ /**
+ * A resource has changed. Traverses the delta for breakpoint changes.
+ */
+ public void resourceChanged(IResourceChangeEvent event) {
+ IResourceDelta delta= event.getDelta();
+ if (delta != null) {
+ try {
+ if (fgVisitor == null) {
+ fgVisitor= new BreakpointManagerVisitor();
+ }
+ delta.accept(fgVisitor);
+ } catch (CoreException ce) {
+ logError(ce);
+ }
+ }
+ }
+
+ /**
+ * A project has been opened or closed. Updates the breakpoints for
+ * that project
+ */
+ protected void handleProjectResourceOpenStateChange(IResource project) {
+ if (!project.isAccessible()) {
+ //closed
+ Enumeration breakpoints= fBreakpoints.elements();
+ while (breakpoints.hasMoreElements()) {
+ IMarker breakpoint= (IMarker) breakpoints.nextElement();
+ IResource breakpointResource= breakpoint.getResource();
+ if (project.getFullPath().isPrefixOf(breakpointResource.getFullPath())) {
+ try {
+ removeBreakpoint(breakpoint, false);
+ } catch (CoreException e) {
+ logError(e);
+ }
+ }
+ }
+ return;
+ } else {
+ IMarker[] breakpoints= null;
+ try {
+ breakpoints= project.findMarkers(IDebugConstants.BREAKPOINT_MARKER, true, IResource.DEPTH_INFINITE);
+ } catch (CoreException e) {
+ logError(e);
+ return;
+ }
+ if (breakpoints != null) {
+ for (int i= 0; i < breakpoints.length; i++) {
+ try {
+ addBreakpoint(breakpoints[i]);
+ } catch (DebugException e) {
+ logError(e);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @see IBreakpointManager.
+ */
+ public void setEnabled(IMarker marker, boolean enabled) throws CoreException {
+ marker.setAttribute(IDebugConstants.ENABLED, enabled);
+ }
+
+ /**
+ * Logs errors
+ */
+ protected void logError(Exception e) {
+ DebugCoreUtils.logError(e);
+ }
+
+ /**
+ * Visitor for handling resource deltas
+ */
+ class BreakpointManagerVisitor implements IResourceDeltaVisitor {
+ /**
+ * @see IResourceDeltaVisitor
+ */
+ public boolean visit(IResourceDelta delta) {
+ if (0 != (delta.getFlags() & IResourceDelta.OPEN)) {
+ handleProjectResourceOpenStateChange(delta.getResource());
+ return true;
+ }
+ IMarkerDelta[] markerDeltas= delta.getMarkerDeltas();
+ for (int i= 0; i < markerDeltas.length; i++) {
+ IMarkerDelta markerDelta= markerDeltas[i];
+ if (markerDelta.isSubtypeOf(IDebugConstants.BREAKPOINT_MARKER)) {
+ switch (markerDelta.getKind()) {
+ case IResourceDelta.ADDED :
+ handleAddBreakpoint(delta, markerDelta.getMarker(), markerDelta);
+ break;
+ case IResourceDelta.REMOVED :
+ handleRemoveBreakpoint(markerDelta.getMarker(), markerDelta);
+ break;
+ case IResourceDelta.CHANGED :
+ handleChangeBreakpoint(markerDelta.getMarker(), markerDelta);
+ break;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Wrapper for handling adds
+ */
+ protected void handleAddBreakpoint(IResourceDelta rDelta, final IMarker marker, IMarkerDelta mDelta) {
+ if (0 != (rDelta.getFlags() & IResourceDelta.MOVED_FROM)) {
+ // this breakpoint has actually been moved - removed from the Breakpoint manager and deleted
+ final IWorkspace workspace= getWorkspace();
+ final IWorkspaceRunnable wRunnable= new IWorkspaceRunnable() {
+ public void run(IProgressMonitor monitor) {
+ try {
+ marker.delete();
+ } catch (CoreException ce) {
+ logError(ce);
+ }
+ }
+ };
+ Runnable runnable= new Runnable() {
+ public void run() {
+ try {
+ workspace.run(wRunnable, null);
+ } catch (CoreException ce) {
+ logError(ce);
+ }
+ }
+ };
+ new Thread(runnable).start();
+ } else {
+ // do nothing - we do not add until explicitly added
+ }
+ }
+
+ /**
+ * Wrapper for handling removes
+ */
+ protected void handleRemoveBreakpoint(IMarker marker, IMarkerDelta delta) {
+ if (isRegistered(marker)) {
+ fBreakpoints.remove(marker);
+ fireUpdate(marker, delta, REMOVED);
+ }
+ }
+
+ /**
+ * Wrapper for handling changes
+ */
+ protected void handleChangeBreakpoint(IMarker marker, IMarkerDelta delta) {
+ if (isRegistered(marker)) {
+ fireUpdate(marker, delta, CHANGED);
+ }
+ }
+ }
+
+ /**
+ * @see IBreakpointManager
+ */
+ public void addBreakpointListener(IBreakpointListener listener) {
+ fBreakpointListeners.add(listener);
+ }
+
+ /**
+ * @see IBreakpointManager
+ */
+ public void removeBreakpointListener(IBreakpointListener listener) {
+ fBreakpointListeners.remove(listener);
+ }
+
+ /**
+ * Notifies listeners of the add/remove/change
+ */
+ protected void fireUpdate(IMarker marker, IMarkerDelta delta, int update) {
+ Object[] copiedListeners= fBreakpointListeners.getListeners();
+ for (int i= 0; i < copiedListeners.length; i++) {
+ IBreakpointListener listener = (IBreakpointListener)copiedListeners[i];
+ if (supportsBreakpoint(listener, marker)) {
+ switch (update) {
+ case ADDED:
+ listener.breakpointAdded(marker);
+ break;
+ case REMOVED:
+ listener.breakpointRemoved(marker, delta);
+ break;
+ case CHANGED:
+ listener.breakpointChanged(marker, delta);
+ break;
+ }
+
+ }
+ }
+ }
+
+ /**
+ * Returns whether the given listener supports breakpoints. If
+ * the listener is a debug target, we check if the specific
+ * breakpoint is supported by the target.
+ */
+ protected boolean supportsBreakpoint(IBreakpointListener listener, IMarker breakpoint) {
+ if (listener instanceof IBreakpointSupport) {
+ return ((IBreakpointSupport)listener).supportsBreakpoint(breakpoint);
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * @see IBreakpointManager
+ */
+ public void configureBreakpoint(IMarker breakpoint, String modelIdentifier, boolean enabled) throws CoreException {
+ breakpoint.setAttributes(fgBreakpointAttributes, new Object[]{modelIdentifier, new Boolean(enabled)});
+ }
+
+ /**
+ * @see IBreakpointManager
+ */
+ public void configureLineBreakpoint(IMarker breakpoint, String modelIdentifier, boolean enabled, int lineNumber, int charStart, int charEnd) throws CoreException {
+ Object[] values= new Object[]{modelIdentifier, new Boolean(enabled), new Integer(lineNumber), new Integer(charStart), new Integer(charEnd)};
+ breakpoint.setAttributes(fgLineBreakpointAttributes, values);
+ }
+
+ /**
+ * Adds any debug targets as listeners
+ *
+ * @see ILaunchListener
+ */
+ public void launchRegistered(ILaunch launch) {
+ IDebugTarget dt= launch.getDebugTarget();
+ if (dt != null) {
+ addBreakpointListener(dt);
+ }
+ }
+
+ /**
+ * Removes the debug target associated with
+ * this launch as a breakpoint listener.
+ *
+ * @see ILaunchListener
+ */
+ public void launchDeregistered(ILaunch launch) {
+ IDebugTarget dt= launch.getDebugTarget();
+ if (dt != null) {
+ removeBreakpointListener(dt);
+ }
+ }
+}
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreResources.properties b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreResources.properties
new file mode 100644
index 000000000..9c9d00790
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreResources.properties
@@ -0,0 +1,55 @@
+##############################################################
+# Licensed Materials - Property of IBM,
+# WebSphere Studio Workbench
+# (c) Copyright IBM Corp 2001
+##############################################################
+
+##############################################################
+# BreakpointManager
+##############################################################
+breakpoint_manager.error.adapter=IDesktopElement adapter required to set a breakpoint.
+breakpoint_manager.error.label_property=Label property required to set a breakpoint.
+breakpoint_manager.error.extension=File extension required to set a breakpoint.
+breakpoint_manager.error.associated_resource=Breakpoint creator did not specify associated resource.
+breakpoint_manager.error.required_attributes= Breakpoint creator did not configure required attributes.
+breakpoint_manager.error.line_number=Breakpoint already exists at line number {0}.
+breakpoint_manager.error.creation_failed=Breakpoint creation failed.
+breakpoint_manager.error.unsupported_extension=Unsupported file extension {0}.
+breakpoint_manager.error.installation_failed=Breakpoint installation failed - attempt to re-install breakpoint.
+breakpoint_manager.error.remove_failed=Breakpoint remove failed.
+breakpoint_manager.error.enable=Attempt to enable breakpoint that does not exist.
+breakpoint_manager.error.hitcount=Attempt to set hit count on a breakpoint that does not exist.
+breakpoint_manager.error.target=Debug target breakpoint set failed.
+
+##############################################################
+# ExceptionManager
+##############################################################
+exception_manager.error.state=Illegal value for exception state.
+exception_manager.error.duplicate=Failed to create exception - it already exists.
+exception_manager.error.persisting=Error persisting exceptions.
+exception_manager.error.restoring=Error restoring exceptions.
+
+##############################################################
+# InputStreamMonitor
+##############################################################
+input_stream_monitor.label=Input Stream Monitor
+
+##############################################################
+# LaunchManager
+##############################################################
+launch_manager.error.termination=Unable to terminate launch.
+
+##############################################################
+# ProcessMonitor
+##############################################################
+process_monitor.label=Process Monitor
+
+##############################################################
+# SourceLocation
+##############################################################
+source_location.undetermined=undetermined
+
+##############################################################
+# TargetException
+##############################################################
+target_exception.error.state=Illegal value for exception state \ No newline at end of file
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreUtils.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreUtils.java
new file mode 100644
index 000000000..83fd4f8e7
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreUtils.java
@@ -0,0 +1,58 @@
+package org.eclipse.debug.internal.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.debug.core.DebugPlugin;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * Utility methods for the debug core plugin.
+ */
+public class DebugCoreUtils {
+
+ private static ResourceBundle fgResourceBundle;
+
+ /**
+ * Utility method
+ */
+ public static String getResourceString(String key) {
+ if (fgResourceBundle == null) {
+ fgResourceBundle= getResourceBundle();
+ }
+ if (fgResourceBundle != null) {
+ return fgResourceBundle.getString(key);
+ } else {
+ return "!" + key + "!";
+ }
+ }
+
+ /**
+ * Returns the resource bundle used by the core debug plugin.
+ */
+ public static ResourceBundle getResourceBundle() {
+ try {
+ return ResourceBundle.getBundle("org.eclipse.debug.internal.core.DebugCoreResources");
+ } catch (MissingResourceException e) {
+ logError(e);
+ }
+ return null;
+ }
+
+ /**
+ * Convenience method to log internal errors
+ */
+ public static void logError(Exception e) {
+ if (DebugPlugin.getDefault().isDebugging()) {
+ // this message is intentionally not internationalized, as an exception may
+ // be due to the resource bundle itself
+ System.out.println("Internal error logged from debug core: ");
+ e.printStackTrace();
+ System.out.println();
+ }
+ }
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java
new file mode 100644
index 000000000..772af46e6
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java
@@ -0,0 +1,160 @@
+package org.eclipse.debug.internal.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.IStreamListener;
+import org.eclipse.debug.core.model.IStreamMonitor;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Monitors an input stream (connected to the output stream of
+ * a system process). An notifies listeners of additions to the
+ * stream.
+ *
+ * @see IStreamMonitor
+ */
+public class InputStreamMonitor implements IStreamMonitor {
+
+ private final static String PREFIX= "input_stream_monitor.";
+ private final static String LABEL= PREFIX + "label";
+
+ /**
+ * The input stream being monitored.
+ */
+ protected InputStream fStream;
+
+ /**
+ * A collection of listeners
+ */
+ protected ListenerList fListeners= new ListenerList(1);
+
+ /**
+ * The local copy of the stream contents
+ */
+ protected StringBuffer fContents;
+
+ /**
+ * The thread which reads from the stream
+ */
+ protected Thread fThread;
+
+ /**
+ * The size of the read buffer
+ */
+ protected static final int BUFFER_SIZE= 8192;
+
+ /**
+ * The number of milliseconds to pause
+ * between reads.
+ */
+ protected static final long DELAY= 50L;
+ /**
+ * Creates an input stream monitor on the
+ * given input stream.
+ */
+ public InputStreamMonitor(InputStream stream) {
+ fStream= stream;
+ fContents= new StringBuffer();
+ }
+
+ /**
+ * @see IStreamMonitor
+ */
+ public void addListener(IStreamListener listener) {
+ fListeners.add(listener);
+ }
+
+ /**
+ * Causes the monitor to close all
+ * communications between it and the
+ * underlying stream.
+ */
+ public void close() {
+ if (fThread != null) {
+ Thread thread= fThread;
+ fThread= null;
+ try {
+ thread.join();
+ } catch (InterruptedException ie) {
+ }
+ }
+ }
+
+ /**
+ * Notifies the listeners that text has
+ * been appended to the stream.
+ */
+ public void fireStreamAppended(String text) {
+ if (text == null)
+ return;
+ Object[] copiedListeners= fListeners.getListeners();
+ for (int i= 0; i < copiedListeners.length; i++) {
+ ((IStreamListener) copiedListeners[i]).streamAppended(text, this);
+ }
+ }
+
+ /**
+ * @see IStreamMonitor
+ */
+ public String getContents() {
+ return fContents.toString();
+ }
+
+ /**
+ * Continually reads from the stream.
+ * <p>
+ * This method, along with the <code>startReading</code>
+ * method is used to allow <code>InputStreamMonitor</code>
+ * to implement <code>Runnable</code> without publicly
+ * exposing a <code>run</code> method.
+ */
+ private void read() {
+ byte[] bytes= new byte[BUFFER_SIZE];
+ while (true) {
+ try {
+ if (fStream.available() == 0) {
+ if (fThread == null)
+ break;
+ } else {
+ int read= fStream.read(bytes);
+ if (read > 0) {
+ String text= new String(bytes, 0, read);
+ fContents.append(text);
+ fireStreamAppended(text);
+ }
+ }
+ } catch (IOException ioe) {
+ }
+ try {
+ Thread.sleep(DELAY);
+ } catch (InterruptedException ie) {
+ }
+ }
+ }
+
+ /**
+ * @see IStreamMonitor
+ */
+ public void removeListener(IStreamListener listener) {
+ fListeners.remove(listener);
+ }
+
+ /**
+ * Starts a <code>Thread</code> which reads the stream.
+ */
+ public void startMonitoring() {
+ if (fThread == null) {
+ fThread= new Thread(new Runnable() {
+ public void run() {
+ read();
+ }
+ }, DebugCoreUtils.getResourceString(LABEL));
+ fThread.start();
+ }
+ }
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
new file mode 100644
index 000000000..327427c39
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
@@ -0,0 +1,241 @@
+package org.eclipse.debug.internal.core;
+
+/*
+* Licensed Materials - Property of IBM,
+* WebSphere Studio Workbench
+* (c) Copyright IBM Corp 2000
+*/
+
+import org.eclipse.debug.core.*;
+import org.eclipse.debug.core.model.IDebugTarget;
+import org.eclipse.debug.core.model.IProcess;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.*;
+import java.util.*;
+
+/**
+ * Manages registered launches.
+ *
+ * @see ILaunchManager
+ */
+public class LaunchManager extends PlatformObject implements ILaunchManager {
+
+ private final static String PREFIX= "launch_manager.";
+ private final static String ERROR= PREFIX + "error.";
+ private final static String TERMINATION= ERROR + "termination";
+
+ /**
+ * Constant for use as local name part of <code>QualifiedName</code>
+ * for persisting the default launcher.
+ */
+ private static final String DEFAULT_LAUNCHER= "launcher";
+
+ /**
+ * Types of notifications
+ */
+ private static final int REGISTERED = 0;
+ private static final int DEREGISTERED = 1;
+
+ /**
+ * Collection of launches
+ */
+ protected Vector fLaunches= new Vector(10);
+
+ /**
+ * Collection of listeners
+ */
+ protected ListenerList fListeners= new ListenerList(5);
+
+ /**
+ * @see ILaunchManager
+ */
+ public void addLaunchListener(ILaunchListener listener) {
+ fListeners.add(listener);
+ }
+
+ /**
+ * @see ILaunchManager
+ */
+ public void deregisterLaunch(ILaunch launch) {
+ fLaunches.remove(launch);
+ fireUpdate(launch, DEREGISTERED);
+ }
+
+ /**
+ * @see ILaunchManager
+ */
+ public ILaunch findLaunch(IProcess process) {
+ Iterator list= fLaunches.iterator();
+ while (list.hasNext()) {
+ ILaunch l= (ILaunch) list.next();
+ IProcess[] ps= l.getProcesses();
+ for (int i= 0; i < ps.length; i++) {
+ if (ps[i].equals(process)) {
+ return l;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @see ILaunchManager
+ */
+ public ILaunch findLaunch(IDebugTarget target) {
+ Iterator list= fLaunches.iterator();
+ while (list.hasNext()) {
+ ILaunch l= (ILaunch) list.next();
+ if (target.equals(l.getDebugTarget())) {
+ return l;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Fires notification to the listeners that a launch has been (de)registered.
+ */
+ public void fireUpdate(ILaunch launch, int update) {
+ Object[] copiedListeners= fListeners.getListeners();
+ for (int i= 0; i < copiedListeners.length; i++) {
+ ILaunchListener listener = (ILaunchListener)copiedListeners[i];
+ switch (update) {
+ case REGISTERED:
+ listener.launchRegistered(launch);
+ break;
+ case DEREGISTERED:
+ listener.launchDeregistered(launch);
+ break;
+ }
+ }
+ }
+
+ /**
+ * @see ILaunchManager
+ */
+ public IDebugTarget[] getDebugTargets() {
+ List targets= new ArrayList(fLaunches.size());
+ if (fLaunches.size() > 0) {
+ Iterator e= fLaunches.iterator();
+ while (e.hasNext()) {
+ IDebugTarget target= ((ILaunch) e.next()).getDebugTarget();
+ if (target != null)
+ targets.add(target);
+ }
+ }
+ return (IDebugTarget[])targets.toArray(new IDebugTarget[targets.size()]);
+ }
+
+ /**
+ * @see ILaunchManager
+ */
+ public ILauncher getDefaultLauncher(IProject project) throws CoreException {
+ ILauncher launcher= null;
+ if ((project != null) && project.isOpen()) {
+ String launcherID = project.getPersistentProperty(new QualifiedName(IDebugConstants.PLUGIN_ID, DEFAULT_LAUNCHER));
+ if (launcherID != null) {
+ launcher= getLauncher(launcherID);
+ }
+ }
+ return launcher;
+ }
+
+ /**
+ * Returns the launcher with the given id, or <code>null</code>.
+ */
+ public ILauncher getLauncher(String id) {
+ ILauncher[] launchers= getLaunchers();
+ for (int i= 0; i < launchers.length; i++) {
+ if (launchers[i].getIdentifier().equals(id)) {
+ return launchers[i];
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @see ILaunchManager
+ */
+ public ILauncher[] getLaunchers() {
+ return DebugPlugin.getDefault().getLaunchers();
+ }
+
+ /**
+ * @see ILaunchManager
+ */
+ public ILauncher[] getLaunchers(String mode) {
+ ILauncher[] launchers = getLaunchers();
+ ArrayList list = new ArrayList();
+ for (int i = 0; i < launchers.length; i++) {
+ if (launchers[i].getModes().contains(mode)) {
+ list.add(launchers[i]);
+ }
+ }
+ return (ILauncher[])list.toArray(new ILauncher[list.size()]);
+ }
+
+ /**
+ * @see ILaunchManager
+ */
+ public ILaunch[] getLaunches() {
+ return (ILaunch[])fLaunches.toArray(new ILaunch[fLaunches.size()]);
+ }
+
+ /**
+ * @see ILaunchManager
+ */
+ public IProcess[] getProcesses() {
+ List allProcesses= new ArrayList(fLaunches.size());
+ if (fLaunches.size() > 0) {
+ Iterator e= fLaunches.iterator();
+ while (e.hasNext()) {
+ IProcess[] processes= ((ILaunch) e.next()).getProcesses();
+ for (int i= 0; i < processes.length; i++) {
+ allProcesses.add(processes[i]);
+ }
+ }
+ }
+ return (IProcess[])allProcesses.toArray(new IProcess[allProcesses.size()]);
+ }
+
+ /**
+ * @see ILaunchManager
+ */
+ public void registerLaunch(ILaunch launch) {
+ fLaunches.add(launch);
+ fireUpdate(launch, REGISTERED);
+ }
+
+ /**
+ * @see ILaunchManager
+ */
+ public void removeLaunchListener(ILaunchListener listener) {
+ fListeners.remove(listener);
+ }
+
+ /**
+ * @see ILaunchManager
+ */
+ public void setDefaultLauncher(IProject resource, ILauncher launcher) throws CoreException {
+ String id = null;
+ if (launcher != null) {
+ id = launcher.getIdentifier();
+ }
+ resource.setPersistentProperty(new QualifiedName(IDebugConstants.PLUGIN_ID, DEFAULT_LAUNCHER), id);
+ }
+
+ /**
+ * Terminates/Disconnects any active debug targets/processes.
+ */
+ public void shutdown() {
+ ILaunch[] launches = getLaunches();
+ for (int i= 0; i < launches.length; i++) {
+ ILaunch launch= launches[i];
+ try {
+ launch.terminate();
+ } catch (DebugException e) {
+ DebugCoreUtils.logError(e);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/Launcher.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/Launcher.java
new file mode 100644
index 000000000..50d444e98
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/Launcher.java
@@ -0,0 +1,113 @@
+package org.eclipse.debug.internal.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.ILauncher;
+import org.eclipse.debug.core.model.ILauncherDelegate;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+/**
+ * A handle to a launcher extension that instantiates the actual
+ * extension lazily.
+ */
+public class Launcher implements ILauncher {
+
+ /**
+ * The configuration element that defines this launcher handle
+ */
+ protected IConfigurationElement fConfigElement = null;
+
+ /**
+ * The underlying launcher, which is <code>null</code> until the
+ * it needs to be instantiated.
+ */
+ protected ILauncherDelegate fDelegate = null;
+
+ /**
+ * Cache of the modes this launcher supports
+ */
+ protected Set fModes;
+
+ /**
+ * Constructs a handle for a launcher extension.
+ */
+ public Launcher(IConfigurationElement element) {
+ fConfigElement = element;
+ }
+
+ /**
+ * @see ILauncher
+ */
+ public String getIdentifier() {
+ return fConfigElement.getAttribute("id");
+ }
+
+ /**
+ * Returns the set of modes specified in the configuration data.
+ * The set contains "mode" constants defined in <code>ILaunchManager</code>
+ */
+ public Set getModes() {
+ if (fModes == null) {
+ String modes= fConfigElement.getAttribute("modes");
+ if (modes == null) {
+ return null;
+ }
+ StringTokenizer tokenizer= new StringTokenizer(modes, ",");
+ fModes = new HashSet(tokenizer.countTokens());
+ while (tokenizer.hasMoreTokens()) {
+ fModes.add(tokenizer.nextToken().trim());
+ }
+ }
+ return fModes;
+ }
+
+ /**
+ * Returns the label specified in the configuration data.
+ */
+ public String getLabel() {
+ return fConfigElement.getAttribute("label");
+ }
+
+ /**
+ * @see ILauncher
+ */
+ public String getPerspectiveIdentifier() {
+ return fConfigElement.getAttribute("perspective");
+ }
+
+ /**
+ * Returns the launcher for this handle, instantiating it if required.
+ */
+ public ILauncherDelegate getDelegate() {
+ if (fDelegate == null) {
+ try {
+ fDelegate = (ILauncherDelegate)fConfigElement.createExecutableExtension("class");
+ } catch (CoreException e) {
+ //status logged in the #createExecutableExtension code
+ }
+ }
+ return fDelegate;
+ }
+
+ /**
+ * @see ILauncher
+ */
+ public boolean launch(Object[] elements, String mode) {
+ return getDelegate().launch(elements, mode, this);
+ }
+
+ /**
+ * Returns the configuration element for this extension
+ */
+ public IConfigurationElement getConfigurationElement() {
+ return fConfigElement;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ListenerList.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ListenerList.java
new file mode 100644
index 000000000..c6e274d91
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ListenerList.java
@@ -0,0 +1,142 @@
+package org.eclipse.debug.internal.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+/**
+ * Local version of org.eclipse.jface.util.ListenerList
+ */
+public class ListenerList {
+ /**
+ * The initial capacity of the list. Always >= 1.
+ */
+ private int fCapacity;
+
+ /**
+ * The current number of listeners.
+ * Maintains invariant: 0 <= fSize <= listeners.length.
+ */
+ private int fSize;
+
+ /**
+ * The list of listeners. Initially <code>null</code> but initialized
+ * to an array of size capacity the first time a listener is added.
+ * Maintains invariant: listeners != null IFF fSize != 0
+ */
+ private Object[] fListeners= null;
+
+ /**
+ * The empty array singleton instance, returned by getListeners()
+ * when size == 0.
+ */
+ private static final Object[] EmptyArray= new Object[0];
+ /**
+ * Creates a listener list with an initial capacity of 3.
+ */
+ public ListenerList() {
+ this(3);
+ }
+
+ /**
+ * Creates a listener list with the given initial capacity.
+ *
+ * @param capacity the number of listeners which this list can initially accept
+ * without growing its internal representation; must be at least 1
+ */
+ public ListenerList(int capacity) {
+ if (capacity < 1) {
+ throw new IllegalArgumentException();
+ }
+ fCapacity= capacity;
+ }
+
+ /**
+ * Adds a listener to the list.
+ * Has no effect if an identical listener is already registered.
+ *
+ * @param listener a listener
+ */
+ public void add(Object listener) {
+ if (listener == null) {
+ throw new IllegalArgumentException();
+ }
+ if (fSize == 0) {
+ fListeners= new Object[fCapacity];
+ } else {
+ // check for duplicates using identity
+ for (int i= 0; i < fSize; ++i) {
+ if (fListeners[i] == listener) {
+ return;
+ }
+ }
+ // grow array if necessary
+ if (fSize == fListeners.length) {
+ System.arraycopy(fListeners, 0, fListeners= new Object[fSize * 2 + 1], 0, fSize);
+ }
+ }
+ fListeners[fSize++]= listener;
+ }
+
+ /**
+ * Returns an array containing all the registered listeners.
+ * The resulting array is unaffected by subsequent adds or removes.
+ * If there are no listeners registered, the result is an empty array
+ * singleton instance (no garbage is created).
+ * Use this method when notifying listeners, so that any modifications
+ * to the listener list during the notification will have no effect on the
+ * notification itself.
+ */
+ public Object[] getListeners() {
+ if (fSize == 0)
+ return EmptyArray;
+ Object[] result= new Object[fSize];
+ System.arraycopy(fListeners, 0, result, 0, fSize);
+ return result;
+ }
+
+ /**
+ * Returns <code>true</code> if there are no registered listeners,
+ * <code>false</code> otherwise.
+ */
+ public boolean isEmpty() {
+ return fSize == 0;
+ }
+
+ /**
+ * Removes a listener from the list.
+ * Has no effect if an identical listener was not already registered.
+ *
+ * @param listener a listener
+ */
+ public void remove(Object listener) {
+ if (listener == null) {
+ throw new IllegalArgumentException();
+ }
+
+ for (int i= 0; i < fSize; ++i) {
+ if (fListeners[i] == listener) {
+ if (fSize == 1) {
+ fListeners= null;
+ fSize= 0;
+ } else {
+ System.arraycopy(fListeners, i + 1, fListeners, i, --fSize - i);
+ fListeners[fSize]= null;
+ }
+ return;
+ }
+ }
+ }
+
+ /**
+ * Returns the number of registered listeners
+ *
+ * @return the number of registered listeners
+ */
+ public int size() {
+ return fSize;
+ }
+}
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ProcessMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ProcessMonitor.java
new file mode 100644
index 000000000..fe42eaff2
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/ProcessMonitor.java
@@ -0,0 +1,72 @@
+package org.eclipse.debug.internal.core;
+
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.*;
+
+/**
+ * Monitors a system process, wiating for it to terminate, and
+ * then notifies the associated runtime process.
+ */
+
+public class ProcessMonitor {
+
+ private final static String PREFIX= "process_monitor.";
+ private final static String LABEL= PREFIX + "label";
+ /**
+ * The <code>IProcess</code> being monitored.
+ */
+ protected RuntimeProcess fProcess;
+ /**
+ * The <code>java.lang.Process</code> being monitored.
+ */
+ protected Process fOSProcess;
+ /**
+ * The <code>Thread</code> which is monitoring the process.
+ */
+ protected Thread fThread;
+ /**
+ * Creates a new process monitor and starts monitoring the process
+ * for termination.
+ */
+ public ProcessMonitor(RuntimeProcess process) {
+ fProcess= process;
+ fOSProcess= process.getSystemProcess();
+ startMonitoring();
+ }
+
+ /**
+ * Monitors the process for termination
+ */
+ private void monitorProcess() {
+ while (fOSProcess != null) {
+ try {
+ fOSProcess.waitFor();
+ fOSProcess= null;
+ fProcess.terminated();
+ } catch (InterruptedException ie) {
+ }
+ }
+ }
+
+ /**
+ * Starts monitoring the process to determine
+ * if it has terminated.
+ */
+ private void startMonitoring() {
+ if (fThread == null) {
+ fThread= new Thread(new Runnable() {
+ public void run() {
+ monitorProcess();
+ }
+ }, DebugCoreUtils.getResourceString(LABEL));
+ fThread.start();
+ }
+ }
+
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/RuntimeProcess.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/RuntimeProcess.java
new file mode 100644
index 000000000..8cc813979
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/RuntimeProcess.java
@@ -0,0 +1,202 @@
+package org.eclipse.debug.internal.core;
+
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.*;
+import org.eclipse.debug.core.model.IProcess;
+import org.eclipse.debug.core.model.IStreamsProxy;
+import org.eclipse.core.runtime.PlatformObject;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.HashMap;
+
+
+/**
+ * A runtime process is a wrapper for a non-debuggable
+ * system process. The process will appear in the debug UI with
+ * console and termination support. The process creates a streams
+ * proxy for itself, and a process monitor that monitors the
+ * underlying system process for terminataion.
+ */
+public class RuntimeProcess extends PlatformObject implements IProcess {
+ /**
+ * The system process
+ */
+ protected Process fProcess;
+
+ /**
+ * Process monitor
+ */
+ protected ProcessMonitor fMonitor;
+
+ /**
+ * The streams proxy for this process
+ */
+ protected StreamsProxy fStreamsProxy;
+
+ /**
+ * The name of the process
+ */
+ protected String fName;
+
+ /**
+ * <code>true</code> when this process has been termianted
+ */
+ protected boolean fTerminated;
+
+ /**
+ * Table of cleint defined attributes
+ */
+ protected HashMap fAttributes;
+
+ /**
+ * Constructs a RuntimeProcess on the given system process
+ * with the given name.
+ */
+ public RuntimeProcess(Process process, String name) {
+ fProcess= process;
+ fName= name;
+ fTerminated= true;
+ try {
+ process.exitValue();
+ } catch (IllegalThreadStateException e) {
+ fTerminated= false;
+ }
+ fMonitor = new ProcessMonitor(this);
+ fStreamsProxy = new StreamsProxy(this);
+ fireCreationEvent();
+ }
+
+ /**
+ * @see IProcess
+ */
+ public boolean canTerminate() {
+ return !fTerminated;
+ }
+
+ /**
+ * Returns the error stream of the underlying system process (connected
+ * to the standard error of the process).
+ */
+ public InputStream getErrorStream() {
+ return fProcess.getErrorStream();
+ }
+
+ /**
+ * Returns the input stream of the underlying system process (connected
+ * to the standard out of the process).
+ */
+ public InputStream getInputStream() {
+ return fProcess.getInputStream();
+ }
+
+ /**
+ * @see IProcess
+ */
+ public String getLabel() {
+ return fName;
+ }
+
+ /**
+ * @see IProcess
+ */
+ public ILaunch getLaunch() {
+ return DebugPlugin.getDefault().getLaunchManager().findLaunch(this);
+ }
+
+ /**
+ * Returns the output stream of the underlying system process (connected
+ * to the standard in of the process).
+ */
+ public OutputStream getOutputStream() {
+ return fProcess.getOutputStream();
+ }
+
+ public Process getSystemProcess() {
+ return fProcess;
+ }
+
+ /**
+ * @see IProcess
+ */
+ public boolean isTerminated() {
+ return fTerminated;
+ }
+
+ /**
+ * @see IProcess
+ */
+ public void terminate() throws DebugException {
+ if (!isTerminated()) {
+ fProcess.destroy();
+ try {
+ fProcess.waitFor();
+ } catch (InterruptedException ie) {}
+ }
+ }
+
+ /**
+ * Notification that the system process associated with this process
+ * has terminated.
+ */
+ public void terminated() {
+ fStreamsProxy.close();
+ fTerminated= true;
+ fProcess= null;
+ fireTerminateEvent();
+ }
+
+ public IStreamsProxy getStreamsProxy() {
+ return fStreamsProxy;
+ }
+
+ /**
+ * Fire a debug event marking the creation of this element.
+ */
+ public void fireCreationEvent() {
+ fireEvent(new DebugEvent(this, DebugEvent.CREATE));
+ }
+
+ /**
+ * Fire a debug event
+ */
+ public void fireEvent(DebugEvent event) {
+ DebugPlugin manager= DebugPlugin.getDefault();
+ if (manager != null) {
+ manager.fireDebugEvent(event);
+ }
+ }
+
+ /**
+ * Fire a debug event marking the termination of this process.
+ */
+ public void fireTerminateEvent() {
+ fireEvent(new DebugEvent(this, DebugEvent.TERMINATE));
+ }
+
+ /**
+ * @see IProcess
+ */
+ public void setAttribute(String key, String value) {
+ if (fAttributes == null) {
+ fAttributes = new HashMap(5);
+ }
+ fAttributes.put(key, value);
+ }
+
+ /**
+ * @see IProcess
+ */
+ public String getAttribute(String key) {
+ if (fAttributes == null) {
+ return null;
+ }
+ return (String)fAttributes.get(key);
+ }
+}
+
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java
new file mode 100644
index 000000000..919069061
--- /dev/null
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java
@@ -0,0 +1,86 @@
+package org.eclipse.debug.internal.core;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.model.IStreamMonitor;
+import org.eclipse.debug.core.model.IStreamsProxy;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * @see IStreamsProxy
+ */
+public class StreamsProxy implements IStreamsProxy {
+ /**
+ * The monitor for the input stream (connected to standard out of the process)
+ */
+ protected InputStreamMonitor fInputMonitor;
+ /**
+ * The monitor for the error stream.
+ */
+ protected InputStreamMonitor fErrorMonitor;
+ /**
+ * The <code>OutputStream</code> of the <code>IProcess</code>.
+ */
+ protected OutputStream fOutputStream;
+ /**
+ * Records the open/closed state of communications with
+ * the underlying streams.
+ */
+ protected boolean fClosed= false;
+ /**
+ * Creates a <code>StreamsProxy</code> on the streams
+ * of the given <code>IProcess</code>.
+ */
+ public StreamsProxy(RuntimeProcess process) {
+ if (process != null) {
+ fInputMonitor= new InputStreamMonitor(process.getInputStream());
+ fErrorMonitor= new InputStreamMonitor(process.getErrorStream());
+ fOutputStream= process.getOutputStream();
+ fInputMonitor.startMonitoring();
+ fErrorMonitor.startMonitoring();
+ }
+ }
+
+ /**
+ * Causes the proxy to close all
+ * communications between it and the
+ * underlying streams.
+ */
+ public void close() {
+ fClosed= true;
+ fInputMonitor.close();
+ fErrorMonitor.close();
+ }
+
+ /**
+ * @see IStreamsProxy
+ */
+ public IStreamMonitor getErrorStreamMonitor() {
+ return fErrorMonitor;
+ }
+
+ /**
+ * @see IStreamsProxy
+ */
+ public IStreamMonitor getOutputStreamMonitor() {
+ return fInputMonitor;
+ }
+
+ /**
+ * @see IStreamsProxy
+ */
+ public void write(String input) throws IOException {
+ if (!fClosed && fOutputStream != null) {
+ fOutputStream.write(input.getBytes());
+ fOutputStream.flush();
+ } else {
+ throw new IOException();
+ }
+ }
+
+}
diff --git a/org.eclipse.debug.core/doc/hglegal.htm b/org.eclipse.debug.core/doc/hglegal.htm
new file mode 100644
index 000000000..5ac1c6333
--- /dev/null
+++ b/org.eclipse.debug.core/doc/hglegal.htm
@@ -0,0 +1,19 @@
+<!doctype html public "-//w3c//dtd html 3.2 final//en">
+<html>
+
+<head>
+<title>Legal Notices</title>
+</head>
+
+<body>
+
+<h3><a name="Notices">Notices</a></h3>
+
+<p>Licensed Materials - Property of IBM<br>
+WebSphere Studio Workbench<br>
+(c) Copyright IBM Corp. 2000 All Rights Reserved.</p>
+
+<p>US Government Users Restricted Rights - Use, duplication or disclosure restricted by
+GSA ADP Schedule Contract with IBM Corp.</p>
+</body>
+</html>
diff --git a/org.eclipse.debug.core/doc/ngibmcpy.gif b/org.eclipse.debug.core/doc/ngibmcpy.gif
new file mode 100644
index 000000000..e0d777bf5
--- /dev/null
+++ b/org.eclipse.debug.core/doc/ngibmcpy.gif
Binary files differ
diff --git a/org.eclipse.debug.core/doc/org_eclipse_debug_core.html b/org.eclipse.debug.core/doc/org_eclipse_debug_core.html
new file mode 100644
index 000000000..eec9824c6
--- /dev/null
+++ b/org.eclipse.debug.core/doc/org_eclipse_debug_core.html
@@ -0,0 +1,36 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
+<title>README Debug User Interface Extension Points</title>
+</head>
+
+<body link="#0000FF" vlink="#800080">
+
+<h1 align="center">Eclipse Debug Tools Infrastructure</h1>
+
+<p>The debug tools infrastructure plug-in, <font face="Courier">org.eclipse.debug.core</font>,
+defines a model for language independent debugging. A set of common debug artifacts and
+actions are defined by interfaces, for which specific debug architectures may provide
+implementations. For example, some common artifacts are threads, stack frames, and
+variables; some common actions are terminate, suspend, step, and resume. A debug
+architecture, such as JDI (Java Debug Interface), can provide an implementation of the
+artifacts and actions. The debug plug-in also defines and provides an implementation of
+managers to support breakpoints and launching.<br>
+</p>
+
+<hr>
+
+<h1>Extension Points</h1>
+
+<p>The following extension points are used to support and extend the debug infrastructure:
+
+<ul>
+ <li><a href="org_eclipse_debug_core_launchers.html">org.eclipse.debug.core.launchers</a></li>
+</ul>
+
+<p><a href="hglegal.htm"><img src="ngibmcpy.gif" alt="Copyright IBM Corporation 2000"
+border="0" width="195" height="12"></a></p>
+</body>
+</html>
diff --git a/org.eclipse.debug.core/doc/org_eclipse_debug_core_launchers.html b/org.eclipse.debug.core/doc/org_eclipse_debug_core_launchers.html
new file mode 100644
index 000000000..2efde17b0
--- /dev/null
+++ b/org.eclipse.debug.core/doc/org_eclipse_debug_core_launchers.html
@@ -0,0 +1,95 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
+<title>README Launcher Extension Points</title>
+</head>
+
+<body link="#0000FF" vlink="#800080">
+
+<h1 align="center">Launcher</h1>
+
+<p><b><i>Identifier: </i></b>org.eclipse.debug.core.launchers </p>
+
+<p><b><i>Description: </i></b>This extension point allows tools to contribute launchers. A
+launcher is responsible for initiating a debug session or running a program and
+registering the result with the launch manager.</p>
+
+<p><b><i>Configuration Markup:</i></b> </p>
+
+<pre><tt>&nbsp;&nbsp; &lt;!ATTLIST launcher</tt>
+ id CDATA #REQUIRED<tt>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class CDATA #REQUIRED</tt>
+<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; modes CDATA #REQUIRED
+</tt> label CDATA #REQUIRED
+ wizard CDATA #IMPLIED
+ public CDATA #IMPLIED
+ description CDATA #IMPLIED
+ <tt>perspective CDATA #IMPLIED
+ &gt;</tt> </pre>
+
+<ul>
+ <li><strong>id </strong>&#150; a unique identifier that can be used to reference this
+ launcher.</li>
+ <li><b>class</b> &#150; fully qualified name of the class that implements <font
+ face="Courier New">org.eclipse.debug.core.ILauncherDelegate</font>.</li>
+ <li><b>modes</b> &#150; A comma separated list of modes this launcher supports. The two
+ supported modes are &quot;run&quot; and &quot;debug&quot; - as defined in <font
+ face="Courier New">org.eclipse.debug.core.ILaunchManager.</font>A launcher may be capable
+ of launching in one or both modes.</li>
+ <li><strong>label </strong>&#150; a label to use for the launcher. This attribute is used by
+ the debug UI.</li>
+ <li><strong>wizard </strong>&#150; fully qualified name of the class that implements <font
+ face="Courier New">org.eclipse.debug.ui.ILaunchWizard</font>. This attribute is used by
+ the debug UI. A launcher may contribute a wizard that allows users to configure and launch
+ specific attributes.</li>
+ <li><strong>public</strong> &#150; whether a launcher is publically visible in the debug UI.
+ &nbsp; If &quot;true&quot;,&nbsp; the launcher will be available from the debug UI - the
+ launcher will appear as a choice for a default launcher, launches created by this launcher
+ will appear in the launch history, and the launcher will be available from the drop-down
+ run/debug toolbar actions.</li>
+ <li><strong>description</strong> &#150; a description of the launcher.&nbsp; Currently only
+ used if the <em>wizard</em> attribute is specified.</li>
+ <li><strong>perspective</strong> &#150; the identifier of the perspective that will be
+ switched to on a successful launch.&nbsp; Default value is the identifier for the debug
+ perspective. This attribute is used by the debug UI.</li>
+</ul>
+
+<p><b><i>Examples:</i></b> </p>
+
+<p>The following is an example of a launcher extension point: </p>
+
+<pre><tt>&nbsp;&nbsp; &lt;extension</tt>
+<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; point = &quot;org.eclipse.debug.core.launchers&quot;&gt;</tt>
+<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;launcher</tt>
+ id = &quot;com.example.ExampleLauncher&quot;
+<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; class = &quot;com.example.launchers.ExampleLauncher&quot;</tt>
+<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; modes = &quot;run, debug&quot;
+ label = &quot;Example Launcher&quot;
+ wizard = &quot;com.example.launchers.ui.ExampleLaunchWizard&quot;
+ public = &quot;true&quot;
+ description = &quot;Launches example programs&quot;
+ perspective= &quot;com.example.JavaPerspective&quot;&gt;</tt>
+<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/launcher&gt;</tt>
+<tt>&nbsp;&nbsp; &lt;/extension&gt;</tt> </pre>
+
+<p>In the example above, the specified launcher supports both run and debug modes.
+Following a successful launch, the debug UI will change to the Java perspective. When the
+debug UI presents the user with a list of launchers to choose from, &quot;Example
+Launcher&quot; will appear as one of the choices with the &quot;Launches example
+programs&quot; as the description, and the wizard specified by <font face="Courier New">com.example.launchers.ui.ExampleLaunchWizard</font>
+will be used to configure any launch specific details.</p>
+
+<p><b><i>API Information: </i></b>Value of the attribute <b>class</b> must be a fully
+qualified class name of a Java class that implements the interface <font size="2"
+face="Courier New">org.eclipse.debug.core.ILauncher</font>Delegate. Value of the attribute
+<strong>wizard</strong> must be a fully qualified class name of a Java class that
+implements <font size="2" face="Courier New">org.eclipse.debug.ui.ILaunchWizard</font>.<br>
+<br>
+</p>
+
+<p><a href="hglegal.htm"><img src="ngibmcpy.gif" alt="Copyright IBM Corporation 2000"
+border="0" width="195" height="12"></a></p>
+</body>
+</html>
diff --git a/org.eclipse.debug.core/exportplugin.xml b/org.eclipse.debug.core/exportplugin.xml
new file mode 100644
index 000000000..fa5508934
--- /dev/null
+++ b/org.eclipse.debug.core/exportplugin.xml
@@ -0,0 +1,28 @@
+<!-- Export a jar of .class files for the org.eclipse.debug.core Eclipse plugin
+ along with other important plugin files to the "plugin-export" subdirectory
+ of the target Eclipse installation -->
+<project name="org.eclipse.debug.core" default="export" basedir=".">
+
+ <!-- Set the timestamp and important properties -->
+ <target name="init">
+ <tstamp/>
+ <property name="destdir" value="../../plugin-export" />
+ <property name="dest" value="${destdir}/org.eclipse.debug.core" />
+ </target>
+
+ <!-- Create the jar of .class files, and copy other important files to export dir -->
+ <target name="export" depends="init">
+ <mkdir dir="${destdir}" />
+ <delete dir="${dest}" />
+ <mkdir dir="${dest}" />
+ <jar
+ jarfile="${dest}/dtcore.jar"
+ basedir="bin"
+ />
+ <copy file="plugin.xml" todir="${dest}"/>
+ <copy file="plugin.jars" todir="${dest}"/>
+ <copy file=".classpath" todir="${dest}"/>
+ <copy file=".options" todir="${dest}"/>
+ </target>
+
+</project>
diff --git a/org.eclipse.debug.core/plugin.jars b/org.eclipse.debug.core/plugin.jars
new file mode 100644
index 000000000..e50828df4
--- /dev/null
+++ b/org.eclipse.debug.core/plugin.jars
@@ -0,0 +1 @@
+dtcore.jar=Eclipse Debug Core \ No newline at end of file
diff --git a/org.eclipse.debug.core/plugin.xml b/org.eclipse.debug.core/plugin.xml
new file mode 100644
index 000000000..ad155ed20
--- /dev/null
+++ b/org.eclipse.debug.core/plugin.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+
+<plugin
+ name = "DebugTools"
+ id = "org.eclipse.debug.core"
+ version = "0.105.0"
+ vendor-name = "OTI"
+ class="org.eclipse.debug.core.DebugPlugin">
+
+<requires>
+ <import plugin="org.apache.xerces"/>
+ <import plugin="org.eclipse.core.resources"/>
+</requires>
+
+<runtime>
+ <library name="dtcore.jar" >
+ <export name= "*" />
+ </library>
+</runtime>
+
+<extension-point name="Launcher" id="launchers"/>
+
+<extension id="breakpoint" point="org.eclipse.core.resources.markers">
+ <super type="org.eclipse.core.resources.marker"/>
+ <persistent value="true"/>
+ <attribute name="modelIdentifier"/>
+ <attribute name="enabled"/>
+</extension>
+
+<extension id="lineBreakpoint" point="org.eclipse.core.resources.markers">
+ <super type="org.eclipse.debug.core.breakpoint"/>
+ <super type="org.eclipse.core.resources.textmarker"/>
+ <persistent value="true"/>
+</extension>
+
+</plugin>
+
diff --git a/org.eclipse.debug.ui/.classpath b/org.eclipse.debug.ui/.classpath
new file mode 100644
index 000000000..1a8943c3f
--- /dev/null
+++ b/org.eclipse.debug.ui/.classpath
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="lib" path="C:/eclipse/jre/lib/rt.jar"/>
+ <classpathentry kind="src" path="Eclipse Debug UI"/>
+ <classpathentry kind="lib" path="C:/eclipse/plugins/org.apache.xerces/xerces.jar"/>
+ <classpathentry kind="lib" path="C:/eclipse/plugins/org.eclipse.core.resources/resources.jar"/>
+ <classpathentry kind="lib" path="C:/eclipse/plugins/org.eclipse.core.runtime/runtime.jar"/>
+ <classpathentry kind="lib" path="C:/eclipse/plugins/org.eclipse.ui/workbench.jar"/>
+ <classpathentry kind="src" path="/org.eclipse.debug.core"/>
+ <classpathentry kind="lib" path="C:/eclipse/plugins/org.eclipse.swt/swt0108.jar"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.debug.ui/.cvsignore b/org.eclipse.debug.ui/.cvsignore
new file mode 100644
index 000000000..c5e82d745
--- /dev/null
+++ b/org.eclipse.debug.ui/.cvsignore
@@ -0,0 +1 @@
+bin \ No newline at end of file
diff --git a/org.eclipse.debug.ui/.options b/org.eclipse.debug.ui/.options
new file mode 100644
index 000000000..03af25da9
--- /dev/null
+++ b/org.eclipse.debug.ui/.options
@@ -0,0 +1 @@
+ org.eclipse.debug.ui/debug=true \ No newline at end of file
diff --git a/org.eclipse.debug.ui/.vcm_meta b/org.eclipse.debug.ui/.vcm_meta
new file mode 100644
index 000000000..aae2e1b3e
--- /dev/null
+++ b/org.eclipse.debug.ui/.vcm_meta
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-description>
+ <nature id="org.eclipse.jdt.core.javanature"/>
+ <builder name="org.eclipse.jdt.core.javabuilder">
+ </builder>
+</project-description>
diff --git a/org.eclipse.debug.ui/build.properties b/org.eclipse.debug.ui/build.properties
new file mode 100644
index 000000000..d27f025e7
--- /dev/null
+++ b/org.eclipse.debug.ui/build.properties
@@ -0,0 +1,2 @@
+build.includes=.options,plugin.jars,plugin.xml,plugin.properties,icons,doc
+build.vaj.Eclipse\ Debug\ UI=Eclipse Debug UI
diff --git a/org.eclipse.debug.ui/doc/hglegal.htm b/org.eclipse.debug.ui/doc/hglegal.htm
new file mode 100644
index 000000000..5ac1c6333
--- /dev/null
+++ b/org.eclipse.debug.ui/doc/hglegal.htm
@@ -0,0 +1,19 @@
+<!doctype html public "-//w3c//dtd html 3.2 final//en">
+<html>
+
+<head>
+<title>Legal Notices</title>
+</head>
+
+<body>
+
+<h3><a name="Notices">Notices</a></h3>
+
+<p>Licensed Materials - Property of IBM<br>
+WebSphere Studio Workbench<br>
+(c) Copyright IBM Corp. 2000 All Rights Reserved.</p>
+
+<p>US Government Users Restricted Rights - Use, duplication or disclosure restricted by
+GSA ADP Schedule Contract with IBM Corp.</p>
+</body>
+</html>
diff --git a/org.eclipse.debug.ui/doc/ngibmcpy.gif b/org.eclipse.debug.ui/doc/ngibmcpy.gif
new file mode 100644
index 000000000..e0d777bf5
--- /dev/null
+++ b/org.eclipse.debug.ui/doc/ngibmcpy.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/doc/org_eclipse_debug_ui.html b/org.eclipse.debug.ui/doc/org_eclipse_debug_ui.html
new file mode 100644
index 000000000..c2bc5ae26
--- /dev/null
+++ b/org.eclipse.debug.ui/doc/org_eclipse_debug_ui.html
@@ -0,0 +1,32 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
+<title>README Debug User Interface Extension Points</title>
+</head>
+
+<body link="#0000FF" vlink="#800080">
+
+<h1 align="center">Eclipse Debug Tools User-Interface</h1>
+
+<p>This debug tools UI plug-in, <font face="Courier">org.eclipse.debug.ui</font>, implements a
+debug user-interface, allowing the user to view and manipulate debug targets, processes,
+threads, stack frames, and variables. It provides standard debug functionality such as
+stepping, setting breakpoints, etc. <br>
+</p>
+
+<hr>
+
+<h1>Extension Points</h1>
+
+<p>The following extension points are used to support and extend the debug UI.:
+
+<ul>
+ <li><a href="org_eclipse_debug_ui_debugModelPresentations.html">org.eclipse.debug.ui.debugModelPresentations</a></li>
+</ul>
+
+<p><a href="hglegal.htm"><img src="ngibmcpy.gif" alt="Copyright IBM Corporation 2000"
+border="0" width="195" height="12"></a></p>
+</body>
+</html>
diff --git a/org.eclipse.debug.ui/doc/org_eclipse_debug_ui_debugModelPresentations.html b/org.eclipse.debug.ui/doc/org_eclipse_debug_ui_debugModelPresentations.html
new file mode 100644
index 000000000..99b721fdd
--- /dev/null
+++ b/org.eclipse.debug.ui/doc/org_eclipse_debug_ui_debugModelPresentations.html
@@ -0,0 +1,56 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
+<title>README Viewer Label Provider Extension Points</title>
+</head>
+
+<body link="#0000FF" vlink="#800080">
+
+<h1 align="center">Debug Model Presentation</h1>
+
+<p><b><i>Identifier: </i></b>org.eclipse.debug.ui.debugModelPresentations</p>
+
+<p><b><i>Description: </i></b>This extension point allows tools to handle the presentation
+aspects of a debug model. A debug model presentation is responsible for providing labels,
+images, and editors for elements in a specific debug model.</p>
+
+<p><b><i>Configuration Markup:</i></b> </p>
+
+<p><tt>&nbsp;&nbsp; &lt;!ATTLIST sectionParser</tt> <br>
+<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class&nbsp;&nbsp; &nbsp;&nbsp;CDATA #REQUIRED</tt> <tt><font
+face="Courier New"><br>
+</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id &nbsp; &nbsp; &nbsp;&nbsp; CDATA #REQUIRED</tt>
+
+<ul>
+ <li><b>class</b> &#150; fully qualifed name of a Java class that implements the <font
+ face="Courier New">org.eclipse.debug.ui.IDebugModelPresentation</font></li>
+ <li><strong>id</strong> &#150; the identifier of the debug model this presentation is
+ responsible for</li>
+</ul>
+
+<p><b><i>Examples:</i></b> </p>
+
+<p>The following is an example of a view filter extension point: </p>
+
+<pre><font face="Courier"><tt>&nbsp;&nbsp; &lt;extension</tt>
+<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; point = &quot;org.eclipse.debug.ui.debugModelPresentations&quot;&gt;</tt>
+<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;debugModelPresentation</tt>
+<tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class = &quot;com.example.JavaModelPresentation&quot;&gt;</tt>
+<tt> id = &quot;com.example.JavaDebugModel&quot;
+ &lt;/debugLabelProvider</tt>
+<tt>&nbsp;&nbsp; &lt;/extension&gt;</tt></font> </pre>
+
+<p>In the example above, the class <tt>com.example.JavaModelPresentation</tt> will be used
+to render and present debug elements originating from the debug model identified by <font
+face="Courier">com.example.JavaDebugModel</font>.</p>
+
+<p><b><i>API Information: </i></b>Value of the action attribute <b>class</b> must be a
+fully qualified class name of a Java class that implements <font size="2"
+face="Courier New">org.eclipse.debug.ui.IDebugModelPresentation.</font></p>
+
+<p><a href="hglegal.htm"><img src="ngibmcpy.gif" alt="Copyright IBM Corporation 2000"
+border="0" width="195" height="12"></a></p>
+</body>
+</html>
diff --git a/org.eclipse.debug.ui/exportplugin.xml b/org.eclipse.debug.ui/exportplugin.xml
new file mode 100644
index 000000000..8ce17edb0
--- /dev/null
+++ b/org.eclipse.debug.ui/exportplugin.xml
@@ -0,0 +1,32 @@
+<!-- Export a jar of .class files for the org.eclipse.debug.ui Eclipse plugin
+ along with other important plugin files to the "plugin-export" subdirectory
+ of the target Eclipse installation -->
+<project name="org.eclipse.debug.ui" default="export" basedir=".">
+
+ <!-- Set the timestamp and important properties -->
+ <target name="init">
+ <tstamp/>
+ <property name="destdir" value="../../plugin-export" />
+ <property name="dest" value="${destdir}/org.eclipse.debug.ui" />
+ </target>
+
+ <!-- Create the jar of .class files, and copy other important files to export dir -->
+ <target name="export" depends="init">
+ <mkdir dir="${destdir}" />
+ <delete dir="${dest}" />
+ <mkdir dir="${dest}" />
+ <jar
+ jarfile="${dest}/dtui.jar"
+ basedir="bin"
+ />
+ <copy file="plugin.xml" todir="${dest}"/>
+ <copy file="plugin.jars" todir="${dest}"/>
+ <copy file="plugin.properties" todir="${dest}"/>
+ <copy file=".classpath" todir="${dest}"/>
+ <copy file=".options" todir="${dest}"/>
+ <copy todir="${dest}/icons">
+ <fileset dir="icons" />
+ </copy>
+ </target>
+
+</project>
diff --git a/org.eclipse.debug.ui/icons/full/clcl16/clear_co.gif b/org.eclipse.debug.ui/icons/full/clcl16/clear_co.gif
new file mode 100644
index 000000000..255832653
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/clcl16/clear_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/clcl16/disconnect_co.gif b/org.eclipse.debug.ui/icons/full/clcl16/disconnect_co.gif
new file mode 100644
index 000000000..57cffb229
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/clcl16/disconnect_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/clcl16/qnames_co.gif b/org.eclipse.debug.ui/icons/full/clcl16/qnames_co.gif
new file mode 100644
index 000000000..a765a7b18
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/clcl16/qnames_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/clcl16/rem_all_co.gif b/org.eclipse.debug.ui/icons/full/clcl16/rem_all_co.gif
new file mode 100644
index 000000000..2c069ab3f
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/clcl16/rem_all_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/clcl16/rem_co.gif b/org.eclipse.debug.ui/icons/full/clcl16/rem_co.gif
new file mode 100644
index 000000000..12a9167c5
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/clcl16/rem_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/clcl16/resume_co.gif b/org.eclipse.debug.ui/icons/full/clcl16/resume_co.gif
new file mode 100644
index 000000000..2088548a4
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/clcl16/resume_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/clcl16/stepinto_co.gif b/org.eclipse.debug.ui/icons/full/clcl16/stepinto_co.gif
new file mode 100644
index 000000000..cc1378e0e
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/clcl16/stepinto_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/clcl16/stepover_co.gif b/org.eclipse.debug.ui/icons/full/clcl16/stepover_co.gif
new file mode 100644
index 000000000..5e24fb9b8
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/clcl16/stepover_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/clcl16/stepreturn_co.gif b/org.eclipse.debug.ui/icons/full/clcl16/stepreturn_co.gif
new file mode 100644
index 000000000..6081cba13
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/clcl16/stepreturn_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/clcl16/suspend_co.gif b/org.eclipse.debug.ui/icons/full/clcl16/suspend_co.gif
new file mode 100644
index 000000000..457893c1b
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/clcl16/suspend_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/clcl16/terminate_co.gif b/org.eclipse.debug.ui/icons/full/clcl16/terminate_co.gif
new file mode 100644
index 000000000..cebc768a1
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/clcl16/terminate_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/clcl16/tnames_co.gif b/org.eclipse.debug.ui/icons/full/clcl16/tnames_co.gif
new file mode 100644
index 000000000..1bbbb95c8
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/clcl16/tnames_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/ctool16/debug_exc.gif b/org.eclipse.debug.ui/icons/full/ctool16/debug_exc.gif
new file mode 100644
index 000000000..3052a80cd
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/ctool16/debug_exc.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/ctool16/run_exc.gif b/org.eclipse.debug.ui/icons/full/ctool16/run_exc.gif
new file mode 100644
index 000000000..8174dade2
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/ctool16/run_exc.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/cview16/breakpoint_view.gif b/org.eclipse.debug.ui/icons/full/cview16/breakpoint_view.gif
new file mode 100644
index 000000000..3348eb559
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/cview16/breakpoint_view.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/cview16/console_view.gif b/org.eclipse.debug.ui/icons/full/cview16/console_view.gif
new file mode 100644
index 000000000..a8a06e6e5
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/cview16/console_view.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/cview16/debug_persp.gif b/org.eclipse.debug.ui/icons/full/cview16/debug_persp.gif
new file mode 100644
index 000000000..4056c8a2f
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/cview16/debug_persp.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/cview16/debug_view.gif b/org.eclipse.debug.ui/icons/full/cview16/debug_view.gif
new file mode 100644
index 000000000..6ce053259
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/cview16/debug_view.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/cview16/process_view.gif b/org.eclipse.debug.ui/icons/full/cview16/process_view.gif
new file mode 100644
index 000000000..5f369755a
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/cview16/process_view.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/cview16/variable_view.gif b/org.eclipse.debug.ui/icons/full/cview16/variable_view.gif
new file mode 100644
index 000000000..6f18e7dd5
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/cview16/variable_view.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/cview16/watchlist_view.gif b/org.eclipse.debug.ui/icons/full/cview16/watchlist_view.gif
new file mode 100644
index 000000000..8772833c0
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/cview16/watchlist_view.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/clear_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/clear_co.gif
new file mode 100644
index 000000000..d873c49b8
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dlcl16/clear_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/disconnect_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/disconnect_co.gif
new file mode 100644
index 000000000..cb53f4b61
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dlcl16/disconnect_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/qnames_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/qnames_co.gif
new file mode 100644
index 000000000..519d6d1eb
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dlcl16/qnames_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/rem_all_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/rem_all_co.gif
new file mode 100644
index 000000000..e0cfa6dc7
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dlcl16/rem_all_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/rem_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/rem_co.gif
new file mode 100644
index 000000000..7e0ad4aed
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dlcl16/rem_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/resume_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/resume_co.gif
new file mode 100644
index 000000000..a281bc119
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dlcl16/resume_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/stepinto_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/stepinto_co.gif
new file mode 100644
index 000000000..7be251906
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dlcl16/stepinto_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/stepover_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/stepover_co.gif
new file mode 100644
index 000000000..02cf5d3b9
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dlcl16/stepover_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/stepreturn_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/stepreturn_co.gif
new file mode 100644
index 000000000..644da8ec8
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dlcl16/stepreturn_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/suspend_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/suspend_co.gif
new file mode 100644
index 000000000..47f329936
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dlcl16/suspend_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/terminate_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/terminate_co.gif
new file mode 100644
index 000000000..bf1546066
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dlcl16/terminate_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dlcl16/tnames_co.gif b/org.eclipse.debug.ui/icons/full/dlcl16/tnames_co.gif
new file mode 100644
index 000000000..764201b37
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dlcl16/tnames_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dtool16/debug_exc.gif b/org.eclipse.debug.ui/icons/full/dtool16/debug_exc.gif
new file mode 100644
index 000000000..23dfce0ca
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dtool16/debug_exc.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/dtool16/run_exc.gif b/org.eclipse.debug.ui/icons/full/dtool16/run_exc.gif
new file mode 100644
index 000000000..087dd571a
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/dtool16/run_exc.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/clear_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/clear_co.gif
new file mode 100644
index 000000000..6faf8d66f
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/clear_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/disconnect_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/disconnect_co.gif
new file mode 100644
index 000000000..11de2e14b
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/disconnect_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/qnames_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/qnames_co.gif
new file mode 100644
index 000000000..12e1f7be7
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/qnames_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/rem_all_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/rem_all_co.gif
new file mode 100644
index 000000000..33908b126
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/rem_all_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/rem_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/rem_co.gif
new file mode 100644
index 000000000..310510ee5
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/rem_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/resume_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/resume_co.gif
new file mode 100644
index 000000000..053738cf6
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/resume_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/stepinto_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/stepinto_co.gif
new file mode 100644
index 000000000..951fb909a
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/stepinto_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/stepover_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/stepover_co.gif
new file mode 100644
index 000000000..d84e6106c
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/stepover_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/stepreturn_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/stepreturn_co.gif
new file mode 100644
index 000000000..7f9a6acbe
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/stepreturn_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/suspend_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/suspend_co.gif
new file mode 100644
index 000000000..c570ac0d2
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/suspend_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/terminate_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/terminate_co.gif
new file mode 100644
index 000000000..37f8d22d6
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/terminate_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/elcl16/tnames_co.gif b/org.eclipse.debug.ui/icons/full/elcl16/tnames_co.gif
new file mode 100644
index 000000000..c63f59ece
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/elcl16/tnames_co.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/etool16/debug_exc.gif b/org.eclipse.debug.ui/icons/full/etool16/debug_exc.gif
new file mode 100644
index 000000000..6ce053259
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/etool16/debug_exc.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/etool16/run_exc.gif b/org.eclipse.debug.ui/icons/full/etool16/run_exc.gif
new file mode 100644
index 000000000..95f87eaa0
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/etool16/run_exc.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/breakpoint_view.gif b/org.eclipse.debug.ui/icons/full/eview16/breakpoint_view.gif
new file mode 100644
index 000000000..b5759b8ca
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/eview16/breakpoint_view.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/console_view.gif b/org.eclipse.debug.ui/icons/full/eview16/console_view.gif
new file mode 100644
index 000000000..e69e4e1f8
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/eview16/console_view.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/debug_persp.gif b/org.eclipse.debug.ui/icons/full/eview16/debug_persp.gif
new file mode 100644
index 000000000..a1dabed26
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/eview16/debug_persp.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/debug_view.gif b/org.eclipse.debug.ui/icons/full/eview16/debug_view.gif
new file mode 100644
index 000000000..3052a80cd
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/eview16/debug_view.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/process_view.gif b/org.eclipse.debug.ui/icons/full/eview16/process_view.gif
new file mode 100644
index 000000000..aba331729
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/eview16/process_view.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/variable_view.gif b/org.eclipse.debug.ui/icons/full/eview16/variable_view.gif
new file mode 100644
index 000000000..b41abaaf3
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/eview16/variable_view.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/eview16/watchlist_view.gif b/org.eclipse.debug.ui/icons/full/eview16/watchlist_view.gif
new file mode 100644
index 000000000..c5eef02db
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/eview16/watchlist_view.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/brkp_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/brkp_obj.gif
new file mode 100644
index 000000000..6ed79edf6
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/obj16/brkp_obj.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/brkpd_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/brkpd_obj.gif
new file mode 100644
index 000000000..f03ecc46f
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/obj16/brkpd_obj.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/debugt_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/debugt_obj.gif
new file mode 100644
index 000000000..d139cde9d
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/obj16/debugt_obj.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/debugtt_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/debugtt_obj.gif
new file mode 100644
index 000000000..e9b7ecec6
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/obj16/debugtt_obj.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/expression_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/expression_obj.gif
new file mode 100644
index 000000000..72ccf84c0
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/obj16/expression_obj.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/ldebug_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/ldebug_obj.gif
new file mode 100644
index 000000000..93105b34f
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/obj16/ldebug_obj.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/lrun_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/lrun_obj.gif
new file mode 100644
index 000000000..2123a447e
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/obj16/lrun_obj.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/osprc_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/osprc_obj.gif
new file mode 100644
index 000000000..615fb4071
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/obj16/osprc_obj.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/osprct_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/osprct_obj.gif
new file mode 100644
index 000000000..da227b39b
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/obj16/osprct_obj.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/stckframe_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/stckframe_obj.gif
new file mode 100644
index 000000000..b9783c814
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/obj16/stckframe_obj.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/thread_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/thread_obj.gif
new file mode 100644
index 000000000..fb5175f5c
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/obj16/thread_obj.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/threads_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/threads_obj.gif
new file mode 100644
index 000000000..7e4a43cd7
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/obj16/threads_obj.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/obj16/threadt_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/threadt_obj.gif
new file mode 100644
index 000000000..c753c2f01
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/obj16/threadt_obj.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/ovr16/stcksync_ov.gif b/org.eclipse.debug.ui/icons/full/ovr16/stcksync_ov.gif
new file mode 100644
index 000000000..9baffaea2
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/ovr16/stcksync_ov.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/wizban/debug_wiz.gif b/org.eclipse.debug.ui/icons/full/wizban/debug_wiz.gif
new file mode 100644
index 000000000..9c8fc06a6
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/wizban/debug_wiz.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/icons/full/wizban/run_wiz.gif b/org.eclipse.debug.ui/icons/full/wizban/run_wiz.gif
new file mode 100644
index 000000000..777526c62
--- /dev/null
+++ b/org.eclipse.debug.ui/icons/full/wizban/run_wiz.gif
Binary files differ
diff --git a/org.eclipse.debug.ui/plugin.jars b/org.eclipse.debug.ui/plugin.jars
new file mode 100644
index 000000000..2b4b80cb5
--- /dev/null
+++ b/org.eclipse.debug.ui/plugin.jars
@@ -0,0 +1 @@
+dtui.jar=Eclipse Debug UI \ No newline at end of file
diff --git a/org.eclipse.debug.ui/plugin.properties b/org.eclipse.debug.ui/plugin.properties
new file mode 100644
index 000000000..d6d32c305
--- /dev/null
+++ b/org.eclipse.debug.ui/plugin.properties
@@ -0,0 +1,34 @@
+ DebugPerspective.name=Debug
+
+ LauncherPropertyPage.name=Launcher
+
+ DebugView.name=Debug
+ ProcessesView.name=Processes
+ BreakpointsView.name=Breakpoints
+ VariablesView.name=Variables
+ InspectorView.name=Inspector
+ ConsoleView.name=Console
+
+ DebugPreferencePage.name=Debug
+ ConsolePreferencePage.name=Console
+
+ DebugActionSet.label=Run/Debug
+
+ DebugMenu.label=&Debug
+
+ RunAction.label=Run
+ RunAction.tooltip=Run
+ DebugAction.label=Debug
+ DebugAction.tooltip=Debug
+ StepIntoAction.label=Step &Into@F5
+ StepIntoAction.tooltip=Step into
+ StepOverAction.label=Step &Over@F6
+ StepOverAction.tooltip=Step over
+ StepReturnAction.label=Step Re&turn@F7
+ StepReturnAction.tooltip=Run to return
+ SuspendAction.label=&Suspend
+ SuspendAction.tooltip=Suspend
+ ResumeAction.label=&Resume@F8
+ ResumeAction.tooltip=Resume
+ RelaunchLastAction.label=Relaunch &Last@F10
+ RelaunchLastAction.tooltip=Relaunch last \ No newline at end of file
diff --git a/org.eclipse.debug.ui/plugin.xml b/org.eclipse.debug.ui/plugin.xml
new file mode 100644
index 000000000..af985cd81
--- /dev/null
+++ b/org.eclipse.debug.ui/plugin.xml
@@ -0,0 +1,189 @@
+<?xml version="1.0"?>
+
+<plugin
+ name = "DebugToolsUI"
+ id = "org.eclipse.debug.ui"
+ version = "0.105.0"
+ vendor-name = "OTI"
+ class="org.eclipse.debug.internal.ui.DebugUIPlugin">
+
+<requires>
+ <import plugin="org.apache.xerces"/>
+ <import plugin="org.eclipse.core.resources"/>
+ <import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.debug.core"/>
+</requires>
+
+<runtime>
+ <library name="dtui.jar" >
+ <export name= "*" />
+ </library>
+</runtime>
+
+<extension-point name="Debug Model Presentation" id="debugModelPresentations"/>
+
+<extension
+ point="org.eclipse.ui.perspectives">
+ <perspective
+ id="org.eclipse.debug.ui.DebugPerspective"
+ name="%DebugPerspective.name"
+ class="org.eclipse.debug.internal.ui.DebugPerspective"
+ icon="icons/full/cview16/debug_persp.gif">
+ </perspective>
+</extension>
+
+<extension point = "org.eclipse.ui.propertyPages">
+ <page
+ id = "org.eclipse.debug.internal.ui.LauncherPropertyPage"
+ class="org.eclipse.debug.internal.ui.LauncherPropertyPage"
+ objectClass="org.eclipse.core.resources.IProject"
+ name= "%LauncherPropertyPage.name">
+ </page>
+ <page
+ id = "org.eclipse.debug.internal.ui.LauncherPropertyPage"
+ class ="org.eclipse.debug.internal.ui.LauncherPropertyPage"
+ objectClass="org.eclipse.jdt.core.IJavaProject"
+ name= "%LauncherPropertyPage.name">
+ </page>
+</extension>
+
+<extension point="org.eclipse.ui.views">
+ <category
+ id="org.eclipse.debug.ui"
+ name="&amp;Debug">
+ </category>
+
+ <view
+ id="org.eclipse.debug.ui.DebugView"
+ name="%DebugView.name"
+ category="org.eclipse.debug.ui"
+ class="org.eclipse.debug.internal.ui.DebugView"
+ icon="icons/full/eview16/debug_view.gif">
+ </view>
+ <view
+ id="org.eclipse.debug.ui.ProcessView"
+ name="%ProcessesView.name"
+ category="org.eclipse.debug.ui"
+ class="org.eclipse.debug.internal.ui.LaunchesView"
+ icon="icons/full/eview16/process_view.gif">
+ </view>
+ <view
+ id="org.eclipse.debug.ui.BreakpointView"
+ name="%BreakpointsView.name"
+ category="org.eclipse.debug.ui"
+ class="org.eclipse.debug.internal.ui.BreakpointsView"
+ icon="icons/full/eview16/breakpoint_view.gif">
+ </view>
+ <view
+ id="org.eclipse.debug.ui.VariableView"
+ name="%VariablesView.name"
+ category="org.eclipse.debug.ui"
+ class="org.eclipse.debug.internal.ui.VariablesView"
+ icon="icons/full/eview16/variable_view.gif">
+ </view>
+ <view
+ id="org.eclipse.debug.ui.InspectorView"
+ name="%InspectorView.name"
+ category="org.eclipse.debug.ui"
+ class="org.eclipse.debug.internal.ui.InspectorView"
+ icon="icons/full/eview16/watchlist_view.gif">
+ </view>
+ <view
+ id="org.eclipse.debug.ui.ConsoleView"
+ name="%ConsoleView.name"
+ category="org.eclipse.debug.ui"
+ class="org.eclipse.debug.internal.ui.ConsoleView"
+ icon="icons/full/eview16/console_view.gif">
+ </view>
+</extension>
+
+<extension point = "org.eclipse.ui.preferencePages">
+ <page
+ id = "org.eclipse.debug.ui.DebugPreferencePage"
+ class="org.eclipse.debug.internal.ui.DebugPreferencePage"
+ name= "%DebugPreferencePage.name">
+ </page>
+ <page
+ id = "org.eclipse.debug.ui.ConsolePreferencePage"
+ class="org.eclipse.debug.internal.ui.ConsolePreferencePage"
+ name= "%ConsolePreferencePage.name"
+ category= "org.eclipse.debug.ui.DebugPreferencePage">
+ </page>
+</extension>
+
+<extension point = "org.eclipse.ui.actionSets">
+ <actionSet id="org.eclipse.debug.ui.debugActionSet"
+ label="%DebugActionSet.label"
+ visible="false">
+ <menu
+ id="org.eclipse.debug.ui.DebugMenu"
+ label="%DebugMenu.label">
+ <separator name="stepGroup"/>
+ <separator name="relaunchGroup"/>
+ </menu>
+ <action id="org.eclipse.debug.internal.ui.RunDropDownAction"
+ toolbarPath="debug"
+ pulldown="true"
+ label="%RunAction.label"
+ tooltip="%RunAction.tooltip"
+ icon="icons/full/ctool16/run_exc.gif"
+ class="org.eclipse.debug.internal.ui.RunDropDownAction">
+ </action>
+ <action id="org.eclipse.debug.internal.ui.DebugDropDownAction"
+ toolbarPath="debug"
+ pulldown="true"
+ label="%DebugAction.label"
+ tooltip="%DebugAction.tooltip"
+ icon="icons/full/ctool16/debug_exc.gif"
+ class="org.eclipse.debug.internal.ui.DebugDropDownAction">
+ </action>
+ <action id="org.eclipse.debug.internal.ui.StepReturnActionDelegate"
+ menubarPath="org.eclipse.debug.ui.DebugMenu/stepGroup"
+ label="%StepReturnAction.label"
+ tooltip="%StepReturnAction.tooltip"
+ icon="icons/full/clcl16/stepreturn_co.gif"
+ class="org.eclipse.debug.internal.ui.StepReturnActionDelegate">
+ </action>
+ <action id="org.eclipse.debug.internal.ui.StepOverActionDelegate"
+ menubarPath="org.eclipse.debug.ui.DebugMenu/stepGroup"
+ label="%StepOverAction.label"
+ tooltip="%StepOverAction.tooltip"
+ icon="icons/full/clcl16/stepover_co.gif"
+ class="org.eclipse.debug.internal.ui.StepOverActionDelegate">
+ </action>
+ <action id="org.eclipse.debug.internal.ui.StepIntoActionDelegate"
+ menubarPath="org.eclipse.debug.ui.DebugMenu/stepGroup"
+ label="%StepIntoAction.label"
+ tooltip="%StepIntoAction.tooltip"
+ icon="icons/full/clcl16/stepinto_co.gif"
+ class="org.eclipse.debug.internal.ui.StepIntoActionDelegate">
+ </action>
+ <action id="org.eclipse.debug.internal.ui.SuspendActionDelegate"
+ menubarPath="org.eclipse.debug.ui.DebugMenu/stepGroup"
+ label="%SuspendAction.label"
+ tooltip="%SuspendAction.tooltip"
+ icon="icons/full/clcl16/suspend_co.gif"
+ class="org.eclipse.debug.internal.ui.SuspendActionDelegate">
+ </action>
+ <action id="org.eclipse.debug.internal.ui.ResumeActionDelegate"
+ menubarPath="org.eclipse.debug.ui.DebugMenu/stepGroup"
+ label="%ResumeAction.label"
+ tooltip="%ResumeAction.tooltip"
+ icon="icons/full/clcl16/resume_co.gif"
+ class="org.eclipse.debug.internal.ui.ResumeActionDelegate">
+ </action>
+ <action id="org.eclipse.debug.internal.ui.RelaunchLastAction"
+ menubarPath="org.eclipse.debug.ui.DebugMenu/relaunchGroup"
+ label="%RelaunchLastAction.label"
+ tooltip="%RelaunchLastAction.tooltip"
+ class="org.eclipse.debug.internal.ui.RelaunchLastAction">
+ </action>
+ </actionSet>
+</extension>
+
+<extension id="instructionPointer" point="org.eclipse.core.resources.markers">
+ <super type="org.eclipse.core.resources.textmarker"/>
+ <persistent value="false"/>
+</extension>
+
+</plugin>
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugView.java
new file mode 100644
index 000000000..37099a6b2
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugView.java
@@ -0,0 +1,160 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.ui.IDebugModelPresentation; import org.eclipse.debug.ui.IDebugViewAdapter; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart;
+
+/**
+ * Functionality common to views in the debugger
+ */
+
+public abstract class AbstractDebugView extends ViewPart implements IDebugViewAdapter, IPartListener {
+
+ protected final static String TITLE_TOOLTIPTEXT= "title_toolTipText";
+
+ protected StructuredViewer fViewer = null;
+
+ /**
+ * @see IAdaptable
+ */
+ public Object getAdapter(Class adapter) {
+ if (adapter == IDebugViewAdapter.class) {
+ return this;
+ }
+ return super.getAdapter(adapter);
+ }
+
+
+ /**
+ * @see IViewPart
+ */
+ public void init(IViewSite site) throws PartInitException {
+ super.init(site);
+ getSite().getPage().addPartListener(this);
+ }
+
+ public void dispose() {
+ getSite().getPage().removePartListener(this);
+ super.dispose();
+ }
+
+ /**
+ * @see IDebugViewAdapter
+ */
+ public StructuredViewer getViewer() {
+ return fViewer;
+ }
+
+ /**
+ * @see IDebugViewAdapter
+ */
+ public IDebugModelPresentation getPresentation(String id) {
+ return ((DelegatingModelPresentation)fViewer.getLabelProvider()).getPresentation(id);
+ }
+
+ protected void createContextMenu(Control menuControl) {
+ MenuManager menuMgr= new MenuManager("#PopUp");
+ menuMgr.setRemoveAllWhenShown(true);
+ menuMgr.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager mgr) {
+ fillContextMenu(mgr);
+ }
+ });
+ Menu menu= menuMgr.createContextMenu(menuControl);
+ menuControl.setMenu(menu);
+
+ // register the context menu such that other plugins may contribute to it
+ getSite().registerContextMenu(menuMgr, fViewer);
+ }
+
+ /**
+ * Configures the toolBar
+ */
+ protected void initializeToolBar() {
+ final IToolBarManager tbm= getViewSite().getActionBars().getToolBarManager();
+ configureToolBar(tbm);
+ getViewSite().getActionBars().updateActionBars();
+
+ // this is in a runnable to be run after this view's pane
+ // is created
+ Runnable r = new Runnable() {
+ public void run() {
+ IContributionItem[] items = tbm.getItems();
+ if (items != null) {
+ for (int i = 0; i < items.length; i++) {
+ if (items[i] instanceof ActionContributionItem) {
+ IAction action = ((ActionContributionItem)items[i]).getAction();
+ if (action.isChecked()) {
+ action.run();
+ }
+ }
+ }
+ }
+ }
+ };
+ IWorkbenchWindow w = DebugUIPlugin.getActiveWorkbenchWindow();
+ if (w != null) {
+ w.getShell().getDisplay().asyncExec(r);
+ }
+ }
+
+ /**
+ * @see IWorkbenchPart
+ */
+ public void setFocus() {
+ fViewer.getControl().setFocus();
+ }
+
+ /**
+ * Returns the title tooltip for the View icon of this view part.
+ */
+ protected String getTitleToolTipText(String prefix) {
+ return DebugUIUtils.getResourceString(prefix + TITLE_TOOLTIPTEXT);
+ }
+
+ protected abstract void fillContextMenu(IMenuManager mgr);
+
+ protected abstract void configureToolBar(IToolBarManager tbm);
+ /**
+ * @see IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partOpened(IWorkbenchPart arg0) {
+ }
+
+ /**
+ * @see IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partDeactivated(IWorkbenchPart arg0) {
+ }
+
+ /**
+ * @see IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partClosed(IWorkbenchPart arg0) {
+ }
+
+ /**
+ * @see IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partBroughtToTop(IWorkbenchPart arg0) {
+ }
+
+ /**
+ * @see IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partActivated(IWorkbenchPart arg0) {
+ }
+
+ /**
+ * @see WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+ */
+ public void createPartControl(Composite arg0) {
+ }
+
+
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AddToInspectorAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AddToInspectorAction.java
new file mode 100644
index 000000000..4f01ff433
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AddToInspectorAction.java
@@ -0,0 +1,37 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import java.util.Iterator;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IVariable;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+public class AddToInspectorAction extends InspectorAction {
+
+ private static final String PREFIX= "add_to_inspector_action.";
+
+ public AddToInspectorAction(ISelectionProvider sp) {
+ super(sp, DebugUIUtils.getResourceString(PREFIX + TEXT));
+ setToolTipText(DebugUIUtils.getResourceString(PREFIX + TOOL_TIP_TEXT));
+ setEnabled(!getStructuredSelection().isEmpty());
+ }
+
+ /**
+ * @see InspectorAction
+ */
+ protected void doAction(InspectorView view) throws DebugException {
+ IStructuredSelection s = getStructuredSelection();
+ Iterator vars = s.iterator();
+ while (vars.hasNext()) {
+ IVariable var = (IVariable)vars.next();
+ DebugUITools.inspect(var.getName(), var.getValue());
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BasicContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BasicContentProvider.java
new file mode 100644
index 000000000..f21942d17
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BasicContentProvider.java
@@ -0,0 +1,90 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.debug.core.DebugEvent; import org.eclipse.jface.viewers.*; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.widgets.Control;
+
+public abstract class BasicContentProvider implements IStructuredContentProvider {
+
+ protected StructuredViewer fViewer;
+
+ /**
+ * @see IContentProvider#inputChanged
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ fViewer= (StructuredViewer) viewer;
+ }
+
+ /**
+ * @see Display.asyncExec(Runnable)
+ */
+ protected void asyncExec(Runnable r) {
+ if (fViewer != null) {
+ Control ctrl= fViewer.getControl();
+ if (ctrl != null) {
+ ctrl.getDisplay().asyncExec(r);
+ }
+ }
+ }
+
+ /**
+ * Refreshes the viewer - must be called in UI thread.
+ */
+ protected void refresh() {
+ if (fViewer != null) {
+ fViewer.refresh();
+ }
+ }
+
+ /**
+ * Refresh the given element in the viewer - must be called in UI thread.
+ */
+ protected void refresh(Object element) {
+ if (fViewer != null) {
+ fViewer.refresh(element);
+ }
+ }
+
+ /**
+ * @see IDebugEventListener
+ */
+ public void handleDebugEvent(final DebugEvent event) {
+ Object element= event.getSource();
+ if (element == null) {
+ return;
+ }
+ Runnable r= new Runnable() {
+ public void run() {
+ doHandleDebugEvent(event);
+ }
+ };
+
+ asyncExec(r);
+ }
+
+ /**
+ * @see ITreeContentProvider
+ */
+ public Object[] getChildren(final Object parent) {
+ final Object[][] temp= new Object[1][];
+ Runnable runnable= new Runnable() {
+ public void run() {
+ temp[0]= doGetChildren(parent);
+ }
+ };
+ BusyIndicator.showWhile(fViewer.getControl().getDisplay(), runnable);
+ return temp[0];
+ }
+
+ /**
+ * Performs an update based on the event
+ */
+ protected abstract void doHandleDebugEvent(DebugEvent event);
+
+ protected abstract Object[] doGetChildren(Object parent);
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BreakpointsContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BreakpointsContentProvider.java
new file mode 100644
index 000000000..cd198ccc0
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BreakpointsContentProvider.java
@@ -0,0 +1,92 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IMarkerDelta;
+import org.eclipse.debug.core.*;
+import org.eclipse.jface.viewers.TableViewer;
+
+/**
+ * Provides the contents for a breakpoints viewer
+ */
+public class BreakpointsContentProvider extends BasicContentProvider implements IBreakpointListener {
+
+ /**
+ * Creates this content provider
+ */
+ public BreakpointsContentProvider() {
+ DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this);
+ }
+
+ /**
+ * Returns all the breakpoint markers in the current open workspace
+ */
+ public Object[] getElements(Object parent) {
+ return ((IBreakpointManager) parent).getBreakpoints();
+ }
+
+ /**
+ * @see IContentProvider
+ */
+ public void dispose() {
+ DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(this);
+ }
+
+ /**
+ * @see IBreakpointListener
+ */
+ public void breakpointAdded(final IMarker breakpoint) {
+ if (breakpoint.exists()) {
+ asyncExec(new Runnable() {
+ public void run() {
+ ((TableViewer)fViewer).add(breakpoint);
+ }
+ });
+ }
+ }
+
+ /**
+ * @see IBreakpointListener
+ */
+ public void breakpointRemoved(final IMarker breakpoint, IMarkerDelta delta) {
+ asyncExec(new Runnable() {
+ public void run() {
+ ((TableViewer)fViewer).remove(breakpoint);
+ }
+ });
+ }
+
+ /**
+ * @see IBreakpointListener
+ */
+ public void breakpointChanged(final IMarker breakpoint, IMarkerDelta delta) {
+ if (breakpoint.exists()) {
+ asyncExec(new Runnable() {
+ public void run() {
+ refresh(breakpoint);
+ }
+ });
+ }
+ }
+
+ /**
+ * @see BasicContentProvider#doHandleDebug(Event)
+ */
+ protected void doHandleDebugEvent(DebugEvent event) {
+ //not a registered debug event listener
+ }
+
+ /**
+ * @see BasicContentProvider#doGetChildren(Object)
+ */
+ protected Object[] doGetChildren(Object parent) {
+ //not a tree content provider
+ return null;
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BreakpointsView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BreakpointsView.java
new file mode 100644
index 000000000..c7d17c49f
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/BreakpointsView.java
@@ -0,0 +1,254 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IBreakpointManager;
+import org.eclipse.debug.ui.IDebugModelPresentation;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.*;
+import org.eclipse.ui.model.WorkbenchViewerSorter;
+
+/**
+ * This view shows the breakpoints registered with the breakpoint manager
+ */
+public class BreakpointsView extends AbstractDebugView implements ISelectionChangedListener, IDoubleClickListener {
+
+ protected final static String PREFIX= "breakpoints_view.";
+
+ /**
+ * The various actions of the context menu of this view
+ */
+ private OpenMarkerAction fOpenMarkerAction;
+ private RemoveBreakpointAction fRemoveBreakpointAction;
+ private RemoveAllBreakpointsAction fRemoveAllBreakpointsAction;
+ private EnableDisableBreakpointAction fEnableDisableBreakpointAction;
+ private ShowQualifiedAction fShowQualifiedNamesAction;
+
+ /**
+ * @see IWorkbenchPart
+ */
+ public void createPartControl(Composite parent) {
+ fViewer= new TableViewer(parent, SWT.MULTI| SWT.H_SCROLL | SWT.V_SCROLL);
+ fViewer.setContentProvider(new BreakpointsContentProvider());
+ fViewer.setLabelProvider(new DelegatingModelPresentation());
+ fViewer.setSorter(new WorkbenchViewerSorter());
+ initializeActions();
+ initializeToolBar();
+
+ createContextMenu(((TableViewer)fViewer).getTable());
+
+ fViewer.setInput(DebugPlugin.getDefault().getBreakpointManager());
+ fViewer.addSelectionChangedListener(this);
+ fViewer.addDoubleClickListener(this);
+ fViewer.getControl().addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent e) {
+ handleKeyPressed(e);
+ }
+ });
+
+ setTitleToolTip(getTitleToolTipText(PREFIX));
+ }
+
+ /**
+ * @see IWorkbenchPart
+ */
+ public void dispose() {
+ super.dispose();
+ if (fViewer != null) {
+ fViewer.removeSelectionChangedListener(this);
+ fViewer.removeDoubleClickListener(this);
+ }
+ cleanupActions();
+ }
+
+ /**
+ * Initializes the actions of this view
+ */
+ protected void initializeActions() {
+ fRemoveBreakpointAction= new RemoveBreakpointAction(fViewer);
+ fRemoveBreakpointAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_REMOVE));
+ fRemoveBreakpointAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_REMOVE));
+ fRemoveBreakpointAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_REMOVE));
+
+ fRemoveAllBreakpointsAction= new RemoveAllBreakpointsAction();
+ fRemoveAllBreakpointsAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_REMOVE_ALL));
+ fRemoveAllBreakpointsAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_REMOVE_ALL));
+ fRemoveAllBreakpointsAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_REMOVE_ALL));
+ boolean enable= DebugPlugin.getDefault().getBreakpointManager().getBreakpoints().length == 0 ? false : true;
+ fRemoveAllBreakpointsAction.setEnabled(enable);
+
+ fShowQualifiedNamesAction = new ShowQualifiedAction(fViewer);
+ fShowQualifiedNamesAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_QUALIFIED_NAMES));
+ fShowQualifiedNamesAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_QUALIFIED_NAMES));
+ fShowQualifiedNamesAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_QUALIFIED_NAMES));
+ fShowQualifiedNamesAction.setChecked(true);
+
+ fOpenMarkerAction= new OpenBreakpointMarkerAction(fViewer);
+ ISharedImages images= DebugUIPlugin.getDefault().getWorkbench().getSharedImages();
+ fOpenMarkerAction.setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_OPEN_MARKER));
+
+ fEnableDisableBreakpointAction= new EnableDisableBreakpointAction(fViewer);
+ DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(fEnableDisableBreakpointAction);
+ DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(fRemoveAllBreakpointsAction);
+ }
+
+ /**
+ * Cleans up the actions when this part is disposed
+ */
+ protected void cleanupActions() {
+ if (fEnableDisableBreakpointAction != null) {
+ DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(fEnableDisableBreakpointAction);
+ }
+ if (fRemoveAllBreakpointsAction != null) {
+ DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(fRemoveAllBreakpointsAction);
+ }
+ }
+
+ /**
+ * Opens a marker for the current selection.
+ * An editor will be opened if <code>open</code> is <code>true</code>
+ * This will only occur for selections containing a single breakpoint.
+ */
+ public void openMarkerForCurrentSelection(boolean open) {
+ IStructuredSelection selection= (IStructuredSelection) fViewer.getSelection();
+ if (selection.size() != 1) {
+ //Single selection only
+ return;
+ }
+ //Get the selected marker
+ IMarker breakpoint= (IMarker) selection.getFirstElement();
+ if (!breakpoint.exists()) {
+ return;
+ }
+ IWorkbenchWindow dwindow= getSite().getWorkbenchWindow();
+ IWorkbenchPage page= dwindow.getActivePage();
+ IEditorPart editor= getOpenEditor(breakpoint, page);
+ if (editor != null) {
+ editor.gotoMarker(breakpoint);
+ return;
+ }
+ if (!open) {
+ return;
+ }
+
+ openEditorForBreakpoint(breakpoint, page);
+ }
+
+ /**
+ * Open an editor for the breakpoint.
+ */
+ protected void openEditorForBreakpoint(IMarker breakpoint, IWorkbenchPage page) {
+ String id= getBreakpointManager().getModelIdentifier(breakpoint);
+ IDebugModelPresentation presentation= getPresentation(id);
+ IEditorInput input= presentation.getEditorInput(breakpoint);
+ String editorId= presentation.getEditorId(input, breakpoint);
+ if (input != null) {
+ try {
+ IEditorPart editor;
+ editor= page.openEditor(input, editorId);
+ editor.gotoMarker(breakpoint);
+ } catch (PartInitException e) {
+ DebugUIUtils.logError(e);
+ }
+ }
+ }
+
+ /**
+ * Adds items to the context menu
+ */
+ protected void fillContextMenu(IMenuManager menu) {
+ menu.add(new Separator(IDebugUIConstants.EMPTY_NAVIGATION_GROUP));
+ menu.add(new Separator(IDebugUIConstants.NAVIGATION_GROUP));
+ menu.add(fOpenMarkerAction);
+ menu.add(new Separator(IDebugUIConstants.EMPTY_BREAKPOINT_GROUP));
+ menu.add(new Separator(IDebugUIConstants.BREAKPOINT_GROUP));
+ menu.add(fEnableDisableBreakpointAction);
+ menu.add(fRemoveBreakpointAction);
+ menu.add(fRemoveAllBreakpointsAction);
+ menu.add(new Separator(IDebugUIConstants.EMPTY_RENDER_GROUP));
+ menu.add(new Separator(IDebugUIConstants.RENDER_GROUP));
+ menu.add(fShowQualifiedNamesAction);
+ menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ /**
+ * @see IDoubleClickListener
+ */
+ public void doubleClick(DoubleClickEvent event) {
+ openMarkerForCurrentSelection(true);
+ }
+
+ /**
+ * @see ISelectionChangedListener
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ if (event.getSelection().isEmpty()) {
+ return;
+ }
+ //FIXME: See PR 1G4CLUB
+ openMarkerForCurrentSelection(false);
+ }
+
+ /**
+ * Returns whether an editor is open on this breakpoint's
+ * resource
+ */
+ protected IEditorPart getOpenEditor(IMarker breakpoint, IWorkbenchPage page) {
+ //attempt to find the editor for the input
+ String id= getBreakpointManager().getModelIdentifier(breakpoint);
+ IDebugModelPresentation presentation= getPresentation(id);
+ IEditorInput editorElement = presentation.getEditorInput(breakpoint);
+ IEditorPart[] editors= page.getEditors();
+ for (int i= 0; i < editors.length; i++) {
+ IEditorPart part= editors[i];
+ if (part.getEditorInput().equals(editorElement)) {
+ page.bringToTop(part);
+ return part;
+ }
+ }
+ //did not find an open editor
+ return null;
+ }
+
+ /**
+ * Configures the toolBar
+ */
+ protected void configureToolBar(IToolBarManager tbm) {
+ tbm.add(fRemoveBreakpointAction);
+ tbm.add(fRemoveAllBreakpointsAction);
+ tbm.add(fOpenMarkerAction);
+ tbm.add(fShowQualifiedNamesAction);
+ }
+
+ /**
+ * Convience method to retrieve the breakpoint manager
+ */
+ protected IBreakpointManager getBreakpointManager() {
+ return DebugPlugin.getDefault().getBreakpointManager();
+ }
+
+ /**
+ * Handles key events in viewer. Specifically interested in
+ * the Delete key.
+ */
+ protected void handleKeyPressed(KeyEvent event) {
+ if (event.character == SWT.DEL && event.stateMask == 0
+ && fRemoveBreakpointAction.isEnabled()) {
+ fRemoveBreakpointAction.run();
+ }
+ }
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ChangeVariableValueAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ChangeVariableValueAction.java
new file mode 100644
index 000000000..e250f8b69
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ChangeVariableValueAction.java
@@ -0,0 +1,199 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import java.util.Iterator;
+
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IValueModification;
+import org.eclipse.debug.core.model.IVariable;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.TreeEditor;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.actions.SelectionProviderAction;
+
+/**
+ * Action for changing the value of primitives and <code>String</code> variables.
+ */
+public class ChangeVariableValueAction extends SelectionProviderAction {
+
+ // Fields for inline editing
+ protected Composite fComposite;
+ protected Tree fTree;
+ protected Label fEditorLabel;
+ protected Text fEditorText;
+ protected TreeEditor fTreeEditor;
+ protected IVariable fVariable;
+
+ private static final String PREFIX= "change_variable_value_action.";
+ private static final String ERROR= PREFIX + "error.";
+ private static final String DIALOG_TITLE= PREFIX + "dialog.title";
+ private static final String DIALOG_MESSAGE= PREFIX + "dialog.message";
+ private static final String DIALOG_INVALID= PREFIX + "dialog.invalid";
+
+ public ChangeVariableValueAction(Viewer viewer) {
+ super(viewer, DebugUIUtils.getResourceString(PREFIX + TEXT));
+ setDescription(DebugUIUtils.getResourceString(PREFIX + DESCRIPTION));
+ fTree= ((TreeViewer)viewer).getTree();
+ fTreeEditor= new TreeEditor(fTree);
+ }
+
+ /**
+ * Edit the variable value with an inline text editor.
+ */
+ protected void doActionPerformed(final IVariable variable) {
+ final Shell activeShell= DebugUIPlugin.getActiveWorkbenchWindow().getShell();
+
+ // If a previous edit is still in progress, finish it
+ if (fEditorText != null) {
+ saveChangesAndCleanup(fVariable, activeShell);
+ }
+ fVariable = variable;
+
+ // Use a Composite containing a Label and a Text. This allows us to edit just
+ // the value, while still showing the variable name.
+ fComposite = new Composite(fTree, SWT.NONE);
+ fComposite.setBackground(fTree.getBackground());
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ fComposite.setLayout(layout);
+
+ fEditorLabel = new Label(fComposite, SWT.LEFT);
+ fEditorLabel.setLayoutData(new GridData(GridData.FILL_VERTICAL));
+ fEditorText = new Text(fComposite, SWT.BORDER | SWT.SINGLE | SWT.LEFT);
+ fEditorText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL));
+ String valueString= "";
+ try {
+ valueString= fVariable.getValue().getValueString();
+ } catch (DebugException de) {
+ DebugUIUtils.errorDialog(activeShell, ERROR, de.getStatus());
+ }
+ TreeItem[] selectedItems = fTree.getSelection();
+ fTreeEditor.horizontalAlignment = SWT.LEFT;
+ fTreeEditor.grabHorizontal = true;
+ fTreeEditor.setEditor(fComposite, selectedItems[0]);
+
+ // This is a hack. There is no API on model presentation to get just the
+ // variable name, so we have to make do with just calling IVariable.getName()
+ String varName = "";
+ try {
+ varName = fVariable.getName();
+ } catch (DebugException de) {
+ }
+ fEditorLabel.setText(varName + "=");
+
+ fEditorText.setText(valueString);
+ fEditorText.selectAll();
+
+ fComposite.layout(true);
+ fComposite.setVisible(true);
+ fEditorText.setFocus();
+
+ // CR means commit the change, ESC means abort changing the value
+ fEditorText.addKeyListener(new KeyAdapter() {
+ public void keyReleased(KeyEvent event) {
+ if (event.character == SWT.CR) {
+ saveChangesAndCleanup(fVariable, activeShell);
+ }
+ if (event.character == SWT.ESC) {
+ cleanup();
+ }
+ }
+ });
+
+ // If the focus is lost, then act as if user hit CR and commit change
+ fEditorText.addFocusListener(new FocusAdapter() {
+ public void focusLost(FocusEvent fe) {
+ saveChangesAndCleanup(fVariable, activeShell);
+ }
+ });
+ }
+
+ /**
+ * If the new value validates, save it, and dispose the text widget,
+ * otherwise sound the system bell and leave the user in the editor.
+ */
+ protected void saveChangesAndCleanup(IVariable variable, Shell shell) {
+ String newValue= fEditorText.getText();
+ try {
+ if (!variable.verifyValue(newValue)) {
+ shell.getDisplay().beep();
+ return;
+ }
+ variable.setValue(newValue);
+ } catch (DebugException de) {
+ DebugUIUtils.errorDialog(shell, ERROR, de.getStatus());
+ }
+ cleanup();
+ }
+
+ /**
+ * Tidy up the widgets that were used
+ */
+ private void cleanup() {
+ if (fEditorText != null) {
+ fEditorText.dispose();
+ fEditorText = null;
+ fVariable = null;
+ fTreeEditor.setEditor(null, null);
+ fComposite.setVisible(false);
+ }
+ }
+
+ /**
+ * Updates the enabled state of this action based
+ * on the selection
+ */
+ protected void update(IStructuredSelection sel) {
+ Iterator iter= sel.iterator();
+ if (iter.hasNext()) {
+ Object object= iter.next();
+ if (object instanceof IValueModification) {
+ IValueModification varMod= (IValueModification)object;
+ if (!varMod.supportsValueModification()) {
+ setEnabled(false);
+ return;
+ }
+ setEnabled(!iter.hasNext());
+ return;
+ }
+ }
+ setEnabled(false);
+ }
+
+ /**
+ * @see Action
+ */
+ public void run() {
+ Iterator iterator= getStructuredSelection().iterator();
+ doActionPerformed((IVariable)iterator.next());
+ }
+
+ /**
+ * @see SelectionProviderAction
+ */
+ public void selectionChanged(IStructuredSelection sel) {
+ update(sel);
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ClearOutputAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ClearOutputAction.java
new file mode 100644
index 000000000..aa09aab18
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ClearOutputAction.java
@@ -0,0 +1,32 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.jface.action.Action;
+
+/**
+ * Clears the output of the selected launches
+ */
+public class ClearOutputAction extends Action {
+
+ private final static String PREFIX= "clear_output_action.";
+ private ConsoleViewer fConsoleViewer;
+
+ public ClearOutputAction(ConsoleViewer viewer) {
+ super(DebugUIUtils.getResourceString(PREFIX + TEXT));
+ fConsoleViewer= viewer;
+ setToolTipText(DebugUIUtils.getResourceString(PREFIX + TOOL_TIP_TEXT));
+ }
+
+ /**
+ * @see Action
+ */
+ public void run() {
+ fConsoleViewer.clearDocument();
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ColorManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ColorManager.java
new file mode 100644
index 000000000..8458b465a
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ColorManager.java
@@ -0,0 +1,33 @@
+package org.eclipse.debug.internal.ui;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Generic color manager.
+ */
+public class ColorManager {
+
+ protected Map fColorTable= new HashMap(10);
+
+ public Color getColor(RGB rgb) {
+ Color color= (Color) fColorTable.get(rgb);
+ if (color == null) {
+ color= new Color(Display.getCurrent(), rgb);
+ fColorTable.put(rgb, color);
+ }
+ return color;
+ }
+
+ public void dispose() {
+ Iterator e= fColorTable.values().iterator();
+ while (e.hasNext())
+ ((Color) e.next()).dispose();
+ }
+}
+
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleDocument.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleDocument.java
new file mode 100644
index 000000000..2ca659fa2
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleDocument.java
@@ -0,0 +1,433 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 1999, 2000
+ */
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.debug.core.*;
+import org.eclipse.debug.core.model.IProcess;
+import org.eclipse.debug.core.model.IStreamMonitor;
+import org.eclipse.debug.core.model.IStreamsProxy;
+import org.eclipse.jface.text.*;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Display;
+
+public class ConsoleDocument extends AbstractDocument implements IDebugEventListener {
+ public final static int fgMinimumSize= 500;
+ public final static int fgMinMaxRation= 5;
+
+ private boolean fClosed= false;
+ private int fMinSize= fgMinimumSize;
+ private int fMaxSize= fgMinimumSize * fgMinMaxRation;
+
+ protected IProcess fProcess;
+ private IStreamsProxy fProxy;
+ private int fLastStreamWriteEnd= 0;
+ private int fNewStreamWriteEnd= 0;
+ protected boolean fNeedsToStartReading= true;
+
+ public static final int OUT= 0;
+ public static final int ERR= 1;
+
+ protected List fStyleRanges= new ArrayList(2);
+
+ protected ConsoleViewer fConsoleViewer= null;
+
+ protected IStreamListener fSystemOutListener= new IStreamListener() {
+ public void streamAppended(String newText, IStreamMonitor monitor) {
+ systemOutAppended(newText);
+ }
+ };
+
+ protected IStreamListener fSystemErrListener= new IStreamListener() {
+ public void streamAppended(String newText, IStreamMonitor monitor) {
+ systemErrAppended(newText);
+ }
+ };
+
+ public ConsoleDocument(IProcess process) {
+ super();
+ fProcess= process;
+ setTextStore(new ConsoleOutputTextStore(fMaxSize));
+ setLineTracker(new DefaultLineTracker());
+
+ if (process != null) {
+ fProxy= process.getStreamsProxy();
+ }
+ if (process != null) {
+ DebugPlugin.getDefault().addDebugEventListener(this);
+ }
+ completeInitialization();
+ }
+
+ public void close() {
+ stopReading();
+ DebugPlugin.getDefault().removeDebugEventListener(this);
+ fClosed= true;
+ fStyleRanges= Collections.EMPTY_LIST;
+ set("");
+ }
+
+ /**
+ * If the buffer is longer than fMaxSize,
+ * trim it back to fMinSize.
+ */
+ protected void ensureSizeConstraints() {
+ if (getLength() > fMaxSize) {
+ replace(0, getLength() - fMinSize, "");
+ }
+ }
+
+ /**
+ * Fires the <code>DocumentEvent</code>, but also
+ * writes to the proxy if the user is entering input and
+ * has hit "Enter".
+ */
+ protected void fireDocumentChanged(DocumentEvent event) {
+ super.fireDocumentChanged(event);
+ String eventText= event.getText();
+ if (eventText == null || 0 >= eventText.length() || eventText.length() > 2) {
+ return;
+ }
+ String[] lineDelimiters= event.getDocument().getLegalLineDelimiters();
+ for (int i= 0; i < lineDelimiters.length; i++) {
+ if (lineDelimiters[i].equals(eventText)) {
+ try {
+ String inText= event.getDocument().get();
+ inText= inText.substring(fNewStreamWriteEnd, inText.length());
+ if (inText.length() == 0) {
+ return;
+ }
+ fProxy.write(inText);
+ fLastStreamWriteEnd= getLength();
+ return;
+ } catch (IOException ioe) {
+ DebugUIUtils.logError(ioe);
+ }
+ }
+ }
+ }
+
+ public boolean isClosed() {
+ return fClosed;
+ }
+
+ public void replace(int pos, int replaceLength, String text) {
+ if (isReadOnly() || pos < getStartOfEditableContent()) {
+ return;
+ }
+
+ replace0(pos, replaceLength, text);
+ int docLength= getLength();
+ if (docLength == fNewStreamWriteEnd) {
+ //removed all of the user input text
+ fStyleRanges.remove(fStyleRanges.size() - 1);
+ } else {
+ updateInputStyleRange(docLength);
+ //notify the viewer that the style ranges have changed.
+ fireDocumentChanged(new DocumentEvent(this, 0, 0, ""));
+ }
+ }
+
+ /**
+ * Replace text used to add content from streams even though
+ * the process is terminated (and therefore the doc is "read only")
+ */
+ protected void replace0(int pos, int replaceLength, String text) {
+ try {
+ super.replace(pos, replaceLength, text);
+ } catch (BadLocationException ble) {
+ DebugUIUtils.logError(ble);
+ }
+
+ if (text != null && text.length() - replaceLength > fMaxSize / 2) {
+ ensureSizeConstraints();
+ }
+ }
+
+
+ public void setBufferSize(int minSize, int maxSize) {
+ fMinSize= (minSize < fgMinimumSize ? fgMinimumSize : minSize);
+ fMaxSize= (maxSize < minSize * fgMinMaxRation ? minSize * fgMinMaxRation : maxSize);
+
+ if (getStore() instanceof ConsoleOutputTextStore)
+ ((ConsoleOutputTextStore) getStore()).setMinimalBufferSize(fMinSize);
+
+ ensureSizeConstraints();
+ }
+
+ public void set(String text) {
+ fNewStreamWriteEnd= text.length();
+ super.set(text);
+ fLastStreamWriteEnd= fNewStreamWriteEnd;
+ ensureSizeConstraints();
+ }
+
+ protected void startReading() {
+ if (fProxy == null) {
+ return;
+ }
+
+ if (!fNeedsToStartReading) {
+ return;
+ }
+ fNeedsToStartReading= false;
+ IStreamMonitor monitor= fProxy.getOutputStreamMonitor();
+ if (monitor != null) {
+ monitor.addListener(fSystemOutListener);
+ String contents= monitor.getContents();
+ if (contents.length() > 0) {
+ fNewStreamWriteEnd= getLength() + contents.length();
+ replace0(getLength(), 0, contents);
+ updateOutputStyleRanges(OUT);
+ fLastStreamWriteEnd= getLength();
+ }
+ }
+ monitor= fProxy.getErrorStreamMonitor();
+ if (monitor != null) {
+ monitor.addListener(fSystemErrListener);
+ String contents= monitor.getContents();
+ if (contents.length() > 0) {
+ fNewStreamWriteEnd= getLength() + contents.length();
+ replace0(getLength(), 0, contents);
+ updateOutputStyleRanges(ERR);
+ fLastStreamWriteEnd= getLength();
+ }
+ }
+ }
+
+ protected void stopReading() {
+ if (fProxy == null) {
+ return;
+ }
+ fNeedsToStartReading= true;
+ IStreamMonitor monitor= fProxy.getOutputStreamMonitor();
+ monitor.removeListener(fSystemOutListener);
+ monitor= fProxy.getErrorStreamMonitor();
+ monitor.removeListener(fSystemErrListener);
+ }
+
+ /**
+ * System out or System error has had text append to it.
+ * Adds the new text to the document.
+ */
+ protected void streamAppended(final String text, final int source) {
+ update(new Runnable() {
+ public void run() {
+ int appendedLength= text.length();
+ fNewStreamWriteEnd= fLastStreamWriteEnd + appendedLength;
+ ConsoleDocument.this.replace0(fLastStreamWriteEnd, 0, text);
+ updateOutputStyleRanges(source);
+ fLastStreamWriteEnd= fNewStreamWriteEnd;
+ }
+ });
+ }
+
+ /**
+ * @see IInputStreamListener
+ */
+ protected void systemErrAppended(String text) {
+ streamAppended(text, ERR);
+ }
+
+ /**
+ * @see IInputStreamListener
+ */
+ protected void systemOutAppended(String text) {
+ streamAppended(text, OUT);
+ }
+
+ public boolean equals(Object obj) {
+ boolean correctInstance= obj instanceof ConsoleDocument;
+ if (fProcess != null) {
+ return correctInstance && fProcess.equals(((ConsoleDocument)obj).fProcess);
+ } else {
+ return correctInstance && ((ConsoleDocument)obj).fProcess == null;
+ }
+ }
+
+ public int hashCode() {
+ return (fProcess != null) ? fProcess.hashCode() : super.hashCode();
+ }
+
+ protected StyleRange[] getStyleRanges() {
+ if (fStyleRanges.isEmpty()) {
+ return new StyleRange[]{};
+ }
+ StyleRange[] sRanges= new StyleRange[fStyleRanges.size()];
+ return (StyleRange[])fStyleRanges.toArray(sRanges);
+ }
+
+ /**
+ * Coalese that last two style ranges if they are similar
+ */
+ protected void coaleseRanges() {
+ int size= fStyleRanges.size();
+ if (size > 1) {
+ StyleRange last= (StyleRange) fStyleRanges.get(size - 1);
+ StyleRange nextToLast= (StyleRange) fStyleRanges.get(size - 2);
+ if (last.similarTo(nextToLast)) {//same color?
+ StyleRange newRange= new StyleRange(nextToLast.start, last.length + nextToLast.length, last.foreground, null);
+ fStyleRanges.remove(size - 1);
+ fStyleRanges.remove(size - 2);
+ addNewStyleRange(newRange);
+ }
+ }
+ }
+
+ /**
+ * Returns whether the document's underlying process is
+ * terminated.
+ */
+ protected boolean isReadOnly() {
+ return (fProcess != null) ? fProcess.isTerminated() : true;
+ }
+
+ /**
+ * Updates the current input style range.
+ */
+ protected void updateInputStyleRange(int docLength) {
+ if (fClosed) {
+ return;
+ }
+ if (docLength != fNewStreamWriteEnd) {
+ StyleRange input=
+ new StyleRange(fNewStreamWriteEnd, docLength - fNewStreamWriteEnd,
+ ConsolePreferencePage.getPreferenceColor(ConsolePreferencePage.CONSOLE_SYS_IN_RGB),
+ null);
+ if (!fStyleRanges.isEmpty()) {
+ if (((StyleRange)fStyleRanges.get(fStyleRanges.size() - 1)).similarTo(input)) {
+ //remove the top "input" range...continuing input
+ fStyleRanges.remove(fStyleRanges.size() - 1);
+ }
+ }
+
+ addNewStyleRange(input);
+ }
+ }
+
+ protected void updateOutputStyleRanges(int sourceStream) {
+ if (fClosed) {
+ return;
+ }
+ int docLength= getLength();
+ if (docLength == 0) {
+ return;
+ }
+
+ if ((fNewStreamWriteEnd == 0) && (0 == fLastStreamWriteEnd)) {
+ return;
+ }
+
+ if (fNewStreamWriteEnd == fLastStreamWriteEnd) {
+ return;
+ }
+
+ Color newRangeColor=
+ (sourceStream == ConsoleDocument.OUT) ? ConsolePreferencePage.getPreferenceColor(ConsolePreferencePage.CONSOLE_SYS_OUT_RGB) : ConsolePreferencePage.getPreferenceColor(ConsolePreferencePage.CONSOLE_SYS_ERR_RGB);
+
+ StyleRange newRange= new StyleRange(fLastStreamWriteEnd, fNewStreamWriteEnd - fLastStreamWriteEnd, newRangeColor, null);
+ if (!fStyleRanges.isEmpty()) {
+ if ((docLength != fNewStreamWriteEnd) &&
+ ((StyleRange)fStyleRanges.get(fStyleRanges.size() - 1)).foreground ==
+ ConsolePreferencePage.getPreferenceColor(ConsolePreferencePage.CONSOLE_SYS_IN_RGB)) {
+ //remove the top "input" range..it will get recalculated in updateInputStyleRanges
+ fStyleRanges.remove(fStyleRanges.size() - 1);
+ }
+ }
+
+ addNewStyleRange(newRange);
+ coaleseRanges();
+ updateInputStyleRange(docLength);
+ //notify the viewer that the style ranges have changed.
+ fireDocumentChanged(new DocumentEvent(this, 0, 0, null));
+ }
+
+ /**
+ * Adds a new style range if the document is not closed.
+ * Note that the document can be closed by a separate thread.
+ * This is the reason for the copy of the style ranges.
+ */
+ protected void addNewStyleRange(StyleRange newRange) {
+ List tempRanges= fStyleRanges;
+ if (fClosed) {
+ return;
+ }
+ tempRanges.add(newRange);
+ }
+
+ protected void setStyleRanges(List ranges) {
+ fStyleRanges= ranges;
+ }
+
+ protected void clearDocument() {
+ fStyleRanges= new ArrayList(2);
+ set("");
+ }
+
+ /**
+ * Returns the position after which editing of the
+ * content is allowable.
+ */
+ protected int getStartOfEditableContent() {
+ return fLastStreamWriteEnd;
+ }
+
+ /**
+ * Make visible to the ConsoleViewer
+ */
+ protected ITextStore getStore() {
+ return super.getStore();
+ }
+
+ /**
+ * @see IDebugEventListener
+ */
+ public void handleDebugEvent(DebugEvent event) {
+ if (fProcess == null) {
+ return;
+ }
+ if (event.getKind() == DebugEvent.TERMINATE) {
+ Object element= event.getSource();
+ if (element != null && element.equals(fProcess)) {
+ update( new Runnable() {
+ public void run() {
+ fireDocumentChanged(new DocumentEvent(ConsoleDocument.this, 0, 0, null));
+ }
+ });
+ }
+ }
+ }
+
+ /**
+ * Posts the update code "behind" the running operation if the
+ * UI will be updated.
+ */
+ protected void update(Runnable runnable) {
+ if (fConsoleViewer != null) {
+ fConsoleViewer.getControl().getDisplay().asyncExec(runnable);
+ } else {
+ Display display= DebugUIPlugin.getDefault().getDisplay();
+ if (display != null) {
+ display.asyncExec(runnable);
+ }
+ }
+ }
+
+ /**
+ * Sets the console viewer that this document is viewed within.
+ * Can be set to <code>null</code> if no longer currently being
+ * viewed.
+ */
+ protected void setConsoleViewer(ConsoleViewer viewer) {
+ fConsoleViewer = viewer;
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleGotoLineAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleGotoLineAction.java
new file mode 100644
index 000000000..08976934a
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleGotoLineAction.java
@@ -0,0 +1,104 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import java.util.ResourceBundle;
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Shell;
+
+public class ConsoleGotoLineAction extends ConsoleViewerAction {
+
+ /**
+ * Validates whether the text found in the input field of the
+ * dialog forms a valid line number, i.e. one to which can be
+ * jumped.
+ */
+ class NumberValidator implements IInputValidator {
+
+ public String isValid(String input) {
+ try {
+ int i= Integer.parseInt(input);
+ if (i <= 0 || fLastLine < i)
+ return fBundle.getString(fPrefix + "dialog.invalid_range");
+
+ } catch (NumberFormatException x) {
+ return fBundle.getString(fPrefix + "dialog.invalid_input");
+ }
+
+ return "";
+ }
+ };
+
+ protected int fLastLine;
+ protected ResourceBundle fBundle;
+ protected String fPrefix;
+ protected ConsoleViewer fConsoleViewer;
+
+ /**
+ * Constructs a goto line action for the console using the provided resource bundle
+ */
+ public ConsoleGotoLineAction(ResourceBundle bundle, String prefix, ConsoleViewer viewer) {
+ super(bundle, prefix, viewer, -1);
+ fBundle= bundle;
+ fPrefix= prefix;
+ fConsoleViewer= viewer;
+ }
+
+ /**
+ * @see TextEditorAction
+ */
+ public void update() {
+ }
+
+ /**
+ * Jumps to the line.
+ */
+ protected void gotoLine(int line) {
+
+ IDocument document= fConsoleViewer.getDocument();
+ try {
+ int start= document.getLineOffset(line);
+ int length= document.getLineLength(line);
+
+ fConsoleViewer.getTextWidget().setSelection(start, start + length);
+ fConsoleViewer.revealRange(start, length);
+ } catch (BadLocationException x) {
+ // ignore
+ }
+ }
+
+ /**
+ * @see Action
+ */
+ public void run() {
+ try {
+ Point selection= fConsoleViewer.getTextWidget().getSelection();
+ IDocument document= fConsoleViewer.getDocument();
+ fLastLine= document.getLineOfOffset(document.getLength()) + 1;
+ int startLine= selection == null ? 1 : fConsoleViewer.getTextWidget().getLineAtOffset(selection.x) + 1;
+ String title= fBundle.getString(fPrefix + "dialog.title");
+ String message= fBundle.getString(fPrefix + "dialog.message");
+ String value= Integer.toString(startLine);
+ Shell activeShell= DebugUIPlugin.getActiveWorkbenchWindow().getShell();
+ InputDialog d= new InputDialog(activeShell, title, message, value, new NumberValidator());
+ d.open();
+
+ try {
+ int line= Integer.parseInt(d.getValue());
+ gotoLine(line - 1);
+ } catch (NumberFormatException x) {
+ }
+ } catch (BadLocationException x) {
+ return;
+ }
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleOutputTextStore.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleOutputTextStore.java
new file mode 100644
index 000000000..c9c83fce4
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleOutputTextStore.java
@@ -0,0 +1,63 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 1999, 2000
+ */
+
+import org.eclipse.jface.text.ITextStore;
+
+public class ConsoleOutputTextStore implements ITextStore {
+
+ private StringBuffer fBuffer;
+
+ public ConsoleOutputTextStore(int bufferSize) {
+ fBuffer= new StringBuffer(bufferSize);
+ }
+
+ /**
+ * @see ITextStore
+ */
+ public char get(int pos) {
+ return fBuffer.charAt(pos);
+ }
+
+ /**
+ * @see ITextStore
+ */
+ public String get(int pos, int length) {
+ return fBuffer.substring(pos, pos + length);
+ }
+
+ /**
+ * @see ITextStore
+ */
+ public int getLength() {
+ return fBuffer.length();
+ }
+
+ /**
+ * @see ITextStore
+ */
+ public void replace(int pos, int length, String text) {
+ if (text == null) {
+ text= "";
+ }
+ fBuffer.replace(pos, pos + length, text);
+ }
+
+ /**
+ * @see ITextStore
+ */
+ public void set(String text) {
+ fBuffer= new StringBuffer(text);
+ }
+
+ /**
+ * @see StringBuffer#ensureCapacity
+ */
+ public void setMinimalBufferSize(int bufferSize) {
+ fBuffer.ensureCapacity(bufferSize);
+ }
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsolePreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsolePreferencePage.java
new file mode 100644
index 000000000..7961e65f1
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsolePreferencePage.java
@@ -0,0 +1,76 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.jface.preference.*; import org.eclipse.swt.graphics.*; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * A page to set the preferences for the console
+ */
+public class ConsolePreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage, IDebugPreferenceConstants {
+
+ private static final String PREFIX= "console_preferences.";
+ private static final String DESCRIPTION= PREFIX + "description";
+ private static final String OUT= PREFIX + "out";
+ private static final String ERR= PREFIX + "err";
+ private static final String IN= PREFIX + "in";
+ private static final String FONT=PREFIX + "font";
+
+ /**
+ * Create the console page.
+ */
+ public ConsolePreferencePage() {
+ super(GRID);
+ setDescription(DebugUIUtils.getResourceString(DESCRIPTION));
+ IPreferenceStore store= DebugUIPlugin.getDefault().getPreferenceStore();
+ setPreferenceStore(store);
+ }
+
+ /**
+ * Create all field editors for this page
+ */
+ public void createFieldEditors() {
+
+ // Note: first String value is the key for the preference bundle and second the
+ // second String value is the label displayed in front of the editor.
+ ColorFieldEditor sysout= new ColorFieldEditor(CONSOLE_SYS_OUT_RGB, DebugUIUtils.getResourceString(OUT), getFieldEditorParent());
+ ColorFieldEditor syserr= new ColorFieldEditor(CONSOLE_SYS_ERR_RGB, DebugUIUtils.getResourceString(ERR), getFieldEditorParent());
+ ColorFieldEditor sysin= new ColorFieldEditor(CONSOLE_SYS_IN_RGB, DebugUIUtils.getResourceString(IN), getFieldEditorParent());
+
+ FontFieldEditor font= new FontFieldEditor(CONSOLE_FONT, DebugUIUtils.getResourceString(FONT), getFieldEditorParent());
+ addField(sysout);
+ addField(syserr);
+ addField(sysin);
+ addField(font);
+ }
+
+ /**
+ * @see IWorkbenchPreferencePage#init
+ */
+ public void init(IWorkbench workbench) {
+ }
+
+ /**
+ * Returns the a color based on the type.
+ */
+ protected static Color getPreferenceColor(String type) {
+ IPreferenceStore pstore= DebugUIPlugin.getDefault().getPreferenceStore();
+ RGB outRGB= PreferenceConverter.getColor(pstore, type);
+ ColorManager colorManager= DebugUIPlugin.getDefault().getColorManager();
+ return colorManager.getColor(outRGB);
+ }
+
+ /**
+ * Returns the font data that describes the font to use for the console
+ */
+ protected static FontData getConsoleFontData() {
+ IPreferenceStore pstore= DebugUIPlugin.getDefault().getPreferenceStore();
+ FontData fontData= PreferenceConverter.getFontData(pstore, CONSOLE_FONT);
+ return fontData;
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleView.java
new file mode 100644
index 000000000..e1bd8a32f
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleView.java
@@ -0,0 +1,210 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import java.util.*;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.debug.core.model.IProcess;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jface.action.*;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IFindReplaceTarget;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.texteditor.FindReplaceAction;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.ui.texteditor.IUpdate;
+
+public class ConsoleView extends ViewPart {
+
+ protected final static String PREFIX= "console_view.";
+
+ protected ConsoleViewer fConsoleViewer= null;
+ protected ClearOutputAction fClearOutputAction= null;
+
+ protected Map fGlobalActions= new HashMap(10);
+ protected List fSelectionActions = new ArrayList(7);
+
+ /**
+ * @see ViewPart#createChild(IWorkbenchPartContainer)
+ */
+ public void createPartControl(Composite parent) {
+ fConsoleViewer= new ConsoleViewer(parent);
+ initializeActions();
+ initializeToolBar();
+
+ // create context menu
+ MenuManager menuMgr= new MenuManager("#PopUp", IDebugUIConstants.ID_CONSOLE_VIEW);
+ menuMgr.setRemoveAllWhenShown(true);
+ menuMgr.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager mgr) {
+ fillContextMenu(mgr);
+ }
+ });
+ Menu menu= menuMgr.createContextMenu(fConsoleViewer.getTextWidget());
+ fConsoleViewer.getTextWidget().setMenu(menu);
+ // register the context menu such that other plugins may contribute to it
+ getSite().registerContextMenu(menuMgr.getId(), menuMgr, fConsoleViewer);
+
+ fConsoleViewer.getSelectionProvider().addSelectionChangedListener(getSelectionChangedListener());
+ setViewerInput(DebugUIPlugin.getDefault().getCurrentProcess());
+ setTitleToolTip(DebugUIUtils.getResourceString(PREFIX + AbstractDebugView.TITLE_TOOLTIPTEXT));
+ }
+
+ /**
+ * @see IWorkbenchPart
+ */
+ public void setFocus() {
+ fConsoleViewer.getControl().setFocus();
+ }
+
+ /**
+ * Sets the input of the viewer of this view in the
+ * UI thread.
+ */
+ protected void setViewerInput(final IAdaptable element) {
+ setViewerInput(element, true);
+ }
+
+ /**
+ * Sets the input of the viewer of this view in the
+ * UI thread. The current input process is determined
+ * if so specified.
+ */
+ protected void setViewerInput(final IAdaptable element, final boolean determineCurrentProcess) {
+ if (fConsoleViewer == null) {
+ return;
+ }
+ Display display= fConsoleViewer.getControl().getDisplay();
+ if (display != null) {
+ display.asyncExec(new Runnable() {
+ public void run() {
+ IDocument doc= DebugUIPlugin.getDefault().getConsoleDocument((IProcess) element, determineCurrentProcess);
+ fConsoleViewer.setDocument(doc);
+ }
+ });
+ }
+ }
+
+ /**
+ * Initialize the actions of this view
+ */
+ private void initializeActions() {
+ fClearOutputAction= new ClearOutputAction(fConsoleViewer);
+ fClearOutputAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_CLEAR));
+ fClearOutputAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_CLEAR));
+ fClearOutputAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_CLEAR));
+
+ ResourceBundle bundle= DebugUIUtils.getResourceBundle();
+ // In order for the clipboard actions to accessible via their shortcuts
+ // (e.g., Ctrl-C, Ctrl-V), we *must* set a global action handler for
+ // each action
+ IActionBars actionBars= getViewSite().getActionBars();
+ setGlobalAction(actionBars, ITextEditorActionConstants.CUT, new ConsoleViewerAction(bundle, "cut_action.", fConsoleViewer, fConsoleViewer.CUT));
+ setGlobalAction(actionBars, ITextEditorActionConstants.COPY, new ConsoleViewerAction(bundle, "copy_action.", fConsoleViewer, fConsoleViewer.COPY));
+ setGlobalAction(actionBars, ITextEditorActionConstants.PASTE, new ConsoleViewerAction(bundle, "paste_action.", fConsoleViewer, fConsoleViewer.PASTE));
+ setGlobalAction(actionBars, ITextEditorActionConstants.SELECT_ALL, new ConsoleViewerAction(bundle, "select_all_action.", fConsoleViewer, fConsoleViewer.SELECT_ALL));
+ setGlobalAction(actionBars, ITextEditorActionConstants.FIND, new FindReplaceAction(bundle, "find_replace_action.", getSite().getWorkbenchWindow()));
+ setGlobalAction(actionBars, ITextEditorActionConstants.GOTO_LINE, new ConsoleGotoLineAction(bundle, "goto_line_action.", fConsoleViewer));
+
+ fSelectionActions.add(ITextEditorActionConstants.CUT);
+ fSelectionActions.add(ITextEditorActionConstants.COPY);
+ fSelectionActions.add(ITextEditorActionConstants.PASTE);
+ }
+
+ protected void setGlobalAction(IActionBars actionBars, String actionID, IAction action) {
+ fGlobalActions.put(actionID, action);
+ actionBars.setGlobalActionHandler(actionID, action);
+ }
+
+ public void markAsSelectionDependentAction(String actionId) {
+ if (!fSelectionActions.contains(actionId)) {
+ fSelectionActions.add(actionId);
+ }
+ }
+
+ /**
+ * Configures the toolBar.
+ */
+ private void initializeToolBar() {
+ IToolBarManager tbm= getViewSite().getActionBars().getToolBarManager();
+ tbm.add(fClearOutputAction);
+ getViewSite().getActionBars().updateActionBars();
+ }
+
+ /**
+ * Adds the text manipulation actions to the <code>ConsoleViewer</code>
+ */
+ protected void fillContextMenu(IMenuManager menu) {
+ Point selectionRange= fConsoleViewer.getTextWidget().getSelection();
+ ConsoleDocument doc= (ConsoleDocument) fConsoleViewer.getDocument();
+ if (doc == null) {
+ return;
+ }
+ if (doc.isReadOnly() || selectionRange.x < doc.getStartOfEditableContent()) {
+ menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.COPY));
+ menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.SELECT_ALL));
+ } else {
+ menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.CUT));
+ menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.COPY));
+ menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.PASTE));
+ menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.SELECT_ALL));
+ }
+
+ menu.add(new Separator("FIND"));
+ menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.FIND));
+ menu.add((IAction)fGlobalActions.get(ITextEditorActionConstants.GOTO_LINE));
+
+ menu.add(fClearOutputAction);
+ menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ /**
+ * @see WorkbenchPart#getAdapter(Class)
+ */
+ public Object getAdapter(Class required) {
+ if (IFindReplaceTarget.class.equals(required)) {
+ return fConsoleViewer.getFindReplaceTarget();
+ }
+ return super.getAdapter(required);
+ }
+
+ protected final ISelectionChangedListener getSelectionChangedListener() {
+ return new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ updateSelectionDependentActions();
+ }
+ };
+ }
+
+ protected void updateSelectionDependentActions() {
+ Iterator iterator= fSelectionActions.iterator();
+ while (iterator.hasNext())
+ updateAction((String)iterator.next());
+ }
+
+ protected void updateAction(String actionId) {
+ IAction action= (IAction)fGlobalActions.get(actionId);
+ if (action instanceof IUpdate)
+ ((IUpdate) action).update();
+ }
+
+ public void dispose() {
+ if (fConsoleViewer != null) {
+ fConsoleViewer.dispose();
+ }
+ super.dispose();
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleViewer.java
new file mode 100644
index 000000000..6e2c829e7
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleViewer.java
@@ -0,0 +1,168 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.jface.text.*; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.events.VerifyListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.widgets.Composite;
+
+public class ConsoleViewer extends TextViewer implements IPropertyChangeListener{
+
+ /**
+ * Font used in the underlying text widget
+ */
+ protected Font fFont;
+
+ protected InternalDocumentListener fInternalDocumentListener= new InternalDocumentListener();
+ /**
+ * Internal document listener.
+ */
+ class InternalDocumentListener implements IDocumentListener {
+ /*
+ * @see IDocumentListener#documentAboutToBeChanged
+ */
+ public void documentAboutToBeChanged(DocumentEvent e) {
+ }
+
+ /*
+ * @see IDocumentListener#documentChanged
+ */
+ public void documentChanged(DocumentEvent e) {
+ ConsoleDocument doc= (ConsoleDocument) getDocument();
+ if (doc == null || doc.isClosed()) {
+ return;
+ }
+ revealEndOfDocument();
+ if (doc.isReadOnly()) {
+ StyledText widget= getTextWidget();
+ widget.setEditable(false);
+ }
+ updateStyleRanges(doc);
+ }
+ }
+
+ /**
+ * Creates a new console viewer and adds verification checking
+ * to only allow text modification if the text is being modified
+ * in the editable portion of the underlying document.
+ *
+ * @see org.eclipse.swt.events.VerifyListener
+ */
+ public ConsoleViewer(Composite parent) {
+ super(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+
+ getTextWidget().setDoubleClickEnabled(true);
+ getTextWidget().addVerifyListener( new VerifyListener() {
+ public void verifyText(VerifyEvent e) {
+ ConsoleDocument doc= (ConsoleDocument) getDocument();
+ if (doc != null && doc.getStartOfEditableContent() > e.start) {
+ e.doit= false;
+ }
+ }
+ });
+
+ DebugUIPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
+ FontData data= ConsolePreferencePage.getConsoleFontData();
+ fFont= new Font(getControl().getDisplay(), data);
+ getTextWidget().setFont(fFont);
+ }
+
+ /**
+ * Reveals (makes visible) the end of the current document
+ */
+ protected void revealEndOfDocument() {
+ IDocument doc= getDocument();
+ int docLength= doc.getLength();
+ if (docLength > 0) {
+ revealRange(docLength - 1, 1);
+ StyledText widget= getTextWidget();
+ widget.setCaretOffset(docLength);
+
+ }
+ }
+
+ protected void updateStyleRanges(ConsoleDocument doc) {
+ StyleRange[] ranges= doc.getStyleRanges();
+ int lastRangeIndex= ranges.length;
+ if (lastRangeIndex > 0) {
+ StyledText widget= getTextWidget();
+ int storeLength= doc.getStore().getLength();
+ StyleRange lastRange= ranges[lastRangeIndex - 1];
+ if (!(storeLength - 1 < lastRange.start) &&
+ lastRange.start + lastRange.length <= widget.getContent().getCharCount()) {
+ widget.setStyleRanges(ranges);
+ }
+ }
+ }
+
+ /**
+ * Clears the contents of the current document.
+ */
+ public void clearDocument() {
+ IDocument doc= getDocument();
+ if (doc != null) {
+ ((ConsoleDocument) doc).clearDocument();
+ }
+ }
+
+ /**
+ * @see ITextViewer#setDocument(IDocument)
+ */
+ public void setDocument(IDocument doc) {
+ ConsoleDocument oldDoc= (ConsoleDocument) getDocument();
+ ConsoleDocument document= (ConsoleDocument)doc;
+ if (oldDoc == null && document == null) {
+ return;
+ }
+ if (oldDoc != null) {
+ oldDoc.removeDocumentListener(fInternalDocumentListener);
+ oldDoc.setConsoleViewer(null);
+ if (oldDoc.equals(document)) {
+ document.addDocumentListener(fInternalDocumentListener);
+ document.setConsoleViewer(this);
+ return;
+ }
+ }
+
+ super.setDocument(document);
+ if (document != null) {
+ getTextWidget().setEditable(!document.isReadOnly());
+ updateStyleRanges(document);
+ revealEndOfDocument();
+ document.addDocumentListener(fInternalDocumentListener);
+ document.setConsoleViewer(this);
+ }
+ }
+
+ /**
+ * @see IFindReplaceTarget#canPerformFind
+ */
+ protected boolean canPerformFind() {
+ return (getTextWidget() != null && getVisibleDocument() != null && getVisibleDocument().getLength() > 0);
+ }
+
+ /**
+ * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
+ */
+ public void propertyChange(PropertyChangeEvent event) {
+ String propertyName= event.getProperty();
+ if (!propertyName.equals(IDebugPreferenceConstants.CONSOLE_FONT)) {
+ return;
+ }
+ FontData data= ConsolePreferencePage.getConsoleFontData();
+ Font temp= fFont;
+ fFont= new Font(getControl().getDisplay(), data);
+ getTextWidget().setFont(fFont);
+ temp.dispose();
+ }
+
+ /**
+ * Dispose this viewer and resources
+ */
+ protected void dispose() {
+ fFont.dispose();
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleViewerAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleViewerAction.java
new file mode 100644
index 000000000..c5ff5661f
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ConsoleViewerAction.java
@@ -0,0 +1,48 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import java.util.ResourceBundle;
+import org.eclipse.jface.text.ITextOperationTarget;
+import org.eclipse.ui.texteditor.TextEditorAction;
+
+public class ConsoleViewerAction extends TextEditorAction {
+
+ private int fOperationCode= -1;
+ private ITextOperationTarget fOperationTarget;
+
+ public ConsoleViewerAction(ResourceBundle bundle, String prefix, ConsoleViewer viewer, int operationCode) {
+ super(bundle, prefix, null);
+ fOperationCode= operationCode;
+ fOperationTarget= viewer.getTextOperationTarget();
+ update();
+ }
+
+ /**
+ * @see TextEditorAction
+ */
+ public void update() {
+
+ boolean wasEnabled= isEnabled();
+ boolean isEnabled= (fOperationTarget != null && fOperationTarget.canDoOperation(fOperationCode));
+ setEnabled(isEnabled);
+
+ if (wasEnabled != isEnabled) {
+ firePropertyChange(ENABLED, wasEnabled ? Boolean.TRUE : Boolean.FALSE, isEnabled ? Boolean.TRUE : Boolean.FALSE);
+ }
+ }
+
+ /**
+ * @see Action
+ */
+ public void run() {
+ if (fOperationCode != -1 && fOperationTarget != null) {
+ fOperationTarget.doOperation(fOperationCode);
+ }
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ControlAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ControlAction.java
new file mode 100644
index 000000000..75f5b2072
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ControlAction.java
@@ -0,0 +1,56 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.ui.actions.SelectionProviderAction;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+/**
+ * Provides the common functionality of the control actions.
+ * In order to avoid duplication of code, ControlActions defer to
+ * delegates to perform all of the real work. This is necessary so that
+ * these actions can be used as regular SelectionProviderActions,
+ * but also be used as contributed IWorkbenchWindowActionDelegates,
+ * which must have zero-argument constructors.
+ */
+public class ControlAction extends SelectionProviderAction {
+
+ /**
+ * The delegate does all of the real work. This class only responds to
+ * run() requests and selectionChanged notifications. In both cases,
+ * it defers to the delegate.
+ */
+ protected ControlActionDelegate fDelegate;
+
+ public ControlAction(ISelectionProvider selectionProvider, ControlActionDelegate delegate) {
+ super(selectionProvider, "");
+ fDelegate= delegate;
+ fDelegate.initializeForOwner(this);
+ setText(DebugUIUtils.getResourceString(fDelegate.getPrefix() + TEXT));
+ setToolTipText(DebugUIUtils.getResourceString(fDelegate.getPrefix() + TOOL_TIP_TEXT));
+ }
+
+ /**
+ * @see Action
+ * The actual work is deferred to the delegate.
+ */
+ public void run() {
+ fDelegate.selectionChanged(this, getStructuredSelection());
+ fDelegate.run();
+ }
+
+ /**
+ * @see SelectionProviderAction
+ * Updates the enable state based on what and how much is selected.
+ */
+ public void selectionChanged(IStructuredSelection sel) {
+ setEnabled(fDelegate.getEnableStateForSelection(sel));
+ }
+
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ControlActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ControlActionDelegate.java
new file mode 100644
index 000000000..3bd2e2604
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ControlActionDelegate.java
@@ -0,0 +1,145 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.IDebugStatusConstants;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Display;
+import java.util.Iterator;
+
+public abstract class ControlActionDelegate implements IWorkbenchWindowActionDelegate {
+
+ protected static final String ERROR= "error.";
+ protected static final String STATUS= "status";
+
+ protected IStructuredSelection fStructuredSelection;
+
+ /**
+ * It's crucial that delegate actions have a zero-arg constructor so that
+ * they can be reflected into existence when referenced in an action set
+ * in the plugin's plugin.xml file.
+ */
+ public ControlActionDelegate() {
+ }
+
+ /**
+ * Not all ControlActionDelegates have an owner, only those that aren't
+ * specified as part of an action set in plugin.xml. For those delegates,
+ * that do have a ControlAction owner, this is the place to do any
+ * action specific initialization.
+ */
+ public void initializeForOwner(ControlAction controlAction) {
+ }
+
+ /**
+ * Do the specific action using the current selection.
+ */
+ public void run() {
+ final Iterator enum= fStructuredSelection.iterator();
+ String pluginId= DebugUIPlugin.getDefault().getDescriptor().getUniqueIdentifier();
+ final MultiStatus ms=
+ new MultiStatus(pluginId, IDebugStatusConstants.REQUEST_FAILED, DebugUIUtils.getResourceString(getPrefix() + STATUS), null);
+ BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
+ public void run() {
+ while (enum.hasNext()) {
+ Object element= enum.next();
+ if (isEnabledFor(element)) {
+ try {
+ doAction(element);
+ } catch (DebugException e) {
+ ms.merge(e.getStatus());
+ }
+ }
+ }
+ }
+ });
+ if (!ms.isOK()) {
+ DebugUIUtils.errorDialog(DebugUIPlugin.getActiveWorkbenchWindow().getShell(), getPrefix() + ERROR, ms);
+ }
+ }
+
+ /**
+ * @see IWorkbenchWindowActionDelegate
+ */
+ public void dispose(){
+ }
+
+ /**
+ * @see IWorkbenchWindowActionDelegate
+ */
+ public void init(IWorkbenchWindow window){
+ }
+
+ /**
+ * @see IActionDelegate
+ */
+ public void run(IAction action){
+ run();
+ }
+
+ /**
+ * @see IActionDelegate
+ */
+ public void selectionChanged(IAction action, ISelection selection){
+ if (selection instanceof IStructuredSelection) {
+ fStructuredSelection= (IStructuredSelection)selection;
+ }
+ }
+
+ /**
+ * Return whether the action should be enabled or not based on the given selection.
+ */
+ public boolean getEnableStateForSelection(IStructuredSelection selection) {
+ if (selection.size() == 0) {
+ return false;
+ }
+ Iterator enum= selection.iterator();
+ int count= 0;
+ while (enum.hasNext()) {
+ count++;
+ if (count > 1 && enableForMultiSelection()) {
+ return false;
+ }
+ Object element= enum.next();
+ if (!isEnabledFor(element)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Returns whether this action should be enabled if there is
+ * multi selection.
+ */
+ protected boolean enableForMultiSelection() {
+ return true;
+ }
+
+ /**
+ * Does the specific action of this action to the process.
+ */
+ protected abstract void doAction(Object element) throws DebugException;
+
+ /**
+ * Returns the resource bundle prefix for this action
+ */
+ protected abstract String getPrefix();
+
+ /**
+ * Returns whether this action will work for the given element
+ */
+ public abstract boolean isEnabledFor(Object element);
+
+} \ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/CopyToClipboardActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/CopyToClipboardActionDelegate.java
new file mode 100644
index 000000000..c1b0c2111
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/CopyToClipboardActionDelegate.java
@@ -0,0 +1,89 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IDebugElement;
+import org.eclipse.jface.viewers.ContentViewer;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.swt.dnd.*;
+
+public class CopyToClipboardActionDelegate extends ControlActionDelegate {
+
+ private ContentViewer fViewer;
+
+ private static final String PREFIX= "copy_to_clipboard_action.";
+
+ /**
+ * @see ControlActionDelegate
+ */
+ public void initializeForOwner(ControlAction controlAction) {
+ controlAction.setEnabled(!controlAction.getStructuredSelection().isEmpty());
+ fViewer = (ContentViewer)controlAction.getSelectionProvider();
+ }
+
+ /**
+ * @see ControlActionDelegate
+ */
+ protected String getPrefix() {
+ return PREFIX;
+ }
+ /**
+ * @see ControlActionDelegate
+ */
+ public boolean isEnabledFor(Object element) {
+ return element instanceof IDebugElement;
+ }
+
+ /**
+ * @see ControlActionDelegate
+ */
+ protected void doAction(final Object element) {
+ StringBuffer buffer= new StringBuffer();
+ IDebugElement de= (IDebugElement) element;
+ append(de, buffer, (ILabelProvider)fViewer.getLabelProvider(), 0);
+
+ RTFTransfer rtfTransfer = RTFTransfer.getInstance();
+ TextTransfer plainTextTransfer = TextTransfer.getInstance();
+ Clipboard clipboard= new Clipboard(fViewer.getControl().getDisplay());
+ clipboard.setContents(
+ new String[]{buffer.toString()},
+ new Transfer[]{plainTextTransfer});
+ }
+
+ /**
+ * Appends the representation of the specified element (using the label provider and indent)
+ * to the buffer. For elements down to stack frames, children representations
+ * are append to the buffer as well.
+ */
+ protected void append(IDebugElement e, StringBuffer buffer, ILabelProvider lp, int indent) {
+ for (int i= 0; i < indent; i++) {
+ buffer.append('\t');
+ }
+ buffer.append(lp.getText(e));
+ buffer.append(System.getProperty("line.separator"));
+ if (e.getElementType() < IDebugElement.STACK_FRAME) {
+ IDebugElement[] children= new IDebugElement[]{};
+ try {
+ children= e.getChildren();
+ } catch (DebugException de) {
+ }
+ for (int i = 0;i < children.length; i++) {
+ IDebugElement de= children[i];
+ append(de, buffer, lp, indent + 1);
+ }
+ }
+ }
+
+ /**
+ * @see ControlActionDelegate
+ */
+ protected boolean enableForMultiSelection() {
+ return false;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugAction.java
new file mode 100644
index 000000000..c8cabbed2
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugAction.java
@@ -0,0 +1,34 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.ui.IDebugUIConstants;
+
+/**
+ * An execution action that uses launchers in
+ * debug mode.
+ */
+public class DebugAction extends ExecutionAction {
+
+ protected final static String PREFIX= "debug_action.";
+
+ public DebugAction() {
+ setText(DebugUIUtils.getResourceString(PREFIX + TEXT));
+ setImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_ACT_DEBUG));
+ setToolTipText(DebugUIUtils.getResourceString(PREFIX + TOOL_TIP_TEXT));
+ }
+
+ /**
+ * @see ExecutionAction
+ */
+ protected String getMode() {
+ return ILaunchManager.DEBUG_MODE;
+ }
+
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugContentProvider.java
new file mode 100644
index 000000000..ffbb2be29
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugContentProvider.java
@@ -0,0 +1,267 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.*;
+import org.eclipse.debug.core.model.*;
+import org.eclipse.jface.viewers.IBasicPropertyConstants;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+
+/**
+ * Provides the contents for a debug mode of the Launches viewer.
+ */
+public class DebugContentProvider extends BasicContentProvider implements IDebugEventListener, ILaunchListener, ITreeContentProvider {
+
+ /**
+ * Constructs a new content provider.
+ */
+ public DebugContentProvider() {
+ DebugPlugin plugin= DebugPlugin.getDefault();
+ plugin.addDebugEventListener(this);
+ plugin.getLaunchManager().addLaunchListener(this);
+ }
+
+ /**
+ * @see BasicContentProvider#doGetChildren(Object)
+ */
+ protected Object[] doGetChildren(Object parent) {
+ if (parent instanceof IDebugElement) {
+ IDebugElement de= (IDebugElement) parent;
+ if (de.getElementType() < IDebugElement.STACK_FRAME) {
+ try {
+ return de.getChildren();
+ } catch (DebugException e) {
+ DebugUIUtils.logError(e);
+ }
+ }
+ } else
+ if (parent instanceof ILaunch) {
+ return ((ILaunch)parent).getChildren();
+ } else
+ if (parent instanceof ILaunchManager) {
+ return ((ILaunchManager) parent).getLaunches();
+ }
+ return new Object[0];
+ }
+
+ /**
+ * Returns the <code>ILaunch</code>es for the <code>ILaunchManager</code>
+ */
+ public Object[] getElements(Object element) {
+ if (element instanceof ILaunchManager) {
+ return ((ILaunchManager) element).getLaunches();
+ }
+ return new Object[0];
+ }
+
+ /**
+ * @see org.eclipse.jface.viewer.ITreeContentProvider
+ */
+ public Object getParent(Object item) {
+ Object parent= null;
+ if (item instanceof IDebugElement) {
+ IDebugElement de= (IDebugElement) item;
+ parent= de.getParent();
+ if (parent == null) {
+ parent= de.getLaunch();
+ }
+ } else
+ if (item instanceof IProcess) {
+ parent= ((IProcess) item).getLaunch();
+ } else
+ if (item instanceof ILaunch) {
+ parent= DebugPlugin.getDefault().getLaunchManager();
+ }
+ return parent;
+ }
+
+ /**
+ * @see BasicContentProvider#doHandleDebug(Event)
+ */
+ public void doHandleDebugEvent(DebugEvent event) {
+ Object element= event.getSource();
+ if (element instanceof IDebugElement && ((IDebugElement) element).getElementType() == IDebugElement.VARIABLE) {
+ // the debug view does not show variables
+ return;
+ }
+ switch (event.getKind()) {
+ case DebugEvent.CREATE :
+ insert(element);
+ break;
+ case DebugEvent.TERMINATE :
+ clearSourceSelection();
+ Object parent= getParent(element);
+ refresh(parent);
+ updateButtons();
+ break;
+ case DebugEvent.RESUME :
+ if (element instanceof ISuspendResume) {
+ if (((ISuspendResume)element).isSuspended()) {
+ return;
+ }
+ }
+ clearSourceSelection();
+ if (event.getDetail() != DebugEvent.STEP_START) {
+ refresh(element);
+ if (element instanceof IThread) {
+ //select and reveal will update buttons
+ //via selection changed callback
+ selectAndReveal(element);
+ break;
+ }
+ }
+ labelChanged(element);
+ updateButtons();
+ break;
+ case DebugEvent.SUSPEND :
+ refresh(element);
+ if (!DebugUIPlugin.getDefault().userPreferenceToSwitchPerspective(true)) {
+ Object tos= null;
+ if (element instanceof IThread) {
+ // select the top stack frame
+ try {
+ tos= ((IThread) element).getTopStackFrame();
+ } catch (DebugException de) {
+ }
+ }
+ if (tos != null) {
+ selectAndReveal(tos);
+ }
+ }
+ updateButtons();
+ break;
+ case DebugEvent.CHANGE :
+ refresh(element);
+ updateButtons();
+ break;
+ }
+ }
+
+ /**
+ * Helper method for inserting the given element - must be called in UI thread
+ */
+ protected void insert(Object element) {
+ final Object parent= getParent(element);
+ // a parent can be null for a debug target or process that has not yet been associated
+ // with a launch
+ if (parent != null) {
+ ((LaunchesViewer) fViewer).add(parent, element);
+ }
+ }
+
+ /**
+ * Helper method to remove the given element - must be called in UI thread
+ */
+ private void remove(Object element) {
+ ((LaunchesViewer) fViewer).remove(element);
+ }
+
+ /**
+ * Helper method to update the label of the given element - must be called in UI thread
+ */
+ protected void labelChanged(Object element) {
+ ((LaunchesViewer) fViewer).update(element, new String[] {IBasicPropertyConstants.P_TEXT});
+ }
+
+ /**
+ * Helper method to update the buttons of the viewer - must be called in UI thread
+ */
+ protected void updateButtons() {
+ ((LaunchesViewer)fViewer).updateButtons();
+ }
+
+ /**
+ * Helper method to update the selection of the viewer - must be called in UI thread
+ */
+ protected void updateMarkerForSelection() {
+ ((LaunchesViewer)fViewer).updateMarkerForSelection();
+ }
+
+ /**
+ * Helper method to select and reveal the given element - must be called in UI thread
+ */
+ protected void selectAndReveal(Object element) {
+ ((LaunchesViewer) fViewer).setSelection(new StructuredSelection(element), true);
+ }
+
+ /**
+ * @see ITreeContentProvider
+ */
+ public boolean hasChildren(Object item) {
+ if (item instanceof IStackFrame) {
+ return false;
+ // No children shown for IStackFrames in this view (see the variables view instead).
+ } else
+ if (item instanceof IDebugElement) {
+ try {
+ return ((IDebugElement) item).hasChildren();
+ } catch (DebugException de) {
+ }
+ } else
+ if (item instanceof ILaunch) {
+ return true;
+ } else
+ if (item instanceof ILaunchManager) {
+ return ((ILaunchManager) item).getLaunches().length > 0;
+ }
+ return false;
+ }
+
+ /**
+ * @see ILaunchListener
+ */
+ public void launchDeregistered(final ILaunch launch) {
+ Runnable r= new Runnable() {
+ public void run() {
+ remove(launch);
+ updateButtons();
+ }
+ };
+
+ asyncExec(r);
+ }
+
+ /**
+ * @see ILaunchListener
+ */
+ public void launchRegistered(final ILaunch launch) {
+ Runnable r= new Runnable() {
+ public void run() {
+ insert(launch);
+ if (!DebugUIPlugin.getDefault().userPreferenceToSwitchPerspective(true)) {
+ Object dt = launch.getDebugTarget();
+ if (dt != null) {
+ selectAndReveal(dt);
+ }
+ }
+ }
+ };
+
+ asyncExec(r);
+ }
+
+ /**
+ * Unregisters this content provider from the debug model so that
+ * this object can be garbage-collected.
+ */
+ public void dispose() {
+ DebugPlugin plugin= DebugPlugin.getDefault();
+ plugin.removeDebugEventListener(this);
+ plugin.getLaunchManager().removeLaunchListener(this);
+ }
+
+ /**
+ * Clear the selection in the editor - must be called in UI thread
+ */
+ private void clearSourceSelection() {
+ if (fViewer != null) {
+ ((LaunchesViewer)fViewer).clearSourceSelection();
+ }
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugDropDownAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugDropDownAction.java
new file mode 100644
index 000000000..28beb0cb1
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugDropDownAction.java
@@ -0,0 +1,32 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchManager;
+
+public class DebugDropDownAction extends LaunchDropDownAction {
+
+ public DebugDropDownAction() {
+ super(new DebugAction());
+ }
+
+ /**
+ * @see LaunchDropDownAction
+ */
+ public String getMode() {
+ return ILaunchManager.DEBUG_MODE;
+ }
+
+ /**
+ * @see LaunchDropDownAction
+ */
+ public ILaunch[] getHistory() {
+ return DebugUIPlugin.getDefault().getDebugHistory();
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugMenuManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugMenuManager.java
new file mode 100644
index 000000000..2f172b68b
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugMenuManager.java
@@ -0,0 +1,26 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+
+public class DebugMenuManager extends MenuManager implements IMenuListener {
+
+ public DebugMenuManager(String text, String id) {
+ super(text, id);
+ setDirty(true);
+ addMenuListener(this);
+ }
+
+ public void menuAboutToShow(IMenuManager manager) {
+ setDirty(true);
+ }
+
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPerspective.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPerspective.java
new file mode 100644
index 000000000..9d943f76b
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPerspective.java
@@ -0,0 +1,59 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+
+/**
+ * The debug perspective
+ */
+public class DebugPerspective implements IPerspectiveFactory {
+
+ /**
+ * @see IPerspectiveFactory
+ */
+ public void createInitialLayout(IPageLayout layout) {
+
+ IFolderLayout consoleFolder = layout.createFolder(IInternalDebugUIConstants.ID_CONSOLE_FOLDER_VIEW, IPageLayout.BOTTOM, (float)0.75, layout.getEditorArea());
+ consoleFolder.addView(IPageLayout.ID_TASK_LIST);
+ consoleFolder.addView(IDebugUIConstants.ID_CONSOLE_VIEW);
+
+
+ IFolderLayout navFolder= layout.createFolder(IInternalDebugUIConstants.ID_NAVIGATOR_FOLDER_VIEW, IPageLayout.TOP, (float) 0.5, layout.getEditorArea());
+ navFolder.addView(IPageLayout.ID_RES_NAV);
+ navFolder.addView(IDebugUIConstants.ID_PROCESS_VIEW);
+ navFolder.addView(IDebugUIConstants.ID_DEBUG_VIEW);
+
+ IFolderLayout folder= layout.createFolder(IInternalDebugUIConstants.ID_TOOLS_FOLDER_VIEW, IPageLayout.RIGHT, (float) 0.5, IInternalDebugUIConstants.ID_NAVIGATOR_FOLDER_VIEW);
+
+ folder.addView(IDebugUIConstants.ID_BREAKPOINT_VIEW);
+ folder.addView(IDebugUIConstants.ID_INSPECTOR_VIEW);
+ folder.addView(IDebugUIConstants.ID_VARIABLE_VIEW);
+
+ layout.addView(IPageLayout.ID_OUTLINE, IPageLayout.RIGHT, (float) 0.75, layout.getEditorArea());
+
+ layout.addActionSet(IDebugUIConstants.DEBUG_ACTION_SET);
+
+ setContentsOfShowViewMenu(layout);
+ }
+
+ /**
+ * Sets the intial contents of the Show View menu.
+ */
+ protected void setContentsOfShowViewMenu(IPageLayout layout) {
+ layout.addShowViewShortcut(IDebugUIConstants.ID_DEBUG_VIEW);
+ layout.addShowViewShortcut(IDebugUIConstants.ID_PROCESS_VIEW);
+ layout.addShowViewShortcut(IDebugUIConstants.ID_BREAKPOINT_VIEW);
+ layout.addShowViewShortcut(IDebugUIConstants.ID_INSPECTOR_VIEW);
+ layout.addShowViewShortcut(IDebugUIConstants.ID_VARIABLE_VIEW);
+ layout.addShowViewShortcut(IDebugUIConstants.ID_CONSOLE_VIEW);
+ layout.addShowViewShortcut(IPageLayout.ID_TASK_LIST);
+ }
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPluginImages.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPluginImages.java
new file mode 100644
index 000000000..6cbe01af7
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPluginImages.java
@@ -0,0 +1,216 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+
+/**
+ * The images provided by the debug plugin.
+ */
+public class DebugPluginImages {
+
+ /**
+ * The image registry containing <code>Image</code>s.
+ */
+ private static ImageRegistry imageRegistry;
+
+ /**
+ * A table of all the <code>ImageDescriptor</code>s.
+ */
+ private static HashMap imageDescriptors;
+
+ /* Declare Common paths */
+ private static URL ICON_BASE_URL= null;
+ static {
+ try {
+ ICON_BASE_URL= new URL(DebugUIPlugin.getDefault().getDescriptor().getInstallURL(), "icons/");
+ } catch (MalformedURLException e) {
+ // do nothing
+ }
+ }
+
+ // Use IPath and toOSString to build the names to ensure they have the slashes correct
+ private final static String CTOOL= "full/ctool16/"; //basic colors - size 16x16
+ private final static String LOCALTOOL= "full/clcl16/"; //basic colors - size 16x16
+ private final static String DLCL= "full/dlcl16/"; //disabled - size 16x16
+ private final static String ELCL= "full/elcl16/"; //enabled - size 16x16
+ private final static String OBJECT= "full/obj16/"; //basic colors - size 16x16
+ private final static String WIZBAN= "full/wizban/"; //basic colors - size 16x16
+
+ /**
+ * Declare all images
+ */
+ private static void declareImages() {
+ // Actions
+ declareRegistryImage(IDebugUIConstants.IMG_ACT_DEBUG, CTOOL + "debug_exc.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_ACT_RUN, CTOOL + "run_exc.gif");
+
+ //menus
+
+ //Local toolbars
+ declareRegistryImage(IDebugUIConstants.IMG_LCL_RESUME, LOCALTOOL + "resume_co.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_LCL_SUSPEND, LOCALTOOL + "suspend_co.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_LCL_TERMINATE, LOCALTOOL + "terminate_co.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_LCL_DISCONNECT, LOCALTOOL + "disconnect_co.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_LCL_STEPINTO, LOCALTOOL + "stepinto_co.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_LCL_STEPOVER, LOCALTOOL + "stepover_co.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_LCL_STEPRETURN, LOCALTOOL + "stepreturn_co.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_LCL_CLEAR, LOCALTOOL + "clear_co.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_LCL_REMOVE_TERMINATED, LOCALTOOL + "rem_all_co.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_LCL_QUALIFIED_NAMES, LOCALTOOL + "qnames_co.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_LCL_TYPE_NAMES, LOCALTOOL + "tnames_co.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_LCL_REMOVE, LOCALTOOL + "rem_co.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_LCL_REMOVE_ALL, LOCALTOOL + "rem_all_co.gif");
+
+ // disabled local toolbars
+ declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_RESUME, DLCL + "resume_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_SUSPEND, DLCL + "suspend_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_TERMINATE, DLCL + "terminate_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_DISCONNECT, DLCL + "disconnect_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_STEPINTO, DLCL + "stepinto_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_STEPOVER, DLCL + "stepover_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_STEPRETURN, DLCL + "stepreturn_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_CLEAR, DLCL + "clear_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_REMOVE_TERMINATED, DLCL + "rem_all_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_QUALIFIED_NAMES, DLCL + "qnames_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_TYPE_NAMES, DLCL + "tnames_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_REMOVE, DLCL + "rem_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_DLCL_REMOVE_ALL, DLCL + "rem_all_co.gif");
+
+ // enabled local toolbars
+ declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_RESUME, ELCL + "resume_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_SUSPEND, ELCL + "suspend_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_TERMINATE, ELCL + "terminate_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_DISCONNECT, ELCL + "disconnect_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_STEPINTO, ELCL + "stepinto_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_STEPOVER, ELCL + "stepover_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_STEPRETURN, ELCL + "stepreturn_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_CLEAR, ELCL + "clear_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_REMOVE_TERMINATED, ELCL + "rem_all_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_QUALIFIED_NAMES, ELCL + "qnames_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_TYPE_NAMES, ELCL + "tnames_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_REMOVE, ELCL + "rem_co.gif");
+ declareRegistryImage(IInternalDebugUIConstants.IMG_ELCL_REMOVE_ALL, ELCL + "rem_all_co.gif");
+
+
+ //Object
+ declareRegistryImage(IDebugUIConstants.IMG_OBJS_LAUNCH_DEBUG, OBJECT + "ldebug_obj.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_OBJS_LAUNCH_RUN, OBJECT + "lrun_obj.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_OBJS_DEBUG_TARGET, OBJECT + "debugt_obj.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_OBJS_DEBUG_TARGET_TERMINATED, OBJECT + "debugtt_obj.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_OBJS_THREAD_RUNNING, OBJECT + "thread_obj.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_OBJS_THREAD_SUSPENDED, OBJECT + "threads_obj.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_OBJS_THREAD_TERMINATED, OBJECT + "threadt_obj.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_OBJS_STACKFRAME, OBJECT + "stckframe_obj.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_OBJS_BREAKPOINT, OBJECT + "brkp_obj.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_OBJS_BREAKPOINT_DISABLED, OBJECT + "brkpd_obj.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_OBJS_OS_PROCESS, OBJECT + "osprc_obj.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_OBJS_OS_PROCESS_TERMINATED, OBJECT + "osprct_obj.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_OBJS_EXPRESSION, OBJECT + "expression_obj.gif");
+
+ //Wizard Banners
+ declareRegistryImage(IDebugUIConstants.IMG_WIZBAN_DEBUG, WIZBAN + "debug_wiz.gif");
+ declareRegistryImage(IDebugUIConstants.IMG_WIZBAN_RUN, WIZBAN + "run_wiz.gif");
+ }
+
+ /**
+ * Declare an Image in the registry table.
+ * @param key The key to use when registering the image
+ * @param path The path where the image can be found. This path is relative to where
+ * this plugin class is found (i.e. typically the packages directory)
+ */
+ private final static void declareRegistryImage(String key, String path) {
+ ImageDescriptor desc= ImageDescriptor.getMissingImageDescriptor();
+ try {
+ desc= ImageDescriptor.createFromURL(makeIconFileURL(path));
+ } catch (MalformedURLException me) {
+
+ }
+ imageRegistry.put(key, desc);
+ imageDescriptors.put(key, desc);
+ }
+
+ /**
+ * Returns the ImageRegistry.
+ */
+ public static ImageRegistry getImageRegistry() {
+ if (imageRegistry == null) {
+ initializeImageRegistry();
+ }
+ return imageRegistry;
+ }
+
+ /**
+ * Initialize the image registry by declaring all of the required
+ * graphics. This involves creating JFace image descriptors describing
+ * how to create/find the image should it be needed.
+ * The image is not actually allocated until requested.
+ *
+ * Prefix conventions
+ * Wizard Banners WIZBAN_
+ * Preference Banners PREF_BAN_
+ * Property Page Banners PROPBAN_
+ * Color toolbar CTOOL_
+ * Enable toolbar ETOOL_
+ * Disable toolbar DTOOL_
+ * Local enabled toolbar ELCL_
+ * Local Disable toolbar DLCL_
+ * Object large OBJL_
+ * Object small OBJS_
+ * View VIEW_
+ * Product images PROD_
+ * Misc images MISC_
+ *
+ * Where are the images?
+ * The images (typically gifs) are found in the same location as this plugin class.
+ * This may mean the same package directory as the package holding this class.
+ * The images are declared using this.getClass() to ensure they are looked up via
+ * this plugin class.
+ * @see JFace's ImageRegistry
+ */
+ public static ImageRegistry initializeImageRegistry() {
+ imageRegistry= new ImageRegistry();
+ imageDescriptors = new HashMap(30);
+ declareImages();
+ return imageRegistry;
+ }
+
+ /**
+ * Returns the <code>Image<code> identified by the given key,
+ * or <code>null</code> if it does not exist.
+ */
+ public static Image getImage(String key) {
+ return getImageRegistry().get(key);
+ }
+
+ /**
+ * Returns the <code>ImageDescriptor<code> identified by the given key,
+ * or <code>null</code> if it does not exist.
+ */
+ public static ImageDescriptor getImageDescriptor(String key) {
+ if (imageDescriptors == null) {
+ initializeImageRegistry();
+ }
+ return (ImageDescriptor)imageDescriptors.get(key);
+ }
+
+ private static URL makeIconFileURL(String iconPath) throws MalformedURLException {
+ if (ICON_BASE_URL == null) {
+ throw new MalformedURLException();
+ }
+
+ return new URL(ICON_BASE_URL, iconPath);
+ }
+}
+
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPreferencePage.java
new file mode 100644
index 000000000..196f784b8
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugPreferencePage.java
@@ -0,0 +1,53 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.jface.preference.BooleanFieldEditor;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.SWT;
+
+/*
+ * The page for setting the default debugger preferences.
+ */
+public class DebugPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage, IDebugPreferenceConstants {
+
+ private static final String PREFIX= "debug_preferences.";
+ private static final String DEBUG= PREFIX + "debug";
+ private static final String RUN= PREFIX + "run";
+ private static final String C_OPEN= PREFIX + "console_open";
+
+ public DebugPreferencePage() {
+ super(GRID);
+
+ IPreferenceStore store= DebugUIPlugin.getDefault().getPreferenceStore();
+ setPreferenceStore(store);
+ }
+
+ /**
+ * @see FieldEditorPreferencePage#createFieldEditors
+ */
+ protected void createFieldEditors() {
+ BooleanFieldEditor debug= new BooleanFieldEditor(IDebugUIConstants.PREF_AUTO_SHOW_DEBUG_VIEW, DebugUIUtils.getResourceString(DEBUG), SWT.NONE, getFieldEditorParent());
+ BooleanFieldEditor run= new BooleanFieldEditor(IDebugUIConstants.PREF_AUTO_SHOW_PROCESS_VIEW, DebugUIUtils.getResourceString(RUN), SWT.NONE, getFieldEditorParent());
+ BooleanFieldEditor consoleOpen= new BooleanFieldEditor(CONSOLE_OPEN, DebugUIUtils.getResourceString(C_OPEN), SWT.NONE, getFieldEditorParent());
+
+ addField(debug);
+ addField(run);
+ addField(consoleOpen);
+ }
+
+ /**
+ * @see IWorkbenchPreferencePage#init
+ */
+ public void init(IWorkbench workbench) {
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java
new file mode 100644
index 000000000..6aba06e03
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java
@@ -0,0 +1,1111 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import java.util.*; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.debug.core.*; import org.eclipse.debug.core.model.*; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.debug.ui.IDebugUIEventFilter; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.text.*; import org.eclipse.jface.util.ListenerList; import org.eclipse.jface.viewers.*; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.*; import org.eclipse.ui.model.IWorkbenchAdapter; import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * The Debug UI Plugin.
+ *
+ */
+public class DebugUIPlugin extends AbstractUIPlugin implements ISelectionChangedListener,
+ IDebugEventListener,
+ ISelectionListener,
+ IDocumentListener,
+ ILaunchListener,
+ IResourceChangeListener {
+
+ /**
+ * The singleton debug plugin instance
+ */
+ private static DebugUIPlugin fgDebugUIPlugin= null;
+
+ /**
+ * The selection providers for the debug UI
+ */
+ protected List fSelectionProviders= new ArrayList(2);
+
+ /**
+ * The desktop parts that contain the selections
+ */
+ protected List fSelectionParts= new ArrayList(2);
+
+ /**
+ * The list of selection listeners for the debug UI
+ */
+ protected ListenerList fListeners= new ListenerList(2);
+
+ /**
+ * The mappings of processes to their console documents.
+ */
+ protected Map fConsoleDocuments= new HashMap(3);
+
+ /**
+ * The process that is/can provide output to the console
+ * view.
+ */
+ protected IProcess fCurrentProcess= null;
+
+ /**
+ * Colors to be used in the debug ui
+ */
+ protected ColorManager fColorManager= new ColorManager();
+
+ /**
+ * The most recent launch
+ */
+ protected ILaunch fRecentLaunch = null;
+
+ protected final static int MAX_HISTORY_SIZE= 5;
+ /**
+ * The most recent debug launches
+ */
+ protected ILaunch[] fDebugHistory = new ILaunch[MAX_HISTORY_SIZE];
+
+ /**
+ * The launched resources for the most recent debug launches.
+ * The position of each resource corresponds to the position of the
+ * associated launch in fDebugHistory.
+ */
+ protected IResource[] fDebugHistoryResources = new IResource[MAX_HISTORY_SIZE];
+
+ /**
+ * The most recent run launches
+ */
+ protected ILaunch[] fRunHistory = new ILaunch[MAX_HISTORY_SIZE];
+
+ /**
+ * The launched resources for the most recent run launches
+ * The position of each resource corresponds to the position of the
+ * associated launch in fRunHistory.
+ */
+ protected IResource[] fRunHistoryResources = new IResource[MAX_HISTORY_SIZE];
+
+ /**
+ * Event filters for the debug UI
+ */
+ protected ListenerList fEventFilters = new ListenerList(2);
+
+ /**
+ * The visitor used to traverse resource deltas and keep the run & debug
+ * histories in synch with resource deletions.
+ */
+ protected static ResourceDeletedVisitor fgDeletedVisitor;
+
+
+ /**
+ * Visitor for handling resource deltas
+ */
+ class ResourceDeletedVisitor implements IResourceDeltaVisitor {
+
+ /**
+ * @see IResourceDeltaVisitor
+ */
+ public boolean visit(IResourceDelta delta) {
+ if (delta.getKind() != IResourceDelta.REMOVED) {
+ return true;
+ }
+ IResource resource= delta.getResource();
+ updateHistoriesForDeletedResource(resource);
+ return true;
+ }
+ }
+
+ /**
+ * Constructs the debug UI plugin
+ */
+ public DebugUIPlugin(IPluginDescriptor descriptor) {
+ super(descriptor);
+ fgDebugUIPlugin= this;
+ }
+
+ /**
+ * On a SUSPEND event, switch to the perspective specified
+ * by the launcher.
+ *
+ * @see IDebugEventListener
+ */
+ public void handleDebugEvent(final DebugEvent event) {
+ // open the debugger if this is a suspend event and the debugger is not yet open
+ // and the preferences are set to switch
+ if (event.getKind() == DebugEvent.SUSPEND) {
+ Display display= getDisplay();
+ if (display != null) {
+ display.asyncExec(new Runnable() {
+ public void run() {
+ if (showSuspendEvent(event)) {
+ if (getPreferenceStore().getBoolean(IDebugUIConstants.PREF_AUTO_SHOW_DEBUG_VIEW)) {
+ switchToDebugPerspective0(event.getSource(), ILaunchManager.DEBUG_MODE, true);
+ }
+ }
+ }
+ });
+ }
+ }
+ }
+
+ /**
+ * Poll the filters to determine if the event should be shown
+ */
+ protected boolean showSuspendEvent(DebugEvent event) {
+ Object s= event.getSource();
+ if (s instanceof ITerminate) {
+ if (((ITerminate)s).isTerminated()) {
+ return false;
+ }
+ }
+ if (!fEventFilters.isEmpty()) {
+ Object[] filters = fEventFilters.getListeners();
+ for (int i = 0; i < filters.length; i++) {
+ if (!((IDebugUIEventFilter)filters[i]).showDebugEvent(event)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Poll the filters to determine if the launch should be shown
+ */
+ protected boolean showLaunch(ILaunch launch) {
+ if (!fEventFilters.isEmpty()) {
+ Object[] filters = fEventFilters.getListeners();
+ for (int i = 0; i < filters.length; i++) {
+ if (!((IDebugUIEventFilter)filters[i]).showLaunch(launch)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+
+ /**
+ * Opens the a workbench page with the layout specified by the launcher
+ * if it had not already been opened in any workbench window.
+ * If the switch is suspend triggered, a switch only occurs if
+ * a debug view is not present in any workbench window.
+ */
+ private void switchToDebugPerspective0(Object source, String mode, boolean suspendTriggered) {
+ String layoutId= getLauncherPerspective(source);
+ Object[] results= findDebugPresentation(source, mode, layoutId, suspendTriggered);
+ if (results == null) {
+ return;
+ }
+ IWorkbenchWindow window= null;
+ IWorkbenchPage page= null;
+ if (results.length == 0) {
+ window= getActiveWorkbenchWindow();
+ } else {
+ window= (IWorkbenchWindow)results[0];
+ page= (IWorkbenchPage)results[1];
+ }
+
+ page= activateDebugLayoutPage(page, window, layoutId);
+ // bring debug to the front
+ activateDebuggerPart(source, page, mode);
+ }
+
+ /**
+ * Debug ui thread safe access to a display
+ */
+ protected Display getDisplay() {
+ IWorkbench workbench= getWorkbench();
+ if (workbench != null) {
+ IWorkbenchWindow[] windows= workbench.getWorkbenchWindows();
+ Display display= null;
+ if (windows != null && windows.length > 0) {
+ return windows[0].getShell().getDisplay();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Activates (may include creates) a debugger part based on the mode
+ * in the specified page.
+ */
+ protected void activateDebuggerPart(final Object source, IWorkbenchPage page, String mode) {
+ LaunchesView debugPart= null;
+ try {
+ if (mode == ILaunchManager.DEBUG_MODE) {
+ debugPart= (LaunchesView) page.showView(IDebugUIConstants.ID_DEBUG_VIEW);
+ } else {
+ debugPart= (LaunchesView) page.showView(IDebugUIConstants.ID_PROCESS_VIEW);
+ }
+ } catch (PartInitException pie) {
+ IStatus status= new Status(IStatus.ERROR, getDescriptor().getUniqueIdentifier(), IDebugStatusConstants.INTERNAL_ERROR, pie.getMessage(), pie);
+ DebugUIUtils.errorDialog(page.getWorkbenchWindow().getShell(), "debug_ui_plugin.switch_perspective.error.", status);
+ }
+ if (debugPart != null) {
+ final LaunchesView dp= debugPart;
+ Display display= getDisplay();
+ display.asyncExec(new Runnable() {
+ public void run() {
+ dp.autoExpand(source);
+ }
+ });
+ }
+ }
+
+ /**
+ * Checks all active pages for a debugger view.
+ * If no debugger view is found, looks for a page in any window
+ * that has the specified debugger layout id.
+ *
+ * @return an Object array that
+ * is null if a debugger part has been found
+ * is empty if no page could be found with the debugger layout id
+ * has two elements if a debugger layout page is found
+ * first element is a window, the second is a page
+ */
+ protected Object[] findDebugPresentation(final Object source, String mode, String layoutId, boolean suspendTriggered) {
+ IWorkbenchWindow[] windows= getWorkbench().getWorkbenchWindows();
+ IWorkbenchWindow activeWindow= getActiveWorkbenchWindow();
+ int i;
+ if (suspendTriggered) {
+ final LaunchesView part= findDebugPart(activeWindow, mode);
+ if (part != null) {
+ Display display= getDisplay();
+ display.asyncExec(new Runnable() {
+ public void run() {
+ part.autoExpand(source);
+ }
+ });
+ return null;
+ }
+ //check active pages for debugger view
+ for (i= 0; i < windows.length; i++) {
+ IWorkbenchWindow window= windows[i];
+ final LaunchesView lPart= findDebugPart(window, mode);
+ if (lPart != null) {
+ Display display= getDisplay();
+ display.asyncExec(new Runnable() {
+ public void run() {
+ lPart.autoExpand(source);
+ }
+ });
+ return null;
+ }
+ }
+ }
+
+ //check the pages for the debugger layout.
+ //check the pages of the active window first
+ IWorkbenchPage page= null;
+ IWorkbenchPage[] pages= activeWindow.getPages();
+ for (int j= 0; j < pages.length; j++) {
+ if (pages[j].getPerspective().getId().equals(layoutId)) {
+ page= pages[j];
+ break;
+ }
+ }
+ if (page != null) {
+ return new Object[]{activeWindow, page};
+ }
+
+ i= 0;
+ i: for (i= 0; i < windows.length; i++) {
+ IWorkbenchWindow window= windows[i];
+ if (window.equals(activeWindow)) {
+ continue;
+ }
+ pages= window.getPages();
+
+ j: for (int j= 0; j < pages.length; j++) {
+ if (pages[j].getPerspective().getId().equals(layoutId)) {
+ page= pages[j];
+ break i;
+ }
+ }
+ }
+
+ if (page != null) {
+ return new Object[]{windows[i], page};
+ }
+
+ return new Object[0];
+ }
+
+ /**
+ * Returns a <code>true</code> if the specified window contains a debugger part for the
+ * specified debug mode.
+ */
+ protected LaunchesView findDebugPart(IWorkbenchWindow window, String mode) {
+ IWorkbenchPage activePage= window.getActivePage();
+ IViewPart debugPart= null;
+ if (mode == ILaunchManager.DEBUG_MODE) {
+ debugPart= activePage.findView(IDebugUIConstants.ID_DEBUG_VIEW);
+ } else {
+ debugPart= activePage.findView(IDebugUIConstants.ID_PROCESS_VIEW);
+ }
+ return (LaunchesView)debugPart;
+ }
+
+ /**
+ * Activates (may include creates) and returns a debugger page with the
+ * specified layout in the supplied window.
+ *
+ * @return the page that was activated (and possibly created)
+ */
+ protected IWorkbenchPage activateDebugLayoutPage(IWorkbenchPage page, IWorkbenchWindow window, String layoutId) {
+ window.getShell().forceFocus();
+ if (page == null) {
+ try {
+ IContainer root= ResourcesPlugin.getWorkspace().getRoot();
+ page= window.openPage(layoutId, root);
+ } catch (WorkbenchException e) {
+ IStatus status= new Status(IStatus.ERROR, getDescriptor().getUniqueIdentifier(), IDebugStatusConstants.INTERNAL_ERROR, e.getMessage(), e);
+ DebugUIUtils.errorDialog(window.getShell(), "debug_ui_plugin.switch_perspective.error.", status);
+ return null;
+ }
+ } else {
+ window.setActivePage(page);
+ }
+ return page;
+ }
+ /**
+ * Returns the launcher perspective specified in the launcher
+ * associated with the source of a <code>DebugEvent</code>
+ */
+ protected String getLauncherPerspective(Object eventSource) {
+ ILaunch launch= null;
+ if (eventSource instanceof IDebugElement) {
+ launch= ((IDebugElement) eventSource).getLaunch();
+ } else
+ if (eventSource instanceof ILaunch) {
+ launch= (ILaunch) eventSource;
+ }
+ ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
+ String perspectiveID= launch == null ? null : launch.getLauncher().getPerspectiveIdentifier();
+ if (perspectiveID == null) {
+ perspectiveID= IDebugUIConstants.ID_DEBUG_PERSPECTIVE;
+ }
+ return perspectiveID;
+ }
+
+ /**
+ * Returns the singleton instance of the debug plugin.
+ */
+ public static DebugUIPlugin getDefault() {
+ return fgDebugUIPlugin;
+ }
+
+ public static IWorkbenchWindow getActiveWorkbenchWindow() {
+ return getDefault().getWorkbench().getActiveWorkbenchWindow();
+ }
+
+ /**
+ * Creates an extension. If the extension plugin has not
+ * been loaded a busy cursor will be activated during the duration of
+ * the load.
+ *
+ * @param element the config element defining the extension
+ * @param classAttribute the name of the attribute carrying the class
+ * @returns the extension object
+ */
+public static Object createExtension(final IConfigurationElement element, final String classAttribute) throws CoreException {
+ // If plugin has been loaded create extension.
+ // Otherwise, show busy cursor then create extension.
+ IPluginDescriptor plugin = element.getDeclaringExtension().getDeclaringPluginDescriptor();
+ if (plugin.isPluginActivated()) {
+ return element.createExecutableExtension(classAttribute);
+ } else {
+ final Object [] ret = new Object[1];
+ final CoreException [] exc = new CoreException[1];
+ BusyIndicator.showWhile(null, new Runnable() {
+ public void run() {
+ try {
+ ret[0] = element.createExecutableExtension(classAttribute);
+ } catch (CoreException e) {
+ exc[0] = e;
+ }
+ }
+ });
+ if (exc[0] != null) {
+ throw exc[0];
+ }
+ else {
+ return ret[0];
+ }
+ }
+}
+
+ protected ImageRegistry createImageRegistry() {
+ return DebugPluginImages.initializeImageRegistry();
+ }
+
+ /**
+ * Shuts down this plug-in and discards all plug-in state.
+ * If a plug-in has been started, this method is automatically
+ * invoked by the platform core when the workbench is closed.
+ * <p>
+ * This method is intended to perform simple termination
+ * of the plug-in environment. The platform may terminate invocations
+ * that do not complete in a timely fashion.
+ * </p><p>
+ * By default this will save the preference and dialog stores (if they are in use).
+ * </p><p>
+ * Subclasses which override this method must call super first.
+ * </p>
+ */
+ public void shutdown() throws CoreException {
+ super.shutdown();
+ removeSelectionListener(this);
+ DebugPlugin.getDefault().removeDebugEventListener(this);
+ ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
+ launchManager.removeLaunchListener(this);
+ ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+ fColorManager.dispose();
+ Iterator docs= fConsoleDocuments.values().iterator();
+ while (docs.hasNext()) {
+ ConsoleDocument doc= (ConsoleDocument)docs.next();
+ doc.removeDocumentListener(this);
+ doc.close();
+ }
+ }
+
+ /**
+ * Starts up this plug-in.
+ * <p>
+ * This method is automatically invoked by the platform core
+ * the first time any code in the plug-in is executed.
+ * <p>
+ */
+ public void startup() throws CoreException {
+ DebugPlugin.getDefault().addDebugEventListener(this);
+ ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
+ launchManager.addLaunchListener(this);
+ addSelectionListener(this);
+ ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
+ //set up the docs for launches already registered
+ ILaunch[] launches= launchManager.getLaunches();
+ for (int i = 0; i < launches.length; i++) {
+ launchRegistered(launches[i]);
+ }
+ }
+
+ /**
+ * Adds the selection provider for the debug UI.
+ */
+ public void addSelectionProvider(ISelectionProvider provider, IWorkbenchPart part) {
+ fSelectionProviders.add(provider);
+ fSelectionParts.add(part);
+ provider.addSelectionChangedListener(this);
+ }
+
+ /**
+ * Removes the selection provider from the debug UI.
+ */
+ public void removeSelectionProvider(ISelectionProvider provider, IWorkbenchPart part) {
+ fSelectionProviders.remove(provider);
+ fSelectionParts.remove(part);
+ provider.removeSelectionChangedListener(this);
+ selectionChanged(null);
+ }
+
+ /**
+ * Adds an <code>ISelectionListener</code> to the debug selection manager.
+ */
+ public void addSelectionListener(ISelectionListener l) {
+ fListeners.add(l);
+ }
+
+ /**
+ * Removes an <code>ISelectionListener</code> from the debug selection manager.
+ */
+ public synchronized void removeSelectionListener(ISelectionListener l) {
+ fListeners.remove(l);
+ }
+
+ /**
+ * Selection has changed in the debug selection provider.
+ * Notify the listeners.
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ Object[] copiedListeners= fListeners.getListeners();
+
+ ISelection selection= null;
+ ISelectionProvider provider= null;
+ IWorkbenchPart part= null;
+ if (event != null) {
+ selection= event.getSelection();
+ provider= (ISelectionProvider) event.getSource();
+ int index= fSelectionProviders.indexOf(provider);
+ if (index == -1) {
+ return;
+ }
+ part= (IWorkbenchPart) fSelectionParts.get(index);
+ }
+ for (int i= 0; i < copiedListeners.length; i++) {
+ ((ISelectionListener)copiedListeners[i]).selectionChanged(part, selection);
+ }
+ }
+
+ /**
+ * Sets the console document for the specified process.
+ * If the document is <code>null</code> the mapping for the
+ * process is removed.
+ */
+ public void setConsoleDocument(IProcess process, IDocument doc) {
+ if (doc == null) {
+ fConsoleDocuments.remove(process);
+ } else {
+
+ fConsoleDocuments.put(process, doc);
+ }
+ }
+
+ /**
+ * Returns the correct document for the process, determining the current
+ * process if required (process argument is null).
+ */
+ public IDocument getConsoleDocument(IProcess process) {
+ return getConsoleDocument(process, true);
+ }
+ /**
+ * Returns the correct document for the process, determining the current
+ * process if specified.
+ */
+ public IDocument getConsoleDocument(IProcess process, boolean determineCurrentProcess) {
+ if (process != null) {
+ IDocument document= (IDocument) fConsoleDocuments.get(process);
+ if (document != null) {
+ return document;
+ }
+ document= new ConsoleDocument((IProcess) process);
+ fConsoleDocuments.put(process, document);
+ return document;
+ }
+
+ if (determineCurrentProcess) {
+ if (getCurrentProcess() == null) {
+ setCurrentProcess(determineCurrentProcess());
+ }
+
+ IProcess currentProcess= getCurrentProcess();
+ if (currentProcess != null) {
+ IDocument document= (IDocument) fConsoleDocuments.get(currentProcess);
+ if (document != null) {
+ return document;
+ }
+ document= new ConsoleDocument(currentProcess);
+ fConsoleDocuments.put(currentProcess, document);
+ return document;
+ }
+ }
+
+ return new ConsoleDocument(null);
+ }
+
+ /**
+ * Returns the color manager to use in the debug UI
+ */
+ public ColorManager getColorManager() {
+ return fColorManager;
+ }
+
+ /**
+ * @see AbstractUIPlugin#initializeDefaultPreferences
+ */
+ protected void initializeDefaultPreferences(IPreferenceStore prefs) {
+ prefs.setDefault(IDebugUIConstants.PREF_AUTO_SHOW_DEBUG_VIEW, true);
+ prefs.setDefault(IDebugUIConstants.PREF_AUTO_SHOW_PROCESS_VIEW, true);
+ prefs.setDefault(IDebugPreferenceConstants.CONSOLE_OPEN, true);
+
+ PreferenceConverter.setDefault(prefs, IDebugPreferenceConstants.CONSOLE_SYS_OUT_RGB, new RGB(0, 0, 255));
+ PreferenceConverter.setDefault(prefs, IDebugPreferenceConstants.CONSOLE_SYS_IN_RGB, new RGB(0, 200, 125));
+ PreferenceConverter.setDefault(prefs, IDebugPreferenceConstants.CONSOLE_SYS_ERR_RGB, new RGB(255, 0, 0));
+ }
+
+ /**
+ * @see ISelectionListener
+ */
+ public void selectionChanged(IWorkbenchPart part, ISelection sel) {
+ if (!(part instanceof LaunchesView)) {
+ return;
+ }
+
+ IWorkbenchWindow window= getActiveWorkbenchWindow();
+ IWorkbenchPage page= window.getActivePage();
+ if (page == null) {
+ return;
+ }
+ Object input= null;
+ if (sel instanceof IStructuredSelection) {
+ input= ((IStructuredSelection) sel).getFirstElement();
+ }
+ ConsoleView consoleView= (ConsoleView)page.findView(IDebugUIConstants.ID_CONSOLE_VIEW);
+ if (input == null) {
+ if (consoleView != null && getCurrentProcess() != null) {
+ consoleView.setViewerInput(getCurrentProcess());
+ } else {
+ IProcess currentProcess= determineCurrentProcess();
+ if (currentProcess == null) {
+ setCurrentProcess(currentProcess);
+ if (consoleView != null) {
+ consoleView.setViewerInput(currentProcess);
+ }
+ }
+ }
+ } else {
+ IProcess processFromInput= getProcessFromInput(input);
+ if (processFromInput == null) {
+ consoleView.setViewerInput(null, false);
+ setCurrentProcess(null);
+ return;
+ }
+ if (!processFromInput.equals(getCurrentProcess())) {
+ setCurrentProcess(processFromInput);
+ if (consoleView != null) {
+ consoleView.setViewerInput(processFromInput);
+ } else {
+ IDocument doc= getConsoleDocument(processFromInput);
+ if (doc != null) {
+ doc.addDocumentListener(this);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the current process to use as input for the console view.
+ * Returns the first <code>IProcess</code> that has a launch and is associated with a debug target.
+ * If no debug targets, returns the first <code>IProcess</code> found in the launch manager.
+ * Can return <code>null</code>.
+ */
+ public IProcess determineCurrentProcess() {
+
+ ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
+ IDebugTarget[] debugTargets= launchManager.getDebugTargets();
+ for (int i = 0; i < debugTargets.length; i++) {
+ IDebugTarget target= debugTargets[i];
+ IProcess process= target.getProcess();
+ if (process != null && process.getLaunch() != null) {
+ return process;
+ }
+ }
+
+ IProcess[] processes= launchManager.getProcesses();
+ if ((processes != null) && (processes.length > 0)) {
+ return processes[0];
+ }
+
+ return null;
+ }
+
+ protected IProcess getProcessFromInput(Object input) {
+ IProcess processInput= null;
+ if (input instanceof IProcess) {
+ processInput= (IProcess) input;
+ } else
+ if (input instanceof ILaunch) {
+ IDebugTarget target= ((ILaunch) input).getDebugTarget();
+ if (target != null) {
+ processInput= target.getProcess();
+ } else {
+ IProcess[] processes= ((ILaunch) input).getProcesses();
+ if ((processes != null) && (processes.length > 0)) {
+ processInput= processes[0];
+ }
+ }
+ } else
+ if (input instanceof IDebugElement) {
+ processInput= ((IDebugElement) input).getProcess();
+ }
+
+ if ((processInput == null) || (processInput.getLaunch() == null)) {
+ return null;
+ } else {
+ return processInput;
+ }
+ }
+
+ /**
+ * @see IDocumentListener
+ */
+ public void documentAboutToBeChanged(final DocumentEvent e) {
+ // if the prefence is set, show the conosle
+ if (!getPreferenceStore().getBoolean(IDebugPreferenceConstants.CONSOLE_OPEN)) {
+ return;
+ }
+
+ Display display= getDisplay();
+ if (display != null) {
+ display.asyncExec(new Runnable() {
+ public void run() {
+ IWorkbenchWindow window = getActiveWorkbenchWindow();
+ if (window != null) {
+ IWorkbenchPage page= window.getActivePage();
+ if (page != null) {
+ try { // show the console
+ ConsoleView consoleView= (ConsoleView)page.findView(IDebugUIConstants.ID_CONSOLE_VIEW);
+ if(consoleView == null) {
+ IWorkbenchPart activePart= page.getActivePart();
+ consoleView= (ConsoleView)page.showView(IDebugUIConstants.ID_CONSOLE_VIEW);
+ consoleView.setViewerInput(getCurrentProcess());
+ //restore focus stolen by the creation of the console
+ page.activate(activePart);
+ } else {
+ page.bringToTop(consoleView);
+ }
+ } catch (PartInitException pie) {
+ }
+ }
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * @see IDocumentListener
+ */
+ public void documentChanged(DocumentEvent e) {
+ }
+
+ public IProcess getCurrentProcess() {
+ return fCurrentProcess;
+ }
+
+ public void setCurrentProcess(IProcess process) {
+ if (fCurrentProcess != null) {
+ getConsoleDocument(fCurrentProcess).removeDocumentListener(this);
+ }
+ fCurrentProcess= process;
+ if (fCurrentProcess != null) {
+ getConsoleDocument(fCurrentProcess).addDocumentListener(this);
+ }
+ }
+
+ /**
+ * @see IResourceChangeListener
+ */
+ public void resourceChanged(IResourceChangeEvent event) {
+ IResourceDelta delta= event.getDelta();
+ if (delta != null) {
+ try {
+ if (fgDeletedVisitor == null) {
+ fgDeletedVisitor= new ResourceDeletedVisitor();
+ }
+ delta.accept(fgDeletedVisitor, false);
+ } catch (CoreException ce) {
+ DebugUIUtils.logError(ce);
+ }
+ }
+ }
+
+
+ /**
+ * @see ILaunchListener
+ */
+ public void launchDeregistered(ILaunch launch) {
+ Display display= getDisplay();
+ if (display != null) {
+ display.syncExec(new Runnable () {
+ public void run() {
+ IProcess currentProcess= getCurrentProcess();
+ if (currentProcess != null && currentProcess.getLaunch() == null) {
+ ConsoleDocument doc= (ConsoleDocument)getConsoleDocument(currentProcess);
+ doc.removeDocumentListener(DebugUIPlugin.this);
+ doc.close();
+ setConsoleDocument(currentProcess, null);
+ fCurrentProcess= null;
+ }
+ }
+ });
+ }
+ setCurrentProcess(determineCurrentProcess());
+ setConsoleInput(getCurrentProcess());
+ }
+
+ /**
+ * Must not assume that will only be called from the UI thread.
+ *
+ * @see ILaunchListener
+ */
+ public void launchRegistered(final ILaunch launch) {
+ fRecentLaunch = launch;
+ updateHistories(launch);
+ switchToDebugPerspectiveIfPreferred(launch);
+
+ IProcess newProcess= null;
+
+ IDebugTarget target= launch.getDebugTarget();
+ if (target != null) {
+ newProcess= target.getProcess();
+ } else {
+ IProcess[] processes= launch.getProcesses();
+ if ((processes != null) && (processes.length > 0)) {
+ newProcess= processes[processes.length - 1];
+ }
+ }
+
+ Display display= getDisplay();
+ if (display != null) {
+ display.syncExec(new Runnable () {
+ public void run() {
+ IProcess[] processes= launch.getProcesses();
+ if (processes != null) {
+ for (int i= 0; i < processes.length; i++) {
+ ConsoleDocument doc= new ConsoleDocument(processes[i]);
+ doc.startReading();
+ setConsoleDocument(processes[i], doc);
+ }
+ }
+ }
+ });
+ }
+
+ setCurrentProcess(newProcess);
+ setConsoleInput(newProcess);
+ }
+
+ /**
+ * In a thread safe manner, switches the workbench to the debug perspective
+ * if the user preferences specify to do so.
+ */
+ protected void switchToDebugPerspectiveIfPreferred(final ILaunch launch) {
+ Display display= getDisplay();
+ if (display != null) {
+ display.asyncExec(new Runnable() {
+ public void run() {
+ String mode= launch.getLaunchMode();
+ boolean isDebug= mode.equals(ILaunchManager.DEBUG_MODE);
+ boolean doSwitch= userPreferenceToSwitchPerspective(isDebug);
+ if (doSwitch) {
+ if (showLaunch(launch)) {
+ switchToDebugPerspective0(launch, mode, false);
+ }
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * Must be called in the UI thread
+ */
+ public boolean userPreferenceToSwitchPerspective(boolean isDebug) {
+ IPreferenceStore prefs= getPreferenceStore();
+ return isDebug ? prefs.getBoolean(IDebugUIConstants.PREF_AUTO_SHOW_DEBUG_VIEW) : prefs.getBoolean(IDebugUIConstants.PREF_AUTO_SHOW_PROCESS_VIEW);
+ }
+
+ /**
+ * Sets the input console view viewer input for all
+ * consoles that exist in a thread safe manner.
+ */
+ protected void setConsoleInput(final IProcess process) {
+ Display display= getDisplay();
+ if (display != null) {
+ display.asyncExec(new Runnable() {
+ public void run() {
+ IWorkbenchWindow[] windows= getWorkbench().getWorkbenchWindows();
+ for (int j= 0; j < windows.length; j++) {
+ IWorkbenchWindow window= windows[j];
+ IWorkbenchPage[] pages= window.getPages();
+ if (pages != null) {
+ for (int i= 0; i < pages.length; i++) {
+ IWorkbenchPage page= pages[i];
+ ConsoleView consoleView= (ConsoleView)page.findView(IDebugUIConstants.ID_CONSOLE_VIEW);
+ if (consoleView != null) {
+ consoleView.setViewerInput(process);
+ }
+ }
+ }
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * Returns the collection of most recent debug launches, which
+ * can be empty.
+ *
+ * @return an array of launches
+ */
+ public ILaunch[] getDebugHistory() {
+ return fDebugHistory;
+ }
+
+ /**
+ * Returns the set of most recent run launches, which can be empty.
+ *
+ * @return an array of launches
+ */
+ public ILaunch[] getRunHistory() {
+ return fRunHistory;
+ }
+
+ /**
+ * Returns the most recent launch, or <code>null</code> if there
+ * have been no launches.
+ *
+ * @return the last launch, or <code>null</code> if none
+ */
+ public ILaunch getLastLaunch() {
+ return fRecentLaunch;
+ }
+
+ /**
+ * Adjust all histories for the given deleted resource.
+ */
+ protected void updateHistoriesForDeletedResource(IResource deletedResource) {
+ updateHistoryForDeletedResource(deletedResource, fDebugHistory, fDebugHistoryResources);
+ updateHistoryForDeletedResource(deletedResource, fRunHistory, fRunHistoryResources);
+ }
+
+ /**
+ * Remove the given resource from the resource history, and remove the corresponding
+ * launch from the launch history.
+ */
+ protected void updateHistoryForDeletedResource(IResource deletedResource, ILaunch[] launchHistory, IResource[] resourceHistory) {
+ int resourceLength = resourceHistory.length;
+ for (int i = 0; i < resourceLength; i++) {
+ if (deletedResource.equals(resourceHistory[i])) {
+ if (i < resourceLength - 1) {
+ System.arraycopy(resourceHistory, i + 1, resourceHistory, i, resourceLength - (i + 1));
+ System.arraycopy(launchHistory, i + 1, launchHistory, i, resourceLength - (i + 1));
+ }
+ resourceHistory[resourceLength - 1]= null;
+ launchHistory[resourceLength - 1]= null;
+ }
+ }
+ }
+
+ /**
+ * Given a launch, try to add it to both of the run & debug histories.
+ */
+ protected void updateHistories(ILaunch launch) {
+ if (isVisible(launch.getLauncher())) {
+ IResource resource= getResourceForLaunch(launch);
+ String launchMode= launch.getLaunchMode();
+ String otherLaunchMode= launchMode == ILaunchManager.DEBUG_MODE ? ILaunchManager.RUN_MODE : ILaunchManager.DEBUG_MODE;
+ ILaunch[] history= launchMode == ILaunchManager.DEBUG_MODE ? fDebugHistory : fRunHistory;
+ ILaunch[] otherHistory= otherLaunchMode == ILaunchManager.RUN_MODE ? fRunHistory : fDebugHistory;
+ IResource[] resourceHistory= launchMode == ILaunchManager.DEBUG_MODE ? fDebugHistoryResources : fRunHistoryResources;
+ IResource[] otherResourceHistory= otherLaunchMode == ILaunchManager.RUN_MODE ? fRunHistoryResources : fDebugHistoryResources;
+ updateHistory(history, launchMode, launch, resource, resourceHistory);
+ updateHistory(otherHistory, otherLaunchMode, launch, resource, otherResourceHistory);
+ }
+ }
+
+ /**
+ * Add the given launch to the given history (whose mode is specified by
+ * historyMode) if the launcher used by the launch supports the history mode.
+ */
+ protected void updateHistory(ILaunch[] history, String historyMode, ILaunch launch, IResource resource, IResource[] resourceHistory) {
+
+ // First make sure the launcher used supports the mode of the history list
+ ILauncher launcher= launch.getLauncher();
+ Set supportedLauncherModes= launcher.getModes();
+ if (!supportedLauncherModes.contains(historyMode)) {
+ return;
+ }
+
+ // Look for the launch in the history list
+ int index;
+ boolean found= false;
+ for (index= 0; index < history.length; index++) {
+ ILaunch historyLaunch= history[index];
+ if (historyLaunch != null && historyLaunch.getElement().equals(launch.getElement()) &&
+ launcher.equals(historyLaunch.getLauncher())) {
+ found= true;
+ break;
+ }
+ }
+
+ //It's already listed as the most recent launch, so nothing to do
+ if (index == 0 && found) {
+ return;
+ }
+
+ // It's in the history, but not the most recent, so make it the most recent
+ if (found) {
+ //removes from old position
+ System.arraycopy(history, index + 1, history, index, history.length - (index + 1));
+ System.arraycopy(resourceHistory, index + 1, resourceHistory, index, resourceHistory.length - (index + 1));
+ }
+
+ // It's not in the history, so add it to the beginning, removing the last
+ // launch in the list if the list is already at maximum size
+ System.arraycopy(history, 0, history, 1, history.length - 1);
+ System.arraycopy(resourceHistory, 0, resourceHistory, 1, resourceHistory.length - 1);
+ history[0]= launch;
+ resourceHistory[0]= resource;
+ }
+
+ /**
+ * Return the IResource adapter associated with the given launch, or null
+ * if there is none.
+ */
+ protected IResource getResourceForLaunch(ILaunch launch) {
+ Object candidate= launch.getElement();
+ IResource resource= null;
+ // If the launched element doesn't have an IResource adapter, work up the parental
+ // chain until we find someone who does
+ while (candidate instanceof IAdaptable) {
+ IResource candidateResource= (IResource)((IAdaptable)candidate).getAdapter(IResource.class);
+ if (candidateResource != null) {
+ return candidateResource;
+ }
+ IWorkbenchAdapter workbenchAdapter= (IWorkbenchAdapter)((IAdaptable)candidate).getAdapter(IWorkbenchAdapter.class);
+ if (workbenchAdapter != null) {
+ candidate= workbenchAdapter.getParent(candidate);
+ } else {
+ return null;
+ }
+ }
+ return resource;
+ }
+
+ public void addEventFilter(IDebugUIEventFilter filter) {
+ fEventFilters.add(filter);
+ }
+
+ /**
+ * Removes the event filter after the current set
+ * of events posted to the queue have been processed.
+ */
+ public void removeEventFilter(final IDebugUIEventFilter filter) {
+ Display display= getDisplay();
+ Runnable runnable = new Runnable() {
+ public void run() {
+ fEventFilters.remove(filter);
+ }
+ };
+ display.asyncExec(runnable);
+ }
+
+ /**
+ * Returns whether the given launcher should be visible in the UI.
+ * If a launcher is not visible, it will not appear
+ * in the UI - i.e. not as a default launcher, not in the run/debug
+ * drop downs, and not in the launch history.
+ * Based on the public attribute.
+ */
+ public boolean isVisible(ILauncher launcher) {
+ IConfigurationElement e = launcher.getConfigurationElement();
+ String publc= e.getAttribute("public");
+ if (publc == null || publc.equals("true")) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns whether the given launcher specifies a wizard.
+ */
+ public boolean hasWizard(ILauncher launcher) {
+ IConfigurationElement e = launcher.getConfigurationElement();
+ return e.getAttribute("wizard") != null;
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIResources.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIResources.properties
new file mode 100644
index 000000000..09ce262dc
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIResources.properties
@@ -0,0 +1,252 @@
+##############################################################
+# Licensed Materials - Property of IBM,
+# WebSphere Studio Workbench
+# (c) Copyright IBM Corp 2001
+##############################################################
+
+##############################################################
+# DebugUIPlugin
+##############################################################
+debug_ui_plugin.switch_perspective.error.title=Problem Switching to the Debug Perspective
+debug_ui_plugin.switch_perspective.error.message=Exceptions occurred switching to the specified debug layout
+
+##############################################################
+# Console property page
+##############################################################
+console_preferences.description=Console text color settings.
+console_preferences.out=Standard Out:
+console_preferences.err=Standard Error:
+console_preferences.in=Standard In:
+console_preferences.font=Console font setting:
+
+##############################################################
+# Debug preference page
+##############################################################
+debug_preferences.debug=Switch to Debug view when debugging
+debug_preferences.run=Switch to Process view when running
+debug_preferences.console_open=Show console when there is program output
+
+##############################################################
+# Launcher property page
+##############################################################
+launcher_preferences.description=Select default launcher
+launcher_preferences.run_debug=Run/Debug
+launcher_preferences.none=none
+launcher_preferences.error.title=Launcher property page
+launcher_preferences.error.message=Exceptions occurred saving the launcher preferences
+
+##############################################################
+# Launch wizard
+##############################################################
+launch_wizard.title.debug=Debug
+launch_wizard.title.run=Run
+
+##############################################################
+# Launch wizard project page
+##############################################################
+launch_wizard_project_page.title=Select Project
+launch_wizard_project_page.select_elements= Select a project for the launch context.
+launch_wizard_project_page.select_error_elements=No projects available.
+launch_wizard_project_page.pattern_label=Enter a pattern to select a range of projects
+
+##############################################################
+# Launch wizard page
+##############################################################
+launch_wizard_page.title=Select Launcher
+launch_wizard_page.launcher= Select a launcher:
+launch_wizard_page.select_error_launcher=No launchers registered.
+launch_wizard_page.default_launcher=Set as &default launcher
+
+launch_wizard_node.error.title=Problem Opening Wizard
+launch_wizard_node.error.message=The selected wizard could not be started.
+
+##############################################################
+# Action resources
+##############################################################
+
+add_to_inspector_action.text=&Inspect
+add_to_inspector_action.toolTipText=Adds selected variables to inspector
+
+change_variable_value_action.text=&Change Variable Value
+change_variable_value_action.description=Changes the value of a simple type variable
+change_variable_value_action.error.title=Setting variable value
+change_variable_value_action.error.message=Setting the variable value failed
+change_variable_value_action.dialog.message=Enter the new value for the variable \"{0}\"
+change_variable_value_action.dialog.invalid=Value is not valid for the variable \"{0}\"
+change_variable_value_action.dialog.title=Change Variable Value
+
+clear_output_action.text=&Clear Output
+clear_output_action.toolTipText=Clear output
+
+copy_action.label=Copy@Ctrl+C
+copy_action.tooltip=Copy
+copy_action.description=Copy
+
+copy_to_clipboard_action.text=&Copy Stack
+copy_to_clipboard_action.toolTipText=Copy to clipboard
+##only needed due to inheritance
+copy_to_clipboard_action.status=
+
+cut_action.label=Cut@Ctrl+X
+cut_action.tooltip=Cut
+cut_action.description=Cut
+
+debug_action.text=&Debug@F9
+debug_action.toolTipText=Debug
+
+disconnect_action.text=&Disconnect
+disconnect_action.toolTipText=Disconnect
+disconnect_action.status=Disconnect failed
+disconnect_action.error.title=Disconnect
+disconnect_action.error.message=Exceptions occurred attempting to disconnect
+
+enable_disable_breakpoint_action.text=&Enable/Disable
+enable_disable_breakpoint_action.text.enable=&Enable
+enable_disable_breakpoint_action.text.disable=&Disable
+enable_disable_breakpoint_action.error.title=Enabling/disabling breakpoints
+enable_disable_breakpoint_action.error.message=Exceptions occurred enabling/disabling the breakpoint(s)
+
+execution_action.error.title= Error finding default launchers
+execution_action.error.message=Exceptions occurred determining the default launcher(s)
+execution_action.status=Error occurred retrieving default launcher
+
+find_replace_action.label=Find/Replace@Ctrl+F
+find_replace_action.tooltip=Find/Replace
+find_replace_action.image=
+find_replace_action.description=Find/Replace
+
+goto_line_action.label=Goto Line@Ctrl+G
+goto_line_action.tooltip=Goto Line
+goto_line_action.image=
+goto_line_action.description=Goto Line
+goto_line_action.dialog.title=Goto Line
+goto_line_action.dialog.message=Enter line number:
+goto_line_action.dialog.invalid_input=Not a number
+goto_line_action.dialog.invalid_range=Line number out of range
+
+launch_with_action.text.debug=Debug
+launch_with_action.text.run=Run
+
+open_breakpoint_marker_action.text=&Go to File
+open_breakpoint_marker_action.toolTipText=Go to file for breakpoint
+
+paste_action.label=Paste@Ctrl+V
+paste_action.tooltip=Paste
+paste_action.description=Pastes clipboard text
+
+relaunch_action.text=Re&launch
+relaunch_action.toolTipText=Relaunch
+##only needed due to inheritance
+relaunch_action.status=
+
+remove_all_breakpoints_action.text=Remove &All
+remove_all_breakpoints_action.toolTipText=Remove all breakpoints
+remove_all_breakpoints_action.error.title=Removing all breakpoints
+remove_all_breakpoints_action.error.message=Exceptions occurred removing breakpoints
+remove_all_breakpoints_action.status=Breakpoint(s) removal failed
+
+remove_all_from_inspector_action.text=Remove &All
+remove_all_from_inspector_action.toolTipText=Remove all variables from inspector
+
+remove_all_terminated_action.text=Remove &All Terminated
+remove_all_terminated_action.toolTipText=Remove all terminated launches
+
+remove_breakpoint_action.text=&Remove
+remove_breakpoint_action.toolTipText=Remove selected breakpoints
+remove_breakpoint_action.error.title=Removing a breakpoint
+remove_breakpoint_action.error.message=Exceptions occurred attempting to remove a breakpoint
+remove_breakpoint_action.status=Breakpoint(s) removal failed
+
+remove_from_inspector_action.text=&Remove
+remove_from_inspector_action.toolTipText=Remove selected variables from inspector
+
+resume_action.text=&Resume
+resume_action.toolTipText=Resume
+resume_action.status=Resume failed
+resume_action.error.title=Resume
+resume_action.error.message=Exceptions occurred attempting to resume
+
+run_action.text=R&un@Alt+F9
+run_action.toolTipText=Run
+
+select_all_action.label=Select All@Ctrl+A
+select_all_action.tooltip=Select All
+select_all_action.description=Select All
+
+show_qualified_action.toolTipText.show=Show qualified names
+show_qualified_action.toolTipText.hide=Hide qualified names
+
+show_types_action.toolTipText.show=Show types names
+show_types_action.toolTipText.hide=Hide types names
+
+step_into_action.text=Step &Into
+step_into_action.toolTipText=Step into
+step_into_action.status=Step into failed
+step_into_action.error.title=Step Into
+step_into_action.error.message=Exceptions occurred attempting to step into the frame
+
+step_over_action.text=Step O&ver
+step_over_action.toolTipText=Step over
+step_over_action.status=Step over failed
+step_over_action.error.title=Stop over
+step_over_action.error.message=Exceptions occurred attempting to step over the frame
+
+step_return_action.text=R&un to return
+step_return_action.toolTipText=Run to return
+step_return_action.status=Run to return failed
+step_return_action.error.title=Run to return
+step_return_action.error.message=Exceptions occurred attempting to run to return of the frame
+
+suspend_action.text=&Suspend
+suspend_action.toolTipText=Suspend
+suspend_action.status=Suspend failed
+suspend_action.error.title=Suspend
+suspend_action.error.message=Exceptions occurred attempting to suspend
+
+terminate_action.text=&Terminate
+terminate_action.toolTipText=Terminate
+terminate_action.status=Terminate failed.
+terminate_action.error.title=Terminate
+terminate_action.error.message=Exceptions occurred attempting to terminate
+
+terminate_all_action.text=Termi&nate All
+terminate_all_action.toolTipText=Terminate all
+terminate_all_action.error.title=Terminate all
+terminate_all_action.error.message=Exceptions occurred attempting to terminate all
+terminate_all_action.status=Terminate all failed
+
+terminate_and_remove_action.text=Ter&minate and Remove
+terminate_and_remove_action.toolTipText=Terminate and Remove
+terminate_and_remove_action.error.title=Terminate and remove
+terminate_and_remove_action.error.message=Exceptions occurred attempting to terminate and remove
+terminate_and_remove_action.status=Terminate and remove failed
+
+##############################################################
+# Label provider
+##############################################################
+label_provider.terminated=<terminated>
+label_provider.unknown=<unknown>
+
+##############################################################
+# Breakpoint Labels
+##############################################################
+breakpoint_label.line_number=Line:
+breakpoint_label.unknown_line_number=<unknown>
+breakpoint_label.unknown_resource=ERROR
+breakpoint_label.expired=<expired>
+breakpoint_label.hit_count=<Hit Count: {0}>
+
+##############################################################
+# Delegating Model Presentation Labels
+##############################################################
+presentation.breakpoint_label=Breakpoint
+
+##############################################################
+# Debug views title tool tips
+##############################################################
+debug_view.title_toolTipText=Debug sessions and associated program stacks
+launches_view.title_toolTipText=System processes
+variables_view.title_toolTipText=Variables and their values for a selected stack frame
+breakpoints_view.title_toolTipText= Breakpoints in the workbench
+inspector_view.title_toolTipText=Evaluated expression
+console_view.title_toolTipText=Program output \ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIUtils.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIUtils.java
new file mode 100644
index 000000000..c6ab08c97
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIUtils.java
@@ -0,0 +1,74 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Shell;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * This class serves as a location for utility methods for the debug UI.
+ */
+public class DebugUIUtils {
+
+ private static ResourceBundle fgResourceBundle;
+
+ /**
+ * Utility method with conventions
+ */
+ public static void errorDialog(Shell shell, String resourcePrefix, IStatus s) {
+ String message= getResourceString(resourcePrefix + "message");
+ // if the 'message' resource string and the IStatus' message are the same,
+ // don't show both in the dialog
+ if (s != null && message.equals(s.getMessage())) {
+ message= null;
+ }
+ String title= getResourceString(resourcePrefix + "title");
+ ErrorDialog.openError(shell, title, message, s);
+ }
+
+ /**
+ * Utility method
+ */
+ public static String getResourceString(String key) {
+ if (fgResourceBundle == null) {
+ fgResourceBundle= getResourceBundle();
+ }
+ if (fgResourceBundle != null) {
+ return fgResourceBundle.getString(key);
+ } else {
+ return "!" + key + "!";
+ }
+ }
+
+ /**
+ * Returns the resource bundle used by all parts of the debug ui package.
+ */
+ public static ResourceBundle getResourceBundle() {
+ try {
+ return ResourceBundle.getBundle("org.eclipse.debug.internal.ui.DebugUIResources");
+ } catch (MissingResourceException e) {
+ MessageDialog.openError(DebugUIPlugin.getActiveWorkbenchWindow().getShell(), "Error", e.toString());
+ }
+ return null;
+ }
+
+ /**
+ * Convenience method to log internal UI errors
+ */
+ public static void logError(Exception e) {
+ if (DebugUIPlugin.getDefault().isDebugging()) {
+ System.out.println("Internal error logged from UI: ");
+ e.printStackTrace();
+ System.out.println();
+ }
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugView.java
new file mode 100644
index 000000000..a8d8512b2
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugView.java
@@ -0,0 +1,506 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.model.*;
+import org.eclipse.debug.ui.IDebugModelPresentation;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.ui.*;
+import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.texteditor.ITextEditor;
+
+public class DebugView extends LaunchesView {
+
+ protected final static String PREFIX= "debug_view.";
+
+ protected ControlAction fResumeAction;
+ protected ControlAction fSuspendAction;
+ protected ControlAction fStepIntoAction;
+ protected ControlAction fStepOverAction;
+ protected ControlAction fStepReturnAction;
+ protected ControlAction fCopyToClipboardAction;
+
+ protected ShowQualifiedAction fShowQualifiedAction;
+
+ /**
+ * A marker for the source selection and icon for an
+ * instruction pointer. This marker is transient.
+ */
+ private IMarker fInstructionPointer;
+ private boolean fShowingMarker = false;
+
+ // marker attributes
+ private final static String[] fgStartEnd =
+ new String[] {IMarker.CHAR_START, IMarker.CHAR_END};
+
+ private final static String[] fgLineStartEnd =
+ new String[] {IMarker.LINE_NUMBER, IMarker.CHAR_START, IMarker.CHAR_END};
+
+ /**
+ * The editor associated with this debug view,
+ * or <code>null</code> if none.
+ */
+ private IEditorPart fEditor;
+ private Integer fEditorMemento;
+ private static final String DEBUG_EDITOR= DebugUIPlugin.getDefault().getDescriptor().getUniqueIdentifier() + ".DEBUG_EDITOR";
+
+
+ /**
+ * Creates a debug view and an instruction pointer marker for the view
+ */
+ public DebugView() {
+ try {
+ fInstructionPointer = ResourcesPlugin.getWorkspace().getRoot().createMarker(IInternalDebugUIConstants.INSTRUCTION_POINTER);
+ } catch (CoreException e) {
+ DebugUIUtils.logError(e);
+ }
+ }
+
+ /**
+ * @see IWorkbenchPart
+ */
+ public void dispose() {
+ if (fViewer != null) {
+ fViewer.removeSelectionChangedListener(this);
+ }
+ super.dispose();
+ fEditor = null;
+ }
+
+ /**
+ * Returns the configured instruction pointer.
+ * Selection is based on the line number OR char start and char end.
+ */
+ protected IMarker getInstructionPointer(final int lineNumber, final int charStart, final int charEnd, final boolean isTopStackFrame) {
+
+ IWorkspace workspace= ResourcesPlugin.getWorkspace();
+ IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
+ public void run(IProgressMonitor monitor) throws CoreException {
+ if (lineNumber == -1) {
+ fInstructionPointer.setAttributes(fgStartEnd,
+ new Object[] {new Integer(charStart), new Integer(charEnd)});
+ } else {
+ fInstructionPointer.setAttributes(fgLineStartEnd,
+ new Object[] {new Integer(lineNumber), new Integer(charStart), new Integer(charEnd)});
+ }
+ }
+ };
+
+ try {
+ workspace.run(runnable, null);
+ } catch (CoreException ce) {
+ DebugUIUtils.logError(ce);
+ }
+
+ return fInstructionPointer;
+ }
+
+ /**
+ * Initializes the actions of this view.
+ */
+ protected void initializeActions(LaunchesViewer viewer) {
+ super.initializeActions(viewer);
+
+ fResumeAction= new ControlAction(viewer, new ResumeActionDelegate());
+ viewer.addSelectionChangedListener(fResumeAction);
+ fResumeAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_RESUME));
+ fResumeAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_RESUME));
+ fResumeAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_RESUME));
+ fResumeAction.setEnabled(false);
+
+ fSuspendAction= new ControlAction(viewer, new SuspendActionDelegate());
+ viewer.addSelectionChangedListener(fSuspendAction);
+ fSuspendAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_SUSPEND));
+ fSuspendAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_SUSPEND));
+ fSuspendAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_SUSPEND));
+ fSuspendAction.setEnabled(false);
+
+ fStepIntoAction= new ControlAction(viewer, new StepIntoActionDelegate());
+ viewer.addSelectionChangedListener(fStepIntoAction);
+ fStepIntoAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_STEPINTO));
+ fStepIntoAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_STEPINTO));
+ fStepIntoAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STEPINTO));
+ fStepIntoAction.setEnabled(false);
+
+ fStepOverAction= new ControlAction(viewer, new StepOverActionDelegate());
+ viewer.addSelectionChangedListener(fStepOverAction);
+ fStepOverAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_STEPOVER));
+ fStepOverAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_STEPOVER));
+ fStepOverAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STEPOVER));
+ fStepOverAction.setEnabled(false);
+
+ fStepReturnAction= new ControlAction(viewer, new StepReturnActionDelegate());
+ viewer.addSelectionChangedListener(fStepReturnAction);
+ fStepReturnAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_STEPRETURN));
+ fStepReturnAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_STEPRETURN));
+ fStepReturnAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_STEPRETURN));
+ fStepReturnAction.setEnabled(false);
+
+ fCopyToClipboardAction= new ControlAction(viewer, new CopyToClipboardActionDelegate());
+
+ fShowQualifiedAction= new ShowQualifiedAction(viewer);
+ fShowQualifiedAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_QUALIFIED_NAMES));
+ fShowQualifiedAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_QUALIFIED_NAMES));
+ fShowQualifiedAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_QUALIFIED_NAMES));
+ fShowQualifiedAction.setChecked(false);
+ }
+
+ /**
+ * Configures the toolBar
+ */
+ protected void configureToolBar(IToolBarManager tbm) {
+ tbm.add(fResumeAction);
+ tbm.add(fSuspendAction);
+ tbm.add(fTerminateAction);
+ tbm.add(fDisconnectAction);
+ tbm.add(fRemoveTerminatedAction);
+ tbm.add(new Separator("#StepGroup"));
+ tbm.add(fStepIntoAction);
+ tbm.add(fStepOverAction);
+ tbm.add(fStepReturnAction);
+ tbm.add(new Separator("#RenderGroup"));
+ tbm.add(fShowQualifiedAction);
+ }
+
+ /**
+ * The selection has changed in the viewer. Show the
+ * associated source code if it is a stack frame.
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ super.selectionChanged(event);
+ showMarkerForCurrentSelection();
+ }
+
+ /**
+ * Opens a marker for the current selection if it is a stack frame.
+ * If the current selection is a thread, deselection occurs.
+ * Otherwise, nothing will happen.
+ */
+ protected void showMarkerForCurrentSelection() {
+ if (!fShowingMarker) {
+ try {
+ fShowingMarker = true;
+ ISelection selection= fViewer.getSelection();
+ Object obj= null;
+ if (selection instanceof IStructuredSelection) {
+ obj= ((IStructuredSelection) selection).getFirstElement();
+ }
+ if (obj == null || !(obj instanceof IDebugElement)) {
+ return;
+ }
+
+ IDebugElement debugElement= (IDebugElement) obj;
+ if (debugElement.getElementType() != IDebugElement.STACK_FRAME) {
+ return;
+ }
+
+ IStackFrame stackFrame= (IStackFrame) debugElement;
+
+ // Get the corresponding element.
+ ISourceLocator locator= stackFrame.getSourceLocator();
+ if (locator == null) {
+ return;
+ }
+ Object sourceElement = locator.getSourceElement(stackFrame);
+ if (sourceElement == null) {
+ return;
+ }
+
+ // translate to an editor input using the model presentation
+ IDebugModelPresentation presentation = getPresentation(stackFrame.getModelIdentifier());
+ IEditorInput editorInput = null;
+ String editorId= null;
+ if (presentation != null) {
+ editorInput= presentation.getEditorInput(sourceElement);
+ editorId= presentation.getEditorId(editorInput, sourceElement);
+ }
+
+ if (editorInput != null) {
+ boolean isTopStackFrame= false;
+ int lineNumber= 0;
+ try {
+ isTopStackFrame= stackFrame.getThread().getTopStackFrame() == stackFrame;
+ } catch (DebugException de) {
+ }
+ try {
+ lineNumber= stackFrame.getLineNumber();
+ } catch (DebugException de) {
+ }
+ openEditorAndSetMarker(editorInput, editorId, lineNumber, -1, -1, isTopStackFrame);
+ }
+ } finally {
+ fShowingMarker= false;
+ }
+ }
+ }
+
+ /**
+ * Get the active window and open/bring to the front an editor on the source element.
+ * Selection is based on the line number OR the char start and end.
+ */
+ protected void openEditorAndSetMarker(IEditorInput input, String editorId, int lineNumber, int charStart, int charEnd, boolean isTopStackFrame) {
+ IWorkbenchWindow dwindow= getSite().getWorkbenchWindow();
+ if (dwindow == null) {
+ return;
+ }
+
+
+ IWorkbenchPage page= dwindow.getActivePage();
+ IEditorPart editor= null;
+ IEditorPart[] editorParts= page.getEditors();
+
+
+ // restore editor on startup
+ if (fEditorMemento != null) {
+ if (editorParts.length > fEditorMemento.intValue())
+ fEditor = editorParts[fEditorMemento.intValue()];
+ fEditorMemento = null;
+ }
+
+
+ for (int i= 0; i < editorParts.length; i++) {
+ IEditorPart part= editorParts[i];
+ if (input.equals(part.getEditorInput())) {
+ editor= part;
+ break;
+ }
+ }
+
+ if (editor == null) {
+ if (fEditor != null) {
+ if (!fEditor.isDirty()) {
+ page.closeEditor(fEditor, false);
+ }
+ }
+ try {
+ editor= page.openEditor(input, editorId);
+ fEditor = editor;
+ page.activate(this);
+ } catch (PartInitException e) {
+ DebugUIUtils.logError(e);
+ }
+
+ } else {
+ page.bringToTop(editor);
+ }
+
+ if (editor != null && (lineNumber >= 0 || charStart >= 0)) {
+ //have an editor and either a lineNumber or a starting character
+ IMarker marker= getInstructionPointer(lineNumber, charStart, charEnd, isTopStackFrame);
+ editor.gotoMarker(marker);
+ }
+ }
+
+ /**
+ * Deselect any source in the active editor that was 'programmatically' selected by
+ * the debugger.
+ */
+ public void clearSourceSelection() {
+ // Get the active editor
+ IEditorPart editor= getSite().getPage().getActiveEditor();
+ if ((editor == null) || !(editor instanceof ITextEditor)) {
+ return;
+ }
+ ITextEditor textEditor= (ITextEditor)editor;
+
+ // Get the current text selection in the editor. If there is none,
+ // then there's nothing to do
+ ITextSelection textSelection= (ITextSelection)textEditor.getSelectionProvider().getSelection();
+ if (textSelection.isEmpty()) {
+ return;
+ }
+ int startChar= textSelection.getOffset();
+ int endChar= startChar + textSelection.getLength() - 1;
+ int startLine= textSelection.getStartLine();
+
+ // Check to see if the current selection looks the same as the last 'programmatic'
+ // selection in fSourceLocationMarker. If not, it must be a user selection, which
+ // we leave alone. In practice, we can leave alone any user selections on other lines,
+ // but if the user makes a selection on the same line as the last programmatic selection,
+ // it will get cleared.
+ int lastCharStart= fInstructionPointer.getAttribute(IMarker.CHAR_START, -1);
+ int lastCharEnd= fInstructionPointer.getAttribute(IMarker.CHAR_END, -1);;
+ if (lastCharStart == -1) {
+ // subtract 1 since editor is 0-based
+ if (fInstructionPointer.getAttribute(IMarker.LINE_NUMBER, -1) - 1 != startLine) {
+ return;
+ }
+ } else if ((lastCharStart != startChar) ||
+ (lastCharEnd != endChar)) {
+ return;
+ }
+
+ ITextSelection nullSelection= getNullSelection(startLine, startChar);
+ textEditor.getSelectionProvider().setSelection(nullSelection);
+ }
+
+ /**
+ * Creates and returns an ITextSelection that is a zero-length selection located at the
+ * start line and start char.
+ */
+ protected ITextSelection getNullSelection(final int startLine, final int startChar) {
+ return new ITextSelection() {
+ public int getStartLine() {
+ return startLine;
+ }
+ public int getEndLine() {
+ return startLine;
+ }
+ public int getOffset() {
+ return startChar;
+ }
+ public String getText() {
+ return "";
+ }
+ public int getLength() {
+ return 0;
+ }
+ public boolean isEmpty() {
+ return true;
+ }
+ };
+ }
+ /**
+ * Updates the enablement of the buttons in the view
+ */
+ protected void updateButtons() {
+ ISelection s= fViewer.getSelection();
+ if (s instanceof IStructuredSelection) {
+ IStructuredSelection selection= (IStructuredSelection) s;
+ fTerminateAction.selectionChanged(selection);
+ fDisconnectAction.selectionChanged(selection);
+ fSuspendAction.selectionChanged(selection);
+ fResumeAction.selectionChanged(selection);
+ fStepIntoAction.selectionChanged(selection);
+ fStepOverAction.selectionChanged(selection);
+ fStepReturnAction.selectionChanged(selection);
+ }
+ fRemoveTerminatedAction.update();
+ }
+
+ /**
+ * Adds items to the context menu.
+ */
+ protected void fillContextMenu(IMenuManager menu) {
+ menu.add(new Separator(IDebugUIConstants.EMPTY_EDIT_GROUP));
+ menu.add(new Separator(IDebugUIConstants.EDIT_GROUP));
+ menu.add(fCopyToClipboardAction);
+ menu.add(new Separator(IDebugUIConstants.EMPTY_STEP_GROUP));
+ menu.add(new Separator(IDebugUIConstants.STEP_GROUP));
+ menu.add(fStepIntoAction);
+ menu.add(fStepOverAction);
+ menu.add(fStepReturnAction);
+ menu.add(new Separator(IDebugUIConstants.EMPTY_THREAD_GROUP));
+ menu.add(new Separator(IDebugUIConstants.THREAD_GROUP));
+ menu.add(fResumeAction);
+ menu.add(fSuspendAction);
+ menu.add(fTerminateAction);
+ menu.add(fDisconnectAction);
+ menu.add(new Separator(IDebugUIConstants.EMPTY_LAUNCH_GROUP));
+ menu.add(new Separator(IDebugUIConstants.LAUNCH_GROUP));
+ menu.add(fTerminateAndRemoveAction);
+ menu.add(fTerminateAllAction);
+ menu.add(fRemoveTerminatedAction);
+ menu.add(fRelaunchAction);
+ menu.add(new Separator(IDebugUIConstants.EMPTY_RENDER_GROUP));
+ menu.add(new Separator(IDebugUIConstants.RENDER_GROUP));
+ menu.add(fShowQualifiedAction);
+ menu.add(new Separator(IDebugUIConstants.PROPERTY_GROUP));
+ fPropertyDialogAction.setEnabled(fPropertyDialogAction.isApplicableForSelection());
+ menu.add(fPropertyDialogAction);
+ menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ /**
+ * Returns the content provider to use for this viewer
+ * of this view.
+ */
+ protected DebugContentProvider getContentProvider() {
+ return new DebugContentProvider();
+ }
+
+ /**
+ * Auto-expand and select the given element - must be called in UI thread.
+ * This is used to implement auto-expansion-and-select on a SUSPEND event.
+ */
+ public void autoExpand(Object element) {
+ Object selectee = element;
+ if (element instanceof IThread) {
+ // try the top stack frame
+ try {
+ selectee = ((IThread)element).getTopStackFrame();
+ } catch (DebugException de) {
+ }
+ if (selectee == null) {
+ selectee = element;
+ }
+ } else if (element instanceof ILaunch) {
+ Object dt = ((ILaunch)element).getDebugTarget();
+ if (dt != null) {
+ selectee= dt;
+ }
+ }
+ //ensures that the child item exists in the viewer widget
+ //set selection only works if the child exists
+ fViewer.refresh(element);
+ fViewer.setSelection(new StructuredSelection(selectee), true);
+ }
+
+ /**
+ * Returns the resource bundle prefix for this action
+ */
+ protected String getPrefix(){
+ return PREFIX;
+ }
+
+ /**
+ * @see IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
+ */
+ public void partClosed(IWorkbenchPart part) {
+ if (part.equals(fEditor)) {
+ fEditor = null;
+ }
+ super.partClosed(part);
+ }
+
+ /**
+ * @see IViewPart
+ */
+ public void init(IViewSite site, IMemento memento) throws PartInitException {
+ super.init(site,memento);
+ if (memento != null) {
+ fEditorMemento = memento.getInteger(DEBUG_EDITOR);
+ }
+ }
+
+ /**
+ * @see IViewPart
+ */
+ public void saveState(IMemento memento) {
+ if (fEditor != null) {
+ IWorkbenchPage page = getSite().getPage();
+ if (page != null) {
+ IEditorPart[] editors = page.getEditors();
+ for (int i = 0; i < editors.length; i++) {
+ if (fEditor.equals(editors[i])) {
+ memento.putInteger(DEBUG_EDITOR, i);
+ break;
+ }
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DelegatingModelPresentation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DelegatingModelPresentation.java
new file mode 100644
index 000000000..43388f5e2
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DelegatingModelPresentation.java
@@ -0,0 +1,460 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.*;
+import org.eclipse.debug.core.model.*;
+import org.eclipse.debug.ui.IDebugModelPresentation;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.*;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.graphics.Image;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * A model presentation that delegates to the appropriate extension. This
+ * presentation contains a table of specialized presentations that are defined
+ * as <code>org.eclipse.debug.ui.debugModelPresentations</code> extensions. When
+ * asked to render an object from a debug model, this presentation delegates
+ * to the extension registered for that debug model.
+ */
+public class DelegatingModelPresentation implements IDebugModelPresentation {
+
+ private final static String TOP_PREFIX= "presentation.";
+ private final static String BREAKPOINT_LABEL= TOP_PREFIX + "breakpoint_label";
+
+ /**
+ * A mapping of attribute ids to their values
+ * @see IDebugModelPresentation#setAttribute
+ */
+ protected HashMap fAttributes= new HashMap(3);
+ /**
+ * A table of label providers keyed by debug model identifiers.
+ */
+ protected HashMap fLabelProviders= new HashMap(5);
+
+ // Resource String keys
+ private static final String PREFIX= "label_provider.";
+ private static final String TERMINATED= PREFIX + "terminated";
+ private static final String UNKNOWN= PREFIX + "unknown";
+
+ /**
+ * Constructs a new DelegatingLabelProvider that delegates to extensions
+ * of kind <code>org.eclipse.debug.ui.debugLabelProvider</code>
+ */
+ public DelegatingModelPresentation() {
+ IPluginDescriptor descriptor= DebugUIPlugin.getDefault().getDescriptor();
+ IExtensionPoint point= descriptor.getExtensionPoint(IDebugUIConstants.ID_DEBUG_MODEL_PRESENTATION);
+ if (point != null) {
+ IExtension[] extensions= point.getExtensions();
+ for (int i= 0; i < extensions.length; i++) {
+ IExtension extension= extensions[i];
+ IConfigurationElement[] configElements= extension.getConfigurationElements();
+ for (int j= 0; j < configElements.length; j++) {
+ IConfigurationElement elt= configElements[j];
+ String id= elt.getAttribute("id");
+ if (id != null) {
+ IDebugModelPresentation lp= new LazyModelPresentation(elt);
+ fLabelProviders.put(id, lp);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Delegate to all extensions.
+ *
+ * @see ILabelProvider
+ */
+ public void addListener(ILabelProviderListener listener) {
+ Iterator i= fLabelProviders.values().iterator();
+ while (i.hasNext()) {
+ ((ILabelProvider) i.next()).addListener(listener);
+ }
+ }
+
+ /**
+ * Delegate to all extensions.
+ *
+ * @see ILabelProvider
+ */
+ public void dispose() {
+ Iterator i= fLabelProviders.values().iterator();
+ while (i.hasNext()) {
+ ((ILabelProvider) i.next()).dispose();
+ }
+ }
+
+ /**
+ * Returns an image for the item
+ * Can return <code>null</code>
+ */
+ public Image getImage(Object item) {
+ if (item instanceof IDebugElement || item instanceof IMarker) {
+ IDebugModelPresentation lp= getConfiguredPresentation(item);
+ if (lp != null) {
+ Image image= lp.getImage(item);
+ if (image != null) {
+ return image;
+ }
+ }
+ // default to show the simple element name
+ return getDefaultImage(item);
+ } else {
+ ImageRegistry iRegistry= DebugUIPlugin.getDefault().getImageRegistry();
+ if (item instanceof IProcess) {
+ if (((IProcess) item).isTerminated()) {
+ return iRegistry.get(IDebugUIConstants.IMG_OBJS_OS_PROCESS_TERMINATED);
+ } else {
+ return iRegistry.get(IDebugUIConstants.IMG_OBJS_OS_PROCESS);
+ }
+ } else
+ if (item instanceof ILaunch) {
+ String mode= ((ILaunch) item).getLaunchMode();
+ if (mode.equals(ILaunchManager.DEBUG_MODE)) {
+ return iRegistry.get(IDebugUIConstants.IMG_ACT_DEBUG);
+ } else {
+ return iRegistry.get(IDebugUIConstants.IMG_ACT_RUN);
+ }
+ } else
+ if (item instanceof InspectItem) {
+ return iRegistry.get(IDebugUIConstants.IMG_OBJS_EXPRESSION);
+ } else
+ if (item instanceof IAdaptable) {
+ IWorkbenchAdapter de= (IWorkbenchAdapter) ((IAdaptable) item).getAdapter(IWorkbenchAdapter.class);
+ if (de != null) {
+ ImageDescriptor descriptor= de.getImageDescriptor(item);
+ if( descriptor != null) {
+ return descriptor.createImage();
+ }
+ }
+ }
+
+ return null;
+
+ }
+ }
+
+ /**
+ * @see IDebugModelPresentation
+ */
+ public IEditorInput getEditorInput(Object item) {
+ IDebugModelPresentation lp= getConfiguredPresentation(item);
+ if (lp != null) {
+ return lp.getEditorInput(item);
+ }
+ return null;
+ }
+
+ /**
+ * @see IDebugModelPresentation
+ */
+ public String getEditorId(IEditorInput input, Object objectInput) {
+ IDebugModelPresentation lp= getConfiguredPresentation(objectInput);
+ if (lp != null) {
+ return lp.getEditorId(input, objectInput);
+ }
+ return null;
+ }
+
+
+ /**
+ * Returns a default image for the debug element
+ */
+ public String getDefaultText(Object element) {
+ if (element instanceof IDebugElement) {
+ try {
+ return ((IDebugElement) element).getName();
+ } catch (DebugException de) {
+ }
+ } else
+ if (element instanceof IMarker) {
+ IMarker m= (IMarker) element;
+ try {
+ if (m.exists() && m.isSubtypeOf(IDebugConstants.BREAKPOINT_MARKER)) {
+ return DebugUIUtils.getResourceString(BREAKPOINT_LABEL);
+ }
+ } catch (CoreException e) {
+ }
+ }
+ return DebugUIUtils.getResourceString(UNKNOWN);
+ }
+
+ /**
+ * Returns a default image for the debug element
+ */
+ public Image getDefaultImage(Object element) {
+ ImageRegistry iRegistry= DebugUIPlugin.getDefault().getImageRegistry();
+ if (element instanceof IThread) {
+ IThread thread = (IThread)element;
+ if (thread.isSuspended()) {
+ return iRegistry.get(IDebugUIConstants.IMG_OBJS_THREAD_SUSPENDED);
+ } else if (thread.isTerminated()) {
+ return iRegistry.get(IDebugUIConstants.IMG_OBJS_THREAD_TERMINATED);
+ } else {
+ return iRegistry.get(IDebugUIConstants.IMG_OBJS_THREAD_RUNNING);
+ }
+ } else
+ if (element instanceof IStackFrame) {
+ return iRegistry.get(IDebugUIConstants.IMG_OBJS_STACKFRAME);
+ } else
+ if (element instanceof IProcess) {
+ if (((IProcess) element).isTerminated()) {
+ return iRegistry.get(IDebugUIConstants.IMG_OBJS_OS_PROCESS_TERMINATED);
+ } else {
+ return iRegistry.get(IDebugUIConstants.IMG_OBJS_OS_PROCESS);
+ }
+ } else
+ if (element instanceof IDebugTarget) {
+ IDebugTarget target= (IDebugTarget) element;
+ if (target.isTerminated() || target.isDisconnected()) {
+ return iRegistry.get(IDebugUIConstants.IMG_OBJS_DEBUG_TARGET_TERMINATED);
+ } else {
+ return iRegistry.get(IDebugUIConstants.IMG_OBJS_DEBUG_TARGET);
+ }
+ } else
+ if (element instanceof IMarker) {
+ try {
+ IMarker m= (IMarker) element;
+ if (m.exists() && m.isSubtypeOf(IDebugConstants.BREAKPOINT_MARKER)) {
+ if (DebugPlugin.getDefault().getBreakpointManager().isEnabled(m)) {
+ return DebugPluginImages.getImage(IDebugUIConstants.IMG_OBJS_BREAKPOINT);
+ } else {
+ return DebugPluginImages.getImage(IDebugUIConstants.IMG_OBJS_BREAKPOINT_DISABLED);
+ }
+
+ }
+ } catch (CoreException e) {
+ DebugUIUtils.logError(e);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns a label for the item
+ */
+ public String getText(Object item) {
+ boolean displayVariableTypes= showVariableTypeNames();
+ boolean displayQualifiedNames= showQualifiedNames();
+ if (item instanceof InspectItem) {
+ return getInspectItemText((InspectItem)item);
+ } else if (item instanceof IDebugElement || item instanceof IMarker) {
+ IDebugModelPresentation lp= getConfiguredPresentation(item);
+ if (lp != null) {
+ String label= lp.getText(item);
+ if (label != null) {
+ return label;
+ }
+ }
+ if (item instanceof IVariable) {
+ IVariable var= (IVariable) item;
+ StringBuffer buf= new StringBuffer();
+ try {
+ IValue value = var.getValue();
+
+ if (displayVariableTypes) {
+ buf.append(value.getReferenceTypeName());
+ buf.append(' ');
+ }
+ buf.append(var.getName());
+ buf.append(" = ");
+ buf.append(value.getValueString());
+ return buf.toString();
+ } catch (DebugException de) {
+ }
+ }
+ // default to show the simple element name
+ return getDefaultText(item);
+ } else {
+
+ String label= null;
+ if (item instanceof IProcess) {
+ label= ((IProcess) item).getLabel();
+ } else
+ if (item instanceof ILauncher) {
+ label = ((ILauncher)item).getLabel();
+ } else
+ if (item instanceof ILaunch) {
+ label= getLaunchText((ILaunch) item);
+ } else if (item instanceof InspectItem) {
+ try {
+ InspectItem var= (InspectItem) item;
+ StringBuffer buf= new StringBuffer();
+ buf.append(var.getLabel());
+ buf.append(" = ");
+ IValue value = var.getValue();
+ if (displayVariableTypes) {
+ buf.append(value.getReferenceTypeName());
+ buf.append(' ');
+ }
+ buf.append(value.getValueString());
+ return buf.toString();
+ } catch (DebugException de) {
+ return getDefaultText(item);
+ }
+ } else {
+ label= getDesktopLabel(item);
+ }
+
+ if ((item instanceof ITerminate) && ((ITerminate) item).isTerminated()) {
+ label= DebugUIUtils.getResourceString(TERMINATED) + label;
+ }
+ return label;
+ }
+ }
+
+ /**
+ * InspectItems have their left halves rendered here, and their
+ * right halves rendered by the registered model presentation.
+ */
+ protected String getInspectItemText(InspectItem inspectItem) {
+ StringBuffer buffer= new StringBuffer(inspectItem.getLabel());
+ String valueString= null;
+ IDebugModelPresentation lp= getConfiguredPresentation(inspectItem);
+ IValue value= inspectItem.getValue();
+ if (lp != null) {
+ valueString= lp.getText(value);
+ }
+ if ((valueString == null) || (valueString.length() < 1)) {
+ try {
+ valueString= value.getValueString();
+ } catch (DebugException de) {
+ }
+ }
+ if (valueString != null && valueString.length() > 0) {
+ buffer.append("= ");
+ buffer.append(valueString);
+ }
+ return buffer.toString();
+ }
+
+ /**
+ * Delegate to all extensions.
+ *
+ * @see ILabelProvider
+ */
+ public void removeListener(ILabelProviderListener listener) {
+ Iterator i= fLabelProviders.values().iterator();
+ while (i.hasNext()) {
+ ((ILabelProvider) i.next()).removeListener(listener);
+ }
+ }
+
+ public String getDesktopLabel(Object object) {
+ if (object instanceof IAdaptable) {
+ IWorkbenchAdapter de= (IWorkbenchAdapter) ((IAdaptable) object).getAdapter(IWorkbenchAdapter.class);
+ if (de != null) {
+ return de.getLabel(object);
+ }
+ }
+
+ return DebugUIUtils.getResourceString(UNKNOWN);
+ }
+
+ /**
+ * Delegate to the appropriate label provider.
+ *
+ * @see ILabelProvider
+ */
+ public boolean isLabelProperty(Object element, String property) {
+ if (element instanceof IDebugElement) {
+ IDebugModelPresentation lp= getConfiguredPresentation((IDebugElement) element);
+ if (lp != null) {
+ return lp.isLabelProperty(element, property);
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns a configured model presentation for the given object,
+ * or <code>null</code> if one is not registered.
+ */
+ protected IDebugModelPresentation getConfiguredPresentation(Object element) {
+ String id= null;
+ if (element instanceof IDebugElement) {
+ IDebugElement de= (IDebugElement) element;
+ id= de.getModelIdentifier();
+ } else if (element instanceof InspectItem) {
+ IValue value= ((InspectItem)element).getValue();
+ id= value.getModelIdentifier();
+ } else
+ if (element instanceof IMarker) {
+ IMarker m= (IMarker) element;
+ try {
+ if (m.exists()) {
+ id= (String) m.getAttribute(IDebugConstants.MODEL_IDENTIFIER);
+ }
+ } catch (CoreException e) {
+ DebugUIUtils.logError(e);
+ }
+ }
+ if (id != null) {
+ return getPresentation(id);
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns the presentation registered for the given id, or <code>null</code>
+ * of nothing is registered for the id.
+ */
+ protected IDebugModelPresentation getPresentation(String id) {
+ IDebugModelPresentation lp= (IDebugModelPresentation) fLabelProviders.get(id);
+ if (lp != null) {
+ Iterator keys= fAttributes.keySet().iterator();
+ while (keys.hasNext()) {
+ String key= (String)keys.next();
+ lp.setAttribute(key, fAttributes.get(key));
+ }
+ return lp;
+ }
+ return null;
+ }
+
+ /**
+ * Used to render launch history items in the re-launch drop downs
+ */
+ protected String getLaunchText(ILaunch launch) {
+ return getDesktopLabel(launch.getElement()) + " [" + getText(launch.getLauncher()) + "]";
+ }
+
+ /**
+ * @see IDebugModelPresentation
+ */
+ public void setAttribute(String id, Object value) {
+ if (value == null) {
+ return;
+ }
+ fAttributes.put(id, value);
+ }
+
+ protected boolean showVariableTypeNames() {
+ Boolean show= (Boolean) fAttributes.get(DISPLAY_VARIABLE_TYPE_NAMES);
+ show= show == null ? new Boolean(false) : show;
+ return show.booleanValue();
+ }
+
+ protected boolean showQualifiedNames() {
+ Boolean show= (Boolean) fAttributes.get(DISPLAY_QUALIFIED_NAMES);
+ show= show == null ? new Boolean(false) : show;
+ return show.booleanValue();
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DisconnectActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DisconnectActionDelegate.java
new file mode 100644
index 000000000..a43aa4375
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DisconnectActionDelegate.java
@@ -0,0 +1,37 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IDisconnect;
+
+public class DisconnectActionDelegate extends ControlActionDelegate {
+
+ private static final String PREFIX= "disconnect_action.";
+
+ /**
+ * @see ControlActionDelegate
+ */
+ protected void doAction(Object element) throws DebugException {
+ if (element instanceof IDisconnect)
+ ((IDisconnect) element).disconnect();
+ }
+
+ /**
+ * @see ControlActionDelegate
+ */
+ public boolean isEnabledFor(Object element) {
+ return element instanceof IDisconnect && ((IDisconnect) element).canDisconnect();
+ }
+
+ /**
+ * @see ControlActionDelegate
+ */
+ protected String getPrefix() {
+ return PREFIX;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/EnableDisableBreakpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/EnableDisableBreakpointAction.java
new file mode 100644
index 000000000..7ff8e5be6
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/EnableDisableBreakpointAction.java
@@ -0,0 +1,125 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.*;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IMarkerDelta;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.ui.actions.SelectionProviderAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.widgets.Display;
+import java.util.Iterator;
+
+/**
+ * Enables or disables a breakpoint
+ */
+public class EnableDisableBreakpointAction extends SelectionProviderAction implements IBreakpointListener {
+
+ private final static String PREFIX= "enable_disable_breakpoint_action.";
+ private final static String ENABLE= PREFIX + TEXT + ".enable";
+ private final static String DISABLE= PREFIX + TEXT + ".disable";
+ private final static String ERROR= PREFIX + "error.";
+ /**
+ * Creates the action to enable/disable breakpoints
+ */
+ public EnableDisableBreakpointAction(ISelectionProvider selectionProvider) {
+ super(selectionProvider, DebugUIUtils.getResourceString(PREFIX + TEXT));
+ setEnabled(!getStructuredSelection().isEmpty());
+ }
+
+ /**
+ * Returns the breakpoint manager
+ */
+ protected IBreakpointManager getBreakpointManager() {
+ return DebugPlugin.getDefault().getBreakpointManager();
+ }
+
+ /**
+ * @see Action
+ */
+ public void run() {
+ IStructuredSelection selection= (IStructuredSelection) getStructuredSelection();
+ //Get the selected marker
+ Iterator enum= selection.iterator();
+ if (!enum.hasNext()) {
+ return;
+ }
+
+ IBreakpointManager manager= getBreakpointManager();
+ MultiStatus ms= new MultiStatus(DebugUIPlugin.getDefault().getDescriptor().getUniqueIdentifier(), IDebugStatusConstants.REQUEST_FAILED, "Enable/Disable breakpoint(s) failed", null);
+ while (enum.hasNext()) {
+ IMarker breakpoint= (IMarker) enum.next();
+ boolean enabled= manager.isEnabled(breakpoint);
+ try {
+ manager.setEnabled(breakpoint, !enabled);
+ } catch (CoreException e) {
+ ms.merge(e.getStatus());
+ }
+ }
+ if (!ms.isOK()) {
+ DebugUIUtils.errorDialog(DebugUIPlugin.getActiveWorkbenchWindow().getShell(), ERROR, ms);
+ }
+ }
+
+ /**
+ * @see SelectionProviderAction
+ */
+ public void selectionChanged(IStructuredSelection sel) {
+ Iterator enum= sel.iterator();
+ if (!enum.hasNext()) {
+ //No selection
+ setEnabled(false);
+ return;
+ }
+ IMarker marker= (IMarker)enum.next();
+ if (!enum.hasNext()) {
+ //single selection
+ boolean enabled= getBreakpointManager().isEnabled(marker);
+ if (enabled) {
+ setText(DebugUIUtils.getResourceString(DISABLE));
+ } else {
+ setText(DebugUIUtils.getResourceString(ENABLE));
+ }
+ } else {
+ // multi- selection
+ setText(DebugUIUtils.getResourceString(PREFIX + TEXT));
+ }
+ setEnabled(true);
+ }
+
+ /**
+ * @see IBreakpointListener
+ */
+ public void breakpointAdded(IMarker breakpoint) {
+ }
+
+ /**
+ * @see IBreakpointListener
+ */
+ public void breakpointRemoved(IMarker breakpoint, IMarkerDelta delta) {
+ }
+
+ /**
+ * @see IBreakpointListener
+ */
+ public void breakpointChanged(IMarker breakpoint, IMarkerDelta delta) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ ISelection s= getSelectionProvider().getSelection();
+ if (s instanceof IStructuredSelection) {
+ selectionChanged((IStructuredSelection) s);
+ }
+ }
+ });
+ }
+
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ExecutionAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ExecutionAction.java
new file mode 100644
index 000000000..4dd676405
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ExecutionAction.java
@@ -0,0 +1,261 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import java.util.*;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.debug.core.*;
+import org.eclipse.debug.core.model.IDebugElement;
+import org.eclipse.debug.core.model.IProcess;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+
+/**
+ * This is the debug action which appears in the desktop menu and toolbar.
+ */
+public abstract class ExecutionAction extends Action {
+
+ private final static String PREFIX= "execution_action.";
+ private final static String ERROR= "error.";
+ private final static String STATUS= PREFIX + "status";
+
+ /**
+ * @see Action
+ */
+ public void run() {
+
+ final IWorkbenchWindow dwindow= DebugUIPlugin.getActiveWorkbenchWindow();
+ final IStructuredSelection selection= resolveSelection(dwindow);
+
+ // if the selection is a debug element, system process, or launch, try to do a relaunch
+ if (selection != null && attemptRelaunch(selection)) {
+ return;
+ }
+
+ // otherwise, resolve a launcher and an element
+ final Object[] launchers= resolveLaunchers(selection);
+ if (launchers.length == 0) {
+ // could not determine any launchers to use to launch
+ // very unlikely to happen
+ beep();
+ return;
+ }
+
+ BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
+ public void run() {
+ // if there are no choices to make, do the launch
+ if (launchers.length == 1 && selection != null) {
+ ILauncher launcher= (ILauncher)launchers[0];
+ Object[] elements= selection.toArray();
+ launcher.launch(elements, getMode());
+ } else {
+ // must choose a launcher
+ useWizard(launchers, dwindow.getShell(), selection);
+ }
+ }
+ });
+ }
+
+ /**
+ * Returns the mode of a launcher to use for this action
+ */
+ protected abstract String getMode();
+
+ /**
+ * Returns the launch manager.
+ */
+ protected static ILaunchManager getLaunchManager() {
+ return DebugPlugin.getDefault().getLaunchManager();
+ }
+
+ /**
+ * Relaunches the launch in the specified mode.
+ */
+ public void relaunch(ILaunch launch, String mode) {
+ RelaunchActionDelegate.relaunch(launch, mode);
+ }
+
+ /**
+ * Determines and returns the selection that provides context for the launch,
+ * or <code>null</code> if there is no selection.
+ */
+ protected IStructuredSelection resolveSelection(IWorkbenchWindow window) {
+ if (window == null) {
+ return null;
+ }
+ ISelection selection= window.getSelectionService().getSelection();
+ if (selection == null || selection.isEmpty() || !(selection instanceof IStructuredSelection)) {
+ // there is no obvious selection - go fishing
+ selection= null;
+ IWorkbenchPage page= window.getActivePage();
+ if (page == null) {
+ //workspace is closed
+ return null;
+ }
+
+ // first, see if there is an active editor, and try its input element
+ IEditorPart editor= page.getActiveEditor();
+ Object element= null;
+ if (editor != null) {
+ element= editor.getEditorInput();
+ }
+
+ if (selection == null && element != null) {
+ selection= new StructuredSelection(element);
+ }
+ }
+ return (IStructuredSelection)selection;
+ }
+
+ /**
+ * Resolves and returns the applicable launcher(s) to be used to launch the
+ * elements in the specified selection.
+ */
+ protected Object[] resolveLaunchers(IStructuredSelection selection) {
+ List launchers;
+ if (selection == null || selection.isEmpty()) {
+ launchers= Arrays.asList(getLaunchManager().getLaunchers(getMode()));
+ } else {
+ launchers= new ArrayList(2);
+ Iterator elements= selection.iterator();
+ MultiStatus status= new MultiStatus(DebugUIPlugin.getDefault().getDescriptor().getUniqueIdentifier(), IDebugStatusConstants.REQUEST_FAILED, DebugUIUtils.getResourceString(STATUS), null);
+ while (elements.hasNext()) {
+ Object element= elements.next();
+ ILauncher defaultLauncher= null;
+ try {
+ IResource resource= null;
+ if (element instanceof IAdaptable) {
+ IAdaptable el= (IAdaptable)element;
+ resource= (IResource)el.getAdapter(IResource.class);
+ }
+ IProject project= null;
+ if (resource != null) {
+ project= resource.getProject();
+ }
+ if (project != null) {
+ defaultLauncher= getLaunchManager().getDefaultLauncher(project);
+ }
+ if (defaultLauncher != null) {
+ if (!defaultLauncher.getModes().contains(getMode())) {
+ defaultLauncher= null;
+ }
+ }
+ } catch (CoreException e) {
+ status.merge(e.getStatus());
+ }
+ if (defaultLauncher != null) {
+ if (!launchers.contains(defaultLauncher)) {
+ launchers.add(defaultLauncher);
+ }
+ }
+ }
+ if (!status.isOK()) {
+ DebugUIUtils.errorDialog(DebugUIPlugin.getActiveWorkbenchWindow().getShell(), PREFIX + ERROR, status);
+ }
+ if (launchers.isEmpty()) {
+ launchers= Arrays.asList(getLaunchManager().getLaunchers(getMode()));
+ }
+ }
+
+ return resolveVisibleLaunchers(launchers);
+ }
+
+ protected Object[] resolveVisibleLaunchers(List launchers) {
+ List visibleLaunchers= new ArrayList(2);
+ Iterator itr= launchers.iterator();
+ while (itr.hasNext()) {
+ ILauncher launcher= (ILauncher)itr.next();
+ if (DebugUIPlugin.getDefault().isVisible(launcher)) {
+ //cannot use itr.remove() as the list may be a fixed size list
+ visibleLaunchers.add(launcher);
+ }
+ }
+ return visibleLaunchers.toArray();
+ }
+
+ protected Object[] resolveWizardLaunchers(Object[] launchers) {
+ List wizardLaunchers= new ArrayList(2);
+ for (int i= 0 ; i < launchers.length; i++) {
+ ILauncher launcher= (ILauncher)launchers[i];
+ if (DebugUIPlugin.getDefault().hasWizard(launcher)) {
+ wizardLaunchers.add(launcher);
+ }
+ }
+ return wizardLaunchers.toArray();
+ }
+
+ /**
+ * If the selection contains re-launchables, a relaunch is performed
+ * for each launch and true is returned, otherwise, false is returned.
+ */
+ protected boolean attemptRelaunch(IStructuredSelection selection) {
+ // if the selection is a debug element, system process, or launch, do a relaunch
+ Iterator objects= selection.iterator();
+ List relaunchables= null;
+ while (objects.hasNext()) {
+ Object object= objects.next();
+ ILaunch launch= null;
+ if (object instanceof IDebugElement) {
+ launch= ((IDebugElement)object).getLaunch();
+ } else if (object instanceof ILaunch) {
+ launch= (ILaunch)object;
+ } else if (object instanceof IProcess) {
+ launch= ((IProcess)object).getLaunch();
+ }
+ if (launch != null) {
+ if (relaunchables == null) {
+ relaunchables= new ArrayList(1);
+ relaunchables.add(launch);
+ } else if (!relaunchables.contains(launch)) {
+ relaunchables.add(launch);
+ }
+ }
+ }
+ if (relaunchables == null) {
+ return false;
+ } else {
+ Iterator itr= relaunchables.iterator();
+ while (itr.hasNext()) {
+ relaunch((ILaunch)itr.next(), getMode());
+ }
+ return true;
+ }
+ }
+
+ /**
+ * Use the wizard to do the launch.
+ */
+ protected void useWizard(Object[] launchers, Shell shell, IStructuredSelection selection) {
+ launchers= resolveWizardLaunchers(launchers);
+ LaunchWizard lw= new LaunchWizard(launchers, selection, getMode());
+ LaunchWizardDialog dialog= new LaunchWizardDialog(shell, lw);
+ dialog.open();
+ }
+
+ /**
+ * Ring the bell
+ */
+ protected void beep() {
+ Display display= Display.getCurrent();
+ if (display != null) {
+ display.beep();
+ }
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IDebugPreferenceConstants.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IDebugPreferenceConstants.java
new file mode 100644
index 000000000..74af401cc
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IDebugPreferenceConstants.java
@@ -0,0 +1,42 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+/**
+ * Constants defining the keys to be used for accessing preferences
+ * inside the debug ui plugin's preference bundle.
+ *
+ * In descriptions (of the keys) below describe the preference
+ * stored at the given key. The type indicates type of the stored preferences
+ *
+ * The preference store is loaded by the plugin (DebugUIPlugin).
+ * @See DebugUIPlugin.initializeDefaultPreferences() - for initialization of the store
+ */
+public interface IDebugPreferenceConstants {
+
+ /**
+ * RGB colors for displaying the content in the Console
+ */
+ public static final String CONSOLE_SYS_ERR_RGB= "Console.stdErrColor";
+ public static final String CONSOLE_SYS_OUT_RGB= "Console.stdOutColor";
+ public static final String CONSOLE_SYS_IN_RGB= "Console.stdInColor";
+
+ /**
+ * The name of the font to use for the Console
+ **/
+ public static final String CONSOLE_FONT= "Console.font";
+
+ /**
+ * (boolean) Whether or not the console view is shown
+ * when there is program ouptut.
+ */
+ public static final String CONSOLE_OPEN= "DEBUG.consoleOpen";
+
+
+}
+
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IInternalDebugUIConstants.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IInternalDebugUIConstants.java
new file mode 100644
index 000000000..6ea4dd3b5
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/IInternalDebugUIConstants.java
@@ -0,0 +1,51 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+public interface IInternalDebugUIConstants {
+
+ //Folders
+ public static final String ID_NAVIGATOR_FOLDER_VIEW= "org.eclipse.debug.internal.ui.NavigatorFolderView";
+ public static final String ID_TOOLS_FOLDER_VIEW= "org.eclipse.debug.internal.ui.ToolsFolderView";
+ public static final String ID_CONSOLE_FOLDER_VIEW= "org.eclipse.debug.internal.ui.ConsoleFolderView";
+
+ //Current stack frame instruction pointer
+ public static final String INSTRUCTION_POINTER= "org.eclipse.debug.ui.instructionPointer";
+
+
+ // disabled local tool images
+ public static final String IMG_DLCL_RESUME= "IMG_DLCL_RESUME";
+ public static final String IMG_DLCL_SUSPEND= "IMG_DLCL_SUSPEND";
+ public static final String IMG_DLCL_TERMINATE= "IMG_DLCL_TERMINATE";
+ public static final String IMG_DLCL_DISCONNECT= "IMG_DLCL_DISCONNECT";
+ public static final String IMG_DLCL_STEPINTO= "IMG_DLCL_STEPINTO";
+ public static final String IMG_DLCL_STEPOVER= "IMG_DLCL_STEPOVER";
+ public static final String IMG_DLCL_STEPRETURN= "IMG_DLCL_STEPRETURN";
+ public static final String IMG_DLCL_CLEAR= "IMG_DLCL_CLEAR";
+ public static final String IMG_DLCL_REMOVE_TERMINATED= "IMG_DLCL_REMOVE_TERMINATED";
+ public static final String IMG_DLCL_QUALIFIED_NAMES= "IMG_DLCL_QUALIFIED_NAMES";
+ public static final String IMG_DLCL_TYPE_NAMES= "IMG_DLCL_TYPE_NAMES";
+ public static final String IMG_DLCL_REMOVE= "IMG_DLCL_REMOVE";
+ public static final String IMG_DLCL_REMOVE_ALL= "IMG_DLCL_REMOVE_ALL";
+
+ // enabled local tool images
+ public static final String IMG_ELCL_RESUME= "IMG_ELCL_RESUME";
+ public static final String IMG_ELCL_SUSPEND= "IMG_ELCL_SUSPEND";
+ public static final String IMG_ELCL_TERMINATE= "IMG_ELCL_TERMINATE";
+ public static final String IMG_ELCL_DISCONNECT= "IMG_ELCL_DISCONNECT";
+ public static final String IMG_ELCL_STEPINTO= "IMG_ELCL_STEPINTO";
+ public static final String IMG_ELCL_STEPOVER= "IMG_ELCL_STEPOVER";
+ public static final String IMG_ELCL_STEPRETURN= "IMG_ELCL_STEPRETURN";
+ public static final String IMG_ELCL_CLEAR= "IMG_ELCL_CLEAR";
+ public static final String IMG_ELCL_REMOVE_TERMINATED= "IMG_ELCL_REMOVE_TERMINATED";
+ public static final String IMG_ELCL_QUALIFIED_NAMES= "IMG_ELCL_QUALIFIED_NAMES";
+ public static final String IMG_ELCL_TYPE_NAMES= "IMG_ELCL_TYPE_NAMES";
+ public static final String IMG_ELCL_REMOVE= "IMG_ELCL_REMOVE";
+ public static final String IMG_ELCL_REMOVE_ALL= "IMG_ELCL_REMOVE_ALL";
+
+
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectItem.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectItem.java
new file mode 100644
index 000000000..dcdf9923b
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectItem.java
@@ -0,0 +1,41 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.core.runtime.PlatformObject;
+
+
+public class InspectItem extends PlatformObject {
+
+ protected String fLabel;
+ protected IValue fValue;
+
+
+ public InspectItem(String label, IValue value) {
+ fLabel = label;
+ fValue = value;
+ }
+
+ public String getLabel() {
+ return fLabel;
+ }
+
+ public IValue getValue() {
+ return fValue;
+ }
+
+ /**
+ * @see IAdaptable
+ */
+ public Object getAdapter(Class adapter) {
+ if (adapter == InspectItem.class) {
+ return this;
+ }
+ return super.getAdapter(adapter);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorAction.java
new file mode 100644
index 000000000..a2f44be72
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorAction.java
@@ -0,0 +1,56 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.actions.SelectionProviderAction;
+
+public abstract class InspectorAction extends SelectionProviderAction {
+
+ public InspectorAction(ISelectionProvider provider, String label) {
+ super(provider, label);
+ }
+
+ /**
+ * @see IAction
+ */
+ public void run() {
+ // get the Inspector
+ IWorkbenchPage p= DebugUIPlugin.getActiveWorkbenchWindow().getActivePage();
+ InspectorView view= (InspectorView) p.findView(IDebugUIConstants.ID_INSPECTOR_VIEW);
+ if (view == null) {
+ // open a new view
+ try {
+ view= (InspectorView) p.showView(IDebugUIConstants.ID_INSPECTOR_VIEW);
+ } catch (PartInitException e) {
+ DebugUIUtils.logError(e);
+ return;
+ }
+ }
+
+ try {
+ doAction(view);
+ } catch (DebugException de) {
+ DebugUIUtils.logError(de);
+ }
+ }
+
+ /**
+ * @see SelectionProviderAction
+ */
+ public void selectionChanged(IStructuredSelection sel) {
+ setEnabled(!sel.isEmpty());
+ }
+
+ protected abstract void doAction(InspectorView view) throws DebugException;
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorContentProvider.java
new file mode 100644
index 000000000..a57688a49
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorContentProvider.java
@@ -0,0 +1,234 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.debug.core.*;
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.debug.core.model.IVariable;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+
+public class InspectorContentProvider extends BasicContentProvider implements ITreeContentProvider, IDebugEventListener {
+
+ /**
+ * The inspect items in the viewer
+ */
+ protected InspectorList fInspectorList;
+
+ /**
+ * The action that removes all the items
+ */
+ protected RemoveAllFromInspectorAction fRemoveAllFromInspectorAction;
+
+ /**
+ * A table of root values in the inspector
+ */
+ protected Hashtable fRootValuesTable;
+
+ /**
+ * Constructs a new inspector content provider
+ */
+ public InspectorContentProvider(RemoveAllFromInspectorAction action) {
+ fRemoveAllFromInspectorAction= action;
+ fInspectorList = new InspectorList(3);
+ fRootValuesTable = new Hashtable(3);
+ DebugPlugin.getDefault().addDebugEventListener(this);
+ enableRemoveAllFromInspectorAction();
+ }
+
+ /**
+ * @see ITreeContentProvider
+ */
+ public Object getParent(Object child) {
+ if (fInspectorList == child) {
+ return null;
+ } else if (child instanceof InspectItem) {
+ return fInspectorList;
+ } else if (child instanceof IVariable) {
+ Object parent = ((IVariable)child).getParent();
+ if (parent instanceof IValue) {
+ IValue value = (IValue)parent;
+ Object inspectItem = fRootValuesTable.get(value);
+ if (inspectItem != null) {
+ return inspectItem;
+ } else {
+ return value.getVariable();
+ }
+ } else {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @see BasicContentProvider#doGetChildren(Object)
+ */
+ protected Object[] doGetChildren(Object parent) {
+ if (parent == fInspectorList) {
+ return fInspectorList.getList().toArray();
+ }
+ try {
+ if (parent instanceof IVariable) {
+ return ((IVariable)parent).getValue().getChildren();
+ }
+ if (parent instanceof InspectItem) {
+ return ((InspectItem)parent).getValue().getChildren();
+ }
+ } catch (DebugException de) {
+ DebugUIUtils.logError(de);
+ }
+ return new Object[0];
+ }
+
+ /**
+ * @see ITreeContentProvider
+ */
+ public boolean hasChildren(Object parent) {
+ if (parent == fInspectorList) {
+ return !fInspectorList.isEmpty();
+ }
+ try {
+ if (parent instanceof InspectItem) {
+ return ((InspectItem)parent).getValue().hasChildren();
+ } else{
+ return ((IVariable)parent).getValue().hasChildren();
+ }
+ } catch (DebugException de) {
+ return false;
+ }
+ }
+
+ /**
+ * @see IStructuredContentProvider
+ */
+ public Object[] getElements(Object parent) {
+ return getChildren(parent);
+ }
+
+ /**
+ * @see IContentProvider
+ */
+ public void dispose() {
+ fInspectorList = null;
+ DebugPlugin.getDefault().removeDebugEventListener(this);
+ }
+
+ /**
+ * Returns the list of inspect items being inspected.
+ */
+ public InspectorList getInspectorList() {
+ return fInspectorList;
+ }
+
+ /**
+ * @see BasicContentProvider#doHandleDebug(Event)
+ */
+ protected void doHandleDebugEvent(DebugEvent event) {
+ if (event.getKind() == DebugEvent.SUSPEND ||
+ event.getKind() == DebugEvent.TERMINATE ||
+ event.getKind() == DebugEvent.CHANGE) {
+ // remove any de-allocated values
+ Iterator itr = fInspectorList.getList().iterator();
+ while (itr.hasNext()) {
+ InspectItem item = (InspectItem)itr.next();
+ boolean allocated= false;
+ try {
+ allocated= item.getValue().isAllocated();
+ } catch (DebugException de) {
+ }
+ if (!allocated) {
+ itr.remove();
+ fRootValuesTable.remove(item.getValue());
+ }
+ }
+ refresh();
+ enableRemoveAllFromInspectorAction();
+ }
+ }
+
+ /**
+ * Helper method to remove the given element
+ */
+ protected void remove(final Object element) {
+ Runnable r= new Runnable() {
+ public void run() {
+ ((TreeViewer)fViewer).remove(element);
+ enableRemoveAllFromInspectorAction();
+ }
+ };
+ asyncExec(r);
+ }
+
+ /**
+ * Helper method to remove all elements
+ */
+ protected void removeAll() {
+ Runnable r= new Runnable() {
+ public void run() {
+ fInspectorList.getList().clear();
+ refresh();
+ enableRemoveAllFromInspectorAction();
+ }
+ };
+ asyncExec(r);
+ }
+
+ /**
+ * Helper method for inserting the given element
+ */
+ protected void insert(final Object element) {
+ final Object parent = getParent(element);
+ if (parent != null) {
+ Runnable r= new Runnable() {
+ public void run() {
+ TreeViewer tempViewer= (TreeViewer)fViewer;
+ tempViewer.add(parent, element);
+ tempViewer.setExpandedState(element, true);
+ tempViewer.setSelection(new StructuredSelection(element));
+ enableRemoveAllFromInspectorAction();
+ }
+ };
+ asyncExec(r);
+ }
+ }
+
+ /**
+ * Adds a inspect item to the list
+ */
+ public void addToInspector(InspectItem item) {
+ List inspectorList = getInspectorList().getList();
+ if (!inspectorList.contains(item)) {
+ fRootValuesTable.put(item.getValue(), item);
+ inspectorList.add(item);
+ insert(item);
+ }
+ }
+
+ /**
+ * Removes a inspect item from the list
+ */
+ public void removeFromInspector(InspectItem item) {
+ getInspectorList().getList().remove(item);
+ fRootValuesTable.remove(item.getValue());
+ remove(item);
+ }
+
+ /**
+ * Enable/disable the <code>RemoveAllFromInspectorAction<code> based on whether the inspector
+ * list is currently empty.
+ */
+ public void enableRemoveAllFromInspectorAction() {
+ boolean enable= getInspectorList().isEmpty() ? false : true;
+ fRemoveAllFromInspectorAction.setEnabled(enable);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorList.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorList.java
new file mode 100644
index 000000000..2ed884c80
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorList.java
@@ -0,0 +1,38 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.core.runtime.PlatformObject;
+import java.util.List;
+import java.util.Vector;
+
+public class InspectorList extends PlatformObject {
+
+ protected Vector fInspectorList;
+
+ /**
+ * @see IAdaptable
+ */
+ public Object getAdapter(Class adapter) {
+ if (adapter == InspectItem.class) {
+ return this;
+ }
+ return super.getAdapter(adapter);
+ }
+
+ public InspectorList(int initialCapacity) {
+ fInspectorList= new Vector(initialCapacity);
+ }
+
+ public List getList() {
+ return fInspectorList;
+ }
+
+ public boolean isEmpty() {
+ return fInspectorList.isEmpty();
+ }
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorView.java
new file mode 100644
index 000000000..5aa6f92fc
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorView.java
@@ -0,0 +1,159 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.action.*; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.part.DrillDownAdapter;
+
+/**
+ * A view that shows items that have been added to a inspector
+ */
+public class InspectorView extends AbstractDebugView {
+
+ protected final static String PREFIX= "inspector_view.";
+
+ protected InspectorContentProvider fContentProvider= null;
+ protected ShowQualifiedAction fShowQualifiedAction;
+ protected ShowTypesAction fShowTypesAction;
+ protected InspectorViewAddToInspectorAction fAddToInspectorAction;
+ protected RemoveFromInspectorAction fRemoveFromInspectorAction;
+ protected RemoveAllFromInspectorAction fRemoveAllFromInspectorAction;
+ protected ChangeVariableValueAction fChangeVariableAction;
+
+ protected DrillDownAdapter fDrillPart;
+
+ /**
+ * @see IWorkbenchPart
+ */
+ public void createPartControl(Composite parent) {
+ TreeViewer vv = new TreeViewer(parent, SWT.MULTI);
+ fViewer= vv;
+ fDrillPart = new DrillDownAdapter(vv);
+ initializeActions();
+ initializeToolBar();
+ fContentProvider= new InspectorContentProvider(fRemoveAllFromInspectorAction);
+ fViewer.setContentProvider(fContentProvider);
+ fViewer.setLabelProvider(new DelegatingModelPresentation());
+ fViewer.setUseHashlookup(true);
+
+ createContextMenu(vv.getTree());
+
+ fViewer.setInput(fContentProvider.getInspectorList());
+ fViewer.getControl().addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent e) {
+ handleKeyPressed(e);
+ }
+ });
+
+ setTitleToolTip(getTitleToolTipText(PREFIX));
+ }
+
+ /**
+ * Initializes the actions of this view.
+ */
+ protected void initializeActions() {
+ fShowTypesAction= new ShowTypesAction(fViewer);
+ fShowTypesAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_TYPE_NAMES));
+ fShowTypesAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_TYPE_NAMES));
+ fShowTypesAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TYPE_NAMES));
+ fShowTypesAction.setChecked(false);
+
+ fShowQualifiedAction= new ShowQualifiedAction(fViewer);
+ fShowQualifiedAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_QUALIFIED_NAMES));
+ fShowQualifiedAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_QUALIFIED_NAMES));
+ fShowQualifiedAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_QUALIFIED_NAMES));
+ fShowQualifiedAction.setChecked(false);
+
+ fAddToInspectorAction = new InspectorViewAddToInspectorAction(fViewer);
+
+ fRemoveFromInspectorAction= new RemoveFromInspectorAction(fViewer);
+ fRemoveFromInspectorAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_REMOVE));
+ fRemoveFromInspectorAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_REMOVE));
+ fRemoveFromInspectorAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_REMOVE));
+
+ fRemoveAllFromInspectorAction= new RemoveAllFromInspectorAction(fViewer);
+ fRemoveAllFromInspectorAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_REMOVE_ALL));
+ fRemoveAllFromInspectorAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_REMOVE_ALL));
+ fRemoveAllFromInspectorAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_REMOVE_ALL));
+
+ fChangeVariableAction= new ChangeVariableValueAction(fViewer);
+ fChangeVariableAction.setEnabled(false);
+ }
+
+ /**
+ * Configures the toolBar
+ */
+ protected void configureToolBar(IToolBarManager tbm) {
+ fDrillPart.addNavigationActions(tbm);
+ tbm.add(new Separator(this.getClass().getName()));
+ tbm.add(fShowTypesAction);
+ tbm.add(fShowQualifiedAction);
+ tbm.add(new Separator(this.getClass().getName()));
+ tbm.add(fRemoveFromInspectorAction);
+ tbm.add(fRemoveAllFromInspectorAction);
+ }
+
+ /**
+ * Adds items to the context menu including any extension defined actions.
+ */
+ protected void fillContextMenu(IMenuManager menu) {
+
+ // Add the actions defined in this view
+ menu.add(new Separator(IDebugUIConstants.EMPTY_EXPRESSION_GROUP));
+ menu.add(new Separator(IDebugUIConstants.EXPRESSION_GROUP));
+ menu.add(fAddToInspectorAction);
+ menu.add(fChangeVariableAction);
+ menu.add(fRemoveFromInspectorAction);
+ menu.add(fRemoveAllFromInspectorAction);
+ menu.add(new Separator(IDebugUIConstants.EMPTY_RENDER_GROUP));
+ menu.add(new Separator(IDebugUIConstants.RENDER_GROUP));
+ menu.add(fShowTypesAction);
+ menu.add(fShowQualifiedAction);
+ menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ /**
+ * Adds a inspect item to the list, and sets the selection to either
+ * the first child or to the item if it has no children.
+ */
+ public void addToInspector(InspectItem item) {
+ fContentProvider.addToInspector(item);
+ }
+
+ /**
+ * Removes a items from the list
+ */
+ public void removeFromInspector(Object object) {
+ // first we have to get the root item to remove
+ while (! (object instanceof InspectItem && object != null)) {
+ object = fContentProvider.getParent(object);
+ }
+ if (object != null) {
+ fContentProvider.removeFromInspector((InspectItem)object);
+ }
+ }
+
+ /**
+ * Removes all items from the list
+ */
+ public void removeAllFromInspector() {
+ fContentProvider.removeAll();
+ fViewer.setInput(null);
+ fDrillPart.reset();
+ }
+
+ /**
+ * Handles key events in viewer. Specifically interested in
+ * the Delete key.
+ */
+ protected void handleKeyPressed(KeyEvent event) {
+ if (event.character == SWT.DEL && event.stateMask == 0
+ && fRemoveFromInspectorAction.isEnabled()) {
+ fRemoveFromInspectorAction.run();
+ }
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorViewAddToInspectorAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorViewAddToInspectorAction.java
new file mode 100644
index 000000000..75f7a99f3
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/InspectorViewAddToInspectorAction.java
@@ -0,0 +1,64 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import java.util.Iterator;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IVariable;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+/**
+ * This action applies specifically to the <code>InspectorView</code>, whereas
+ * <code>AddToInspectorAction</code> applies to a more generic variables view.
+ * The difference is that this action has to avoid re-adding items
+ * to the inspector.
+ */
+public class InspectorViewAddToInspectorAction extends AddToInspectorAction {
+
+ public InspectorViewAddToInspectorAction(ISelectionProvider sp) {
+ super(sp);
+ }
+
+ /**
+ * @see AddToInspectorAction
+ * Top-level items in the inspector are of type <code>InspectItem</code>.
+ * Children are <code>IVariable</code>s. So to avoid re-adding top-level items to
+ * the inspector, we simply check the type, and only add <code>IVariable</code>s.
+ */
+ protected void doAction(InspectorView view) throws DebugException {
+ IStructuredSelection s = getStructuredSelection();
+ Iterator vars = s.iterator();
+ while (vars.hasNext()) {
+ Object item= vars.next();
+ if (item instanceof IVariable) {
+ IVariable var = (IVariable)item;
+ DebugUITools.inspect(var.getName(), var.getValue());
+ }
+ }
+ }
+
+ /**
+ * @see InspectorAction
+ */
+ public void selectionChanged(IStructuredSelection sel) {
+ if (sel == null) {
+ setEnabled(false);
+ return;
+ }
+ Iterator iterator= sel.iterator();
+ while (iterator.hasNext()) {
+ Object item= iterator.next();
+ if (item instanceof IVariable) {
+ setEnabled(true);
+ return;
+ }
+ }
+ setEnabled(false);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchDropDownAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchDropDownAction.java
new file mode 100644
index 000000000..8960af12b
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchDropDownAction.java
@@ -0,0 +1,98 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowPulldownDelegate;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+
+/**
+ * Superclass of run & debug pulldown actions.
+ */
+public abstract class LaunchDropDownAction implements IWorkbenchWindowPulldownDelegate {
+
+ private ExecutionAction fLaunchAction;
+
+ /**
+ * Create a new instance of this class
+ */
+ public LaunchDropDownAction(ExecutionAction launchAction) {
+ fLaunchAction= launchAction;
+ }
+
+ private void createMenuForAction(Menu parent, Action action) {
+ ActionContributionItem item= new ActionContributionItem(action);
+ item.fill(parent, -1);
+ }
+
+ /**
+ * @see IWorkbenchWindowActionDelegate
+ */
+ public void dispose() {
+ }
+
+ /**
+ * @see IWorkbenchWindowPulldownDelegate
+ */
+ public Menu getMenu(Control parent) {
+ Menu menu= new Menu(parent);
+ ILaunch[] historyList= getHistory();
+ int count= 0;
+ for (int i = 0; i < historyList.length; i++) {
+ ILaunch launch= historyList[i];
+ if (launch != null) {
+ RelaunchHistoryLaunchAction newAction= new RelaunchHistoryLaunchAction(launch, getMode());
+ createMenuForAction(menu, newAction);
+ count++;
+ }
+ }
+ if (count > 0) {
+ new MenuItem(menu, SWT.SEPARATOR);
+ }
+ createMenuForAction(menu, new LaunchWithAction(getMode()));
+
+ return menu;
+ }
+
+ /**
+ * @see IActionDelegate
+ */
+ public void run(IAction action) {
+ fLaunchAction.run();
+ }
+
+ /**
+ * @see IActionDelegate
+ */
+ public void selectionChanged(IAction action, ISelection selection){
+ }
+
+ /**
+ * @see IWorkbenchWindowActionDelegate
+ */
+ public void init(IWorkbenchWindow window){
+ }
+
+ /**
+ * Returns an array of previous launches applicable to this drop down
+ */
+ public abstract ILaunch[] getHistory();
+
+ /**
+ * Returns the mode (e.g., 'run' or 'debug') of this drop down
+ */
+ public abstract String getMode();
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchSelectionAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchSelectionAction.java
new file mode 100644
index 000000000..0b8dbbc8e
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchSelectionAction.java
@@ -0,0 +1,71 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.core.ILauncher;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+public class LaunchSelectionAction extends Action {
+
+ protected ILauncher fLauncher;
+ protected String fMode;
+ protected Object fElement;
+
+ public LaunchSelectionAction(ILauncher launcher, Object element, String mode) {
+ super();
+ fLauncher= launcher;
+ fMode= mode;
+ fElement= element;
+ setText(new DelegatingModelPresentation().getText(launcher));
+ ImageDescriptor descriptor= null;
+ if (fMode.equals(ILaunchManager.DEBUG_MODE)) {
+ descriptor= DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_ACT_DEBUG);
+ } else {
+ descriptor= DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_ACT_RUN);
+ }
+
+ if (descriptor != null) {
+ setImageDescriptor(descriptor);
+ }
+ }
+
+ /**
+ * @see IAction
+ */
+ public void run() {
+ BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
+ public void run() {
+ if (fElement != null) {
+ fLauncher.launch(new Object[] {fElement}, fMode);
+ } else {
+ Shell shell= DebugUIPlugin.getActiveWorkbenchWindow().getShell();
+ if (shell != null) {
+ useWizard(new Object[] {fLauncher}, shell, StructuredSelection.EMPTY);
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * Use the launch wizard to do the launch.
+ */
+ protected void useWizard(Object[] launchers, Shell shell, IStructuredSelection selection) {
+ LaunchWizard wizard= new LaunchWizard(launchers, selection, fMode, false);
+ LaunchWizardDialog dialog= new LaunchWizardDialog(shell, wizard);
+ dialog.open();
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWithAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWithAction.java
new file mode 100644
index 000000000..16d2cd1c4
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWithAction.java
@@ -0,0 +1,132 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.core.ILauncher;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+
+/**
+ * A cascading sub-menu that shows all launchers pertinent to this action's mode
+ * (e.g., 'run' or 'debug').
+ */
+public class LaunchWithAction extends Action implements IMenuCreator {
+
+ private static final String PREFIX= "launch_with_action.";
+ protected String fMode;
+
+ /**
+ * @see IAction
+ */
+ public void run() {
+ }
+
+ public LaunchWithAction(String mode) {
+ super();
+ fMode= mode;
+ String text= mode.equals(ILaunchManager.DEBUG_MODE) ? DebugUIUtils.getResourceString(PREFIX + TEXT + ".debug") : DebugUIUtils.getResourceString(PREFIX + TEXT + ".run");
+ setText(text);
+ ImageDescriptor descriptor= null;
+ if (mode.equals(ILaunchManager.DEBUG_MODE)) {
+ descriptor= DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_ACT_DEBUG);
+ } else {
+ descriptor= DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_ACT_RUN);
+ }
+
+ if (descriptor != null) {
+ setImageDescriptor(descriptor);
+ }
+ setMenuCreator(this);
+ }
+
+ private void createMenuForAction(Menu parent, Action action) {
+ ActionContributionItem item= new ActionContributionItem(action);
+ item.fill(parent, -1);
+ }
+
+ /**
+ * @see IMenuCreator
+ */
+ public void dispose() {
+ }
+
+ /**
+ * @see IMenuCreator
+ */
+ public Menu getMenu(Control parent) {
+ return null;
+ }
+
+ /**
+ * @see IMenuCreator
+ */
+ public Menu getMenu(Menu parent) {
+ Object element= null;
+ ILaunchManager manager= DebugPlugin.getDefault().getLaunchManager();
+ ILauncher[] launchers= manager.getLaunchers(fMode);
+ IStructuredSelection selection = resolveSelection(DebugUIPlugin.getActiveWorkbenchWindow());
+ if (selection != null) {
+ element= selection.getFirstElement();
+ }
+
+ Menu menu= new Menu(parent);
+ for (int i= 0; i < launchers.length; i++) {
+ if (DebugUIPlugin.getDefault().isVisible(launchers[i])) {
+ LaunchSelectionAction newAction= new LaunchSelectionAction(launchers[i], element, fMode);
+ createMenuForAction(menu, newAction);
+ }
+ }
+ return menu;
+ }
+
+ /**
+ * Determines and returns the selection that provides context for the launch,
+ * or <code>null</code> if there is no selection.
+ */
+ protected IStructuredSelection resolveSelection(IWorkbenchWindow window) {
+ if (window == null) {
+ return null;
+ }
+ ISelection selection= window.getSelectionService().getSelection();
+ if (selection == null || selection.isEmpty() || !(selection instanceof IStructuredSelection)) {
+ // there is no obvious selection - go fishing
+ selection= null;
+ IWorkbenchPage p= window.getActivePage();
+ if (p == null) {
+ //workspace is closed
+ return null;
+ }
+ IEditorPart editor= p.getActiveEditor();
+ Object element= null;
+
+ // first, see if there is an active editor, and try its input element
+ if (editor != null) {
+ element= editor.getEditorInput();
+ }
+
+ if (selection == null && element != null) {
+ selection= new StructuredSelection(element);
+ }
+ }
+ return (IStructuredSelection)selection;
+ }
+}
+
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizard.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizard.java
new file mode 100644
index 000000000..2bcf68ba7
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizard.java
@@ -0,0 +1,217 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILauncher;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.*;
+import java.util.Iterator;
+
+/**
+ * This wizard is used when the debug or run button is pressed, and
+ * the launcher/element resolution is not 1:1. It allows the user to
+ * choose a launcher and element to launch.
+ *
+ * <p>The renderer used to render elements to launch is pluggable,
+ * allowing launchers to provide custom renderers for the elements
+ * they can launch.
+ */
+
+public class LaunchWizard extends Wizard {
+
+ //NLS
+ private static final String PREFIX = "launch_wizard.";
+ private static final String DEBUG = PREFIX + "title.debug";
+ private static final String RUN = PREFIX + "title.run";
+
+ /**
+ * The collection of available launchers
+ */
+ protected Object[] fLaunchers;
+
+ /**
+ * The selection providing context to determine launchables
+ */
+ protected IStructuredSelection fSelection;
+
+ /**
+ * The launch page
+ */
+ protected LaunchWizardSelectionPage fPage;
+
+ /**
+ * The mode of the wizard.
+ * @see ExecutionAction#getMode()
+ */
+ protected String fMode;
+
+ /**
+ * The old default launcher set for the <code>IProject</code>
+ * associated with the current selection.
+ */
+ protected ILauncher fOldDefaultLauncher= null;
+
+ /**
+ * Indicates if the default launcher has been set for the <code>IProject</code>
+ * associated with the current selection.
+ */
+ protected boolean fDefaultLauncherSet= false;
+
+ /**
+ * Indicates if the wizard needs to determine the launcher to use
+ */
+ protected boolean fSelectLauncher;
+
+ /**
+ * Constructs a wizard with a set of launchers, a selection, a mode
+ * and whether to select a launcher.
+ */
+ public LaunchWizard(Object[] allLaunchers, IStructuredSelection selection, String mode, boolean selectLauncher) {
+ fSelectLauncher= selectLauncher;
+ fLaunchers= allLaunchers;
+ fSelection= selection;
+ fMode= mode;
+ initialize();
+ }
+
+ public LaunchWizard(Object[] allLaunchers, IStructuredSelection selection, String mode) {
+ this(allLaunchers, selection, mode, allLaunchers.length > 1);
+ }
+
+ protected void initialize() {
+ setNeedsProgressMonitor(true);
+ setForcePreviousAndNextButtons(true);
+ if (fMode.equals(ILaunchManager.DEBUG_MODE)) {
+ setWindowTitle(DebugUIUtils.getResourceString(DEBUG));
+ } else {
+ setWindowTitle(DebugUIUtils.getResourceString(RUN));
+ }
+ setDefaultPageImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_OBJS_LAUNCH_DEBUG));
+ }
+ /**
+ * @see Wizard#addPages
+ */
+ public void addPages() {
+ if (fSelection == null || fSelection.isEmpty()) {
+ addPage(new LaunchWizardProjectSelectionPage(fMode));
+ }
+ if (fSelectLauncher) {
+ addPage(fPage= new LaunchWizardSelectionPage(fLaunchers, fMode));
+ }
+ }
+
+ public IStructuredSelection getSelection() {
+ return fSelection;
+ }
+
+ /**
+ * Updates the default launcher if required - i.e. if the checkbox is
+ * checked.
+ */
+ public void updateDefaultLauncher() {
+ IProject project= getProject();
+ if (fSelectLauncher && fPage.fSetAsDefaultLauncher.getSelection()) {
+ ILauncher launcher= fPage.getLauncher();
+ if (launcher != null) {
+ try {
+ fOldDefaultLauncher= DebugPlugin.getDefault().getLaunchManager().getDefaultLauncher(project);
+ DebugPlugin.getDefault().getLaunchManager().setDefaultLauncher(project, launcher);
+ fDefaultLauncherSet= true;
+ } catch (CoreException e) {
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the <code>IProject</code> that is associated with the context selection,
+ * or <code>null</code> if there is no single project associated with the selection.
+ */
+ protected IProject getProject() {
+ IProject project= null;
+ Iterator elements= fSelection.iterator();
+ while (elements.hasNext()) {
+ Object e= elements.next();
+ IResource res= null;
+ if (e instanceof IAdaptable) {
+ res= (IResource) ((IAdaptable) e).getAdapter(IResource.class);
+ }
+ if (res != null) {
+ IProject p= res.getProject();
+ if (project == null) {
+ project= p;
+ } else
+ if (!project.equals(p)) {
+ return null;
+ }
+ }
+ }
+
+ return project;
+ }
+
+ /**
+ * @see IWizard#performFinish
+ */
+ public boolean performFinish() {
+ if (!fDefaultLauncherSet) {
+ updateDefaultLauncher();
+ }
+ return true;
+ }
+
+ /**
+ * @see IWizard#performCancel
+ */
+ public boolean performCancel() {
+ if (fDefaultLauncherSet) {
+ try {
+ DebugPlugin.getDefault().getLaunchManager().setDefaultLauncher(getProject(), fOldDefaultLauncher);
+ } catch (CoreException e) {
+ return false;
+ }
+ fDefaultLauncherSet= false;
+ }
+ return true;
+ }
+
+ /**
+ * Sets the selection that is the context for the launch.
+ */
+ public void setProjectSelection(IStructuredSelection selection) {
+ fSelection= selection;
+ }
+
+ /**
+ * @see IWizard#getNextPage(IWizardPage)
+ */
+ public IWizardPage getNextPage(IWizardPage page) {
+ if (!fSelectLauncher) {
+ IWizardNode node= new LaunchWizardNode(page, (ILauncher)fLaunchers[0], fMode);
+ IWizard wizard = node.getWizard();
+ wizard.addPages();
+ return wizard.getStartingPage();
+ }
+ return super.getNextPage(page);
+ }
+
+ /**
+ * @see IWizard#canFinish()
+ */
+ public boolean canFinish() {
+ //it is the nested wizard that will finish
+ return false;
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardDialog.java
new file mode 100644
index 000000000..fa6e3851b
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardDialog.java
@@ -0,0 +1,55 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import java.lang.reflect.InvocationTargetException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Subclassed to provide access to button presses
+ */
+public class LaunchWizardDialog extends WizardDialog {
+
+ protected LaunchWizard fWizard;
+
+ /**
+ * Constructs a wizard dialog
+ */
+ public LaunchWizardDialog(Shell shell, LaunchWizard w) {
+ super(shell, w);
+ fWizard= w;
+ }
+
+ /**
+ * Only needed for VAJ support as cannot use <code>LaunchWizard.super.nextPressed()</code>
+ * in the runnable
+ */
+ private void nextPressed0() {
+ super.nextPressed();
+ }
+
+ protected void cancelPressed() {
+ fWizard.performCancel();
+ super.cancelPressed();
+ }
+
+ protected void nextPressed() {
+ try {
+ run(false, false, new IRunnableWithProgress() {
+ public void run(IProgressMonitor pm) {
+ nextPressed0();
+ }
+ });
+ } catch (InterruptedException ie) {
+ } catch (InvocationTargetException ite) {
+ }
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardNode.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardNode.java
new file mode 100644
index 000000000..04f067cb5
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardNode.java
@@ -0,0 +1,104 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.debug.core.ILauncher;
+import org.eclipse.debug.ui.ILaunchWizard;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.IWizardNode;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ * A wizard node represents a "potential" wizard. Wizard nodes
+ * allow the user to pick from several available nested wizards.
+ */
+public class LaunchWizardNode implements IWizardNode {
+
+ private static final String PREFIX= "launch_wizard_node.";
+ private static final String ERROR= PREFIX + "error.";
+
+ protected IWizard fWizard;
+ protected IWizardPage fParentWizardPage;
+ protected ILauncher fLauncher;
+
+ protected String fMode;
+ /**
+ * Creates a node that holds onto a wizard element.
+ * The wizard element provides information on how to create
+ * the wizard supplied by the ISV's extension.
+ */
+ public LaunchWizardNode(IWizardPage aWizardPage, ILauncher launcher, String mode) {
+ fParentWizardPage= aWizardPage;
+ fLauncher= launcher;
+ fMode= mode;
+ }
+
+ /**
+ * Returns the wizard represented by this wizard node.
+ */
+ public ILaunchWizard createWizard() throws CoreException {
+ IConfigurationElement config= fLauncher.getConfigurationElement();
+ ILaunchWizard wizard= (ILaunchWizard)DebugUIPlugin.getDefault().createExtension(config, "wizard");
+ wizard.init(fLauncher, fMode, ((LaunchWizard)fParentWizardPage.getWizard()).getSelection());
+ return wizard;
+ }
+
+ /**
+ * @see org.eclipse.jface.wizard.IWizardNode#getExtent()
+ */
+ public Point getExtent() {
+ return new Point(-1, -1);
+ }
+
+ /**
+ * @see org.eclipse.jface.wizards.IWizardNode#getWizard()
+ */
+ public IWizard getWizard() {
+ if (fWizard != null) {
+ return fWizard; // we've already created it
+ }
+ try {
+ fWizard= createWizard(); // create instance of target wizard
+ } catch (CoreException e) {
+ DebugUIUtils.errorDialog(fParentWizardPage.getControl().getShell(), ERROR, e.getStatus());
+ return null;
+ }
+
+ return fWizard;
+ }
+
+ /**
+ * @see org.eclipse.jface.wizard.IWizardNode#isContentCreated()
+ */
+ public boolean isContentCreated() {
+ return fWizard != null;
+ }
+
+ /**
+ * @see org.eclipse.jface.wizard.IWizardNode#dispose()
+ */
+ public void dispose() {
+ // Do nothing since the wizard wasn't created via reflection.
+ fWizard= null;
+ }
+
+ /**
+ * Returns the description specified for the launcher associated
+ * with the wizard node.
+ */
+ public String getDescription() {
+ IConfigurationElement config= fLauncher.getConfigurationElement();
+ String description= config.getAttribute("description");
+ if (description == null) {
+ description= "";
+ }
+ return description;
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardProjectSelectionPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardProjectSelectionPage.java
new file mode 100644
index 000000000..bb30f1266
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardProjectSelectionPage.java
@@ -0,0 +1,290 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+
+/**
+ * Used to select the project that will be used as a launch context.
+ */
+public class LaunchWizardProjectSelectionPage extends WizardPage {
+
+ private static final String PREFIX= "launch_wizard_project_page.";
+ private static final String LAUNCHER= PREFIX + "launcher";
+ private static final String SELECT_ELEMENTS= PREFIX + "select_elements";
+ private static final String SELECT_ERROR_ELEMENTS= PREFIX + "select_error_elements";
+ private static final String PATTERN_LABEL= PREFIX + "pattern_label";
+
+ /**
+ * Viewer for the projects to provide the context for the launch
+ */
+ protected TableViewer fElementsList;
+
+ /**
+ * A text field to perform pattern matching
+ */
+ protected Text fPatternText;
+
+ /**
+ * The filtered array
+ */
+ protected Object[] fFilteredElements;
+
+ /**
+ * A content provider for the elements list
+ */
+ class ElementsContentProvider implements IStructuredContentProvider {
+
+ protected IWorkspaceRoot fWorkspaceRoot;
+
+ /**
+ * @see IContentProvider#inputChanged
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ fWorkspaceRoot= (IWorkspaceRoot)newInput;
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object parent) {
+ if (fWorkspaceRoot != null) {
+ return fWorkspaceRoot.getProjects();
+ }
+
+ return new Object[]{};
+ }
+ }
+
+ class PatternFilter extends ViewerFilter {
+ protected StringMatcher fMatcher= null;
+
+ /**
+ * @see ViewerFilter
+ */
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if (fMatcher == null) {
+ return true;
+ }
+ ILabelProvider lp= (ILabelProvider) fElementsList.getLabelProvider();
+ return fMatcher.match(lp.getText(element));
+ }
+
+ public void setPattern(String pattern) {
+ fMatcher= new StringMatcher(pattern + "*", true, false);
+ }
+
+ /**
+ * Cache the filtered elements so we can single-select.
+ *
+ * @see ViewerFilter
+ */
+ public Object[] filter(Viewer viewer, Object parent, Object[] input) {
+ fFilteredElements= super.filter(viewer, parent, input);
+ return fFilteredElements;
+ }
+
+ }
+
+ class SimpleSorter extends ViewerSorter {
+ /**
+ * @seeViewerSorter#isSorterProperty(Object, Object)
+ */
+ public boolean isSorterProperty(Object element, Object property) {
+ return true;
+ }
+ }
+
+ /**
+ * Constructs a this page for the given mode
+ */
+ public LaunchWizardProjectSelectionPage(String mode) {
+ super(DebugUIUtils.getResourceString(PREFIX + "title"));
+ // Set the image for the wizard based on the mode
+ if (mode.equals(ILaunchManager.DEBUG_MODE)) {
+ setImageDescriptor(DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_WIZBAN_DEBUG));
+ } else {
+ setImageDescriptor(DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_WIZBAN_RUN));
+ }
+ }
+
+ /**
+ * Creates the contents of the page - a sorted list of
+ * the projects in the workspace and text area to enter
+ * a pattern to match.
+ */
+ public void createControl(Composite ancestor) {
+ Composite root= new Composite(ancestor, SWT.NONE);
+ GridLayout l= new GridLayout();
+ l.numColumns= 1;
+ l.makeColumnsEqualWidth= true;
+ root.setLayout(l);
+
+ createElementsGroup(root);
+
+ setDescription(DebugUIUtils.getResourceString(PREFIX + "title"));
+
+ setPageComplete(false);
+ setTitle(DebugUIUtils.getResourceString(PREFIX + "title"));
+ setControl(root);
+ }
+
+ public void createElementsGroup(Composite root) {
+ Label elementsLabel= new Label(root, SWT.NONE);
+ elementsLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+ elementsLabel.setText(DebugUIUtils.getResourceString(PATTERN_LABEL));
+
+ fPatternText= new Text(root, SWT.BORDER);
+ fPatternText.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+
+ fElementsList= new TableViewer(root) {
+ protected void handleDoubleSelect(SelectionEvent event) {
+ getContainer().showPage(getNextPage());
+ }
+ };
+
+ Table list= fElementsList.getTable();
+
+ GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
+ gd.heightHint= 200;
+ gd.grabExcessVerticalSpace= true;
+ list.setLayoutData(gd);
+
+ fElementsList.setContentProvider(new ElementsContentProvider());
+ fElementsList.setLabelProvider(new WorkbenchLabelProvider());
+ fElementsList.setSorter(new SimpleSorter());
+
+ final PatternFilter filter= new PatternFilter();
+ fElementsList.addFilter(filter);
+ fPatternText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ filter.setPattern(((Text) (e.widget)).getText());
+ fElementsList.refresh();
+ if (fFilteredElements.length == 1) {
+ fElementsList.setSelection(new StructuredSelection(fFilteredElements[0]), true);
+ setMessage(null);
+ setPageComplete(true);
+ } else {
+ fElementsList.setSelection(null);
+ // this should get done in the selection changed callback - but it does not work
+ if (fFilteredElements.length == 0) {
+ setMessage(DebugUIUtils.getResourceString(SELECT_ERROR_ELEMENTS));
+ } else {
+ setMessage(DebugUIUtils.getResourceString(SELECT_ELEMENTS));
+ }
+
+ setPageComplete(false);
+ }
+ }
+ });
+
+ fElementsList.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent e) {
+ if (e.getSelection().isEmpty()) {
+ setMessage(DebugUIUtils.getResourceString(SELECT_ELEMENTS));
+ setPageComplete(false);
+ } else if (e.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection ss= (IStructuredSelection) e.getSelection();
+ if (!ss.isEmpty()) {
+ ((LaunchWizard)getWizard()).setProjectSelection(ss);
+ setMessage(null);
+ setPageComplete(true);
+ }
+ }
+ }
+ });
+
+ fElementsList.setInput(ResourcesPlugin.getWorkspace().getRoot());
+ initializeSettings();
+ }
+
+ /**
+ * Returns the selected Java project for the context of the launch or <code>null</code> if
+ * no Java project is selected.
+ */
+ protected Object[] getElements() {
+ ISelection s= fElementsList.getSelection();
+ if (s.isEmpty()) {
+ return null;
+ }
+
+ if (s instanceof IStructuredSelection) {
+ return ((IStructuredSelection) s).toArray();
+ }
+
+ return null;
+ }
+
+ /**
+ * Convenience method to set the message line
+ */
+ public void setMessage(String message) {
+ super.setErrorMessage(null);
+ super.setMessage(message);
+ }
+
+ /**
+ * Convenience method to set the error line
+ */
+ public void setErrorMessage(String message) {
+ super.setMessage(null);
+ super.setErrorMessage(message);
+ }
+
+ /**
+ * Initialize the settings:<ul>
+ * <li>If there is only one project, select it
+ * <li>Put the cursor in the pattern text area
+ * </ul>
+ */
+ protected void initializeSettings() {
+
+ Runnable runnable= new Runnable() {
+ public void run() {
+ Object[] children= ResourcesPlugin.getWorkspace().getRoot().getProjects();
+ if (children.length == 1) {
+ fElementsList.setSelection(new StructuredSelection(children[0]), true);
+ setMessage(null);
+ setPageComplete(true);
+ } else if (children.length > 0) {
+ setMessage(DebugUIUtils.getResourceString(SELECT_ELEMENTS));
+ setPageComplete(false);
+ } else {
+ // no elements to select
+ setErrorMessage(DebugUIUtils.getResourceString(SELECT_ERROR_ELEMENTS));
+ setPageComplete(false);
+ }
+ fPatternText.setFocus();
+ }
+ };
+ Display.getCurrent().asyncExec(runnable);
+ }
+
+ /**
+ * @IWizardPage#canFlipToNextPage()
+ */
+ public boolean canFlipToNextPage() {
+ return isPageComplete();
+ }
+}
+
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardSelectionPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardSelectionPage.java
new file mode 100644
index 000000000..fe0ea4d21
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchWizardSelectionPage.java
@@ -0,0 +1,232 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.core.ILauncher;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.jface.wizard.IWizardContainer;
+import org.eclipse.jface.wizard.IWizardNode;
+import org.eclipse.jface.wizard.WizardSelectionPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.*;
+
+public class LaunchWizardSelectionPage extends WizardSelectionPage {
+
+ private static final String PREFIX= "launch_wizard_page.";
+ private static final String LAUNCHER= PREFIX + "launcher";
+ private static final String DEFAULT_LAUNCHER= PREFIX + "default_launcher";
+ private static final String SELECT_ERROR_LAUNCHER= PREFIX + "select_error_launcher";
+ /**
+ * Viewer for the launchers
+ */
+ protected TableViewer fLaunchersList;
+
+ /**
+ * List of launchers
+ */
+ protected Object[] fLaunchers;
+
+ /**
+ * Check box for setting default launcher
+ */
+ protected Button fSetAsDefaultLauncher;
+
+ /**
+ * The mode of the launch.
+ * @see ExecutionAction#getMode()
+ */
+ protected String fMode;
+
+ /**
+ * A content provider for the elements list
+ */
+ class ElementsContentProvider implements IStructuredContentProvider {
+
+ /**
+ * @see IContentProvider#inputChanged
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object parent) {
+ return fLaunchers;
+ }
+ }
+
+ class SimpleSorter extends ViewerSorter {
+ /**
+ * @seeViewerSorter#isSorterProperty(Object, Object)
+ */
+ public boolean isSorterProperty(Object element, Object property) {
+ return true;
+ }
+ }
+
+ public LaunchWizardSelectionPage(Object[] allLaunchers, String mode) {
+ super(DebugUIUtils.getResourceString(PREFIX + "title"));
+ fLaunchers= allLaunchers;
+ fMode= mode;
+ }
+
+ public void createControl(Composite ancestor) {
+ Composite root= new Composite(ancestor, SWT.NONE);
+ GridLayout l= new GridLayout();
+ l.numColumns= 1;
+ root.setLayout(l);
+ createLaunchersGroup(root);
+
+ setTitle(DebugUIUtils.getResourceString(PREFIX + "title"));
+ if (fMode.equals(ILaunchManager.DEBUG_MODE)) {
+ setImageDescriptor(DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_WIZBAN_DEBUG));
+ } else {
+ setImageDescriptor(DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_WIZBAN_RUN));
+ }
+ initializeSettings();
+ setControl(root);
+ }
+
+ public void createLaunchersGroup(Composite root) {
+
+ Label launchersLabel= new Label(root, SWT.NONE);
+ launchersLabel.setText(DebugUIUtils.getResourceString(LAUNCHER));
+
+ fLaunchersList= new TableViewer(new Table(root, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER)) {
+ protected void handleDoubleSelect(SelectionEvent event) {
+ updateSelection(getSelection());
+ ((LaunchWizard)getWizard()).updateDefaultLauncher();
+ getContainer().showPage(getNextPage());
+ }
+ };
+
+ Table list= fLaunchersList.getTable();
+
+ GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
+ gd.heightHint= 200;
+ gd.grabExcessVerticalSpace= true;
+ gd.grabExcessHorizontalSpace= true;
+ list.setLayoutData(gd);
+
+ fLaunchersList.setContentProvider(new ElementsContentProvider());
+ fLaunchersList.setLabelProvider(new DelegatingModelPresentation());
+ fLaunchersList.setSorter(new SimpleSorter());
+ fLaunchersList.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent e) {
+ if (e.getSelection() instanceof IStructuredSelection) {
+ IStructuredSelection ss= (IStructuredSelection) e.getSelection();
+ if (!ss.isEmpty()) {
+ launcherSelected((ILauncher)ss.getFirstElement());
+ }
+ }
+ }
+ });
+ fLaunchersList.setInput(fLaunchersList);
+
+ fSetAsDefaultLauncher= new Button(root, SWT.CHECK);
+ fSetAsDefaultLauncher.setText(DebugUIUtils.getResourceString(DEFAULT_LAUNCHER));
+ }
+
+ /**
+ * Updates the elements list for the given launcher
+ */
+ protected void launcherSelected(ILauncher launcher) {
+ LaunchWizardNode node= new LaunchWizardNode(this, launcher, fMode);
+ setSelectedNode(node);
+ setMessage(null);
+ updateDefaultLauncherButton(launcher);
+ setDescription(node.getDescription());
+ }
+
+ /**
+ * Convenience method to set the error line
+ */
+ public void setErrorMessage(String message) {
+ super.setMessage(null);
+ super.setErrorMessage(message);
+ }
+
+ /**
+ * Convenience method to set the message line
+ */
+ public void setMessage(String message) {
+ super.setErrorMessage(null);
+ super.setMessage(message);
+ }
+
+ /**
+ * Initialize the settings:<ul>
+ * <li>If there is only one launcher, select it
+ * </ul>
+ */
+ protected void initializeSettings() {
+ Runnable runnable= new Runnable() {
+ public void run() {
+
+ if (fLaunchers.length == 0) {
+ setErrorMessage(DebugUIUtils.getResourceString(SELECT_ERROR_LAUNCHER));
+ } else
+ fLaunchersList.setSelection(new StructuredSelection(fLaunchers[0]));
+ }
+ };
+ Display.getCurrent().asyncExec(runnable);
+ }
+
+ protected void updateDefaultLauncherButton(ILauncher launcher) {
+ IProject project= ((LaunchWizard)getWizard()).getProject();
+ if (project == null) {
+ // disable the control, we cannot set it without a project context
+ fSetAsDefaultLauncher.setSelection(false);
+ fSetAsDefaultLauncher.setEnabled(false);
+ } else {
+ // if the launcher is not the default launcher, enable the control
+ try {
+ ILauncher defaultLauncher= DebugPlugin.getDefault().getLaunchManager().getDefaultLauncher(project);
+ if (defaultLauncher != null && defaultLauncher.equals(launcher)) {
+ // disable the setting, but show that it is set
+ fSetAsDefaultLauncher.setSelection(true);
+ fSetAsDefaultLauncher.setEnabled(false);
+ } else {
+ // allow to set as default - in fact, set as default
+ fSetAsDefaultLauncher.setSelection(true);
+ fSetAsDefaultLauncher.setEnabled(true);
+ }
+ } catch (CoreException e) {
+ // disable default launcher
+ fSetAsDefaultLauncher.setSelection(false);
+ fSetAsDefaultLauncher.setEnabled(false);
+ }
+ }
+ }
+
+ protected ILauncher getLauncher() {
+ IStructuredSelection selection= (IStructuredSelection)fLaunchersList.getSelection();
+ if (selection.isEmpty()) {
+ return null;
+ }
+ return (ILauncher) selection.getFirstElement();
+ }
+
+ /**
+ * Implemented here to provide package access
+ */
+ protected IWizardContainer getContainer() {
+ return super.getContainer();
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LauncherPropertyPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LauncherPropertyPage.java
new file mode 100644
index 000000000..d64ee2074
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LauncherPropertyPage.java
@@ -0,0 +1,250 @@
+package org.eclipse.debug.internal.ui;
+
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.core.ILauncher;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.dialogs.PropertyPage;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.*;
+import java.util.ArrayList;
+
+/**
+ * A preference page to enable/disable default launchers for a resource.
+ */
+public class LauncherPropertyPage extends PropertyPage implements IWorkbenchPreferencePage {
+
+ private static final String PREFIX= "launcher_preferences.";
+ private static final String DESCRIPTION= PREFIX + "description";
+ private static final String RUN_DEBUG= PREFIX + "run_debug";
+ private static final String NONE= PREFIX + "none";
+ private static final String ERROR= PREFIX + "error.";
+
+ protected Combo fCombo;
+
+ /**
+ * Utility method that creates a combo instance
+ * and sets the default layout data.
+ */
+
+ private Combo createCombo(Composite parent, String[] items) {
+ Combo combo= new Combo(parent, SWT.READ_ONLY | SWT.DROP_DOWN);
+ combo.setItems(items);
+ GridData data= new GridData();
+ data.horizontalAlignment= GridData.HORIZONTAL_ALIGN_BEGINNING;
+ combo.setLayoutData(data);
+ return combo;
+ }
+
+ /**
+ * Creates composite control and sets the default layout data.
+ */
+
+ private Composite createComposite(Composite parent, int numColumns) {
+ Composite composite= new Composite(parent, SWT.NULL);
+
+ //GridLayout
+ GridLayout layout= new GridLayout();
+ layout.numColumns= numColumns;
+ composite.setLayout(layout);
+
+ //GridData
+ GridData data= new GridData();
+ data.verticalAlignment= GridData.FILL;
+ data.horizontalAlignment= GridData.FILL;
+ composite.setLayoutData(data);
+ return composite;
+ }
+
+ protected Control createContents(Composite parent){
+ return null;
+ }
+ /**
+ * Creates preference page controls on demand.
+ */
+ public void createControl(Composite parent) {
+
+ // Table to choose which tags are shown in the outliner
+ Composite pageComponent= createComposite(parent, 1);
+ createLabel(pageComponent, DebugUIUtils.getResourceString(DESCRIPTION));
+ ImageRegistry registry= DebugUIPlugin.getDefault().getImageRegistry();
+
+ ILauncher[] launchers= getLaunchManager().getLaunchers();
+ java.util.List list = new ArrayList(1);
+ list.add(DebugUIUtils.getResourceString(NONE));
+ for (int i = 0; i < launchers.length; i++) {
+ if (DebugUIPlugin.getDefault().isVisible(launchers[i]))
+ list.add(launchers[i].getLabel());
+ }
+ String[] items= new String[list.size()];
+ list.toArray(items);
+
+ //Composite box= createComposite(pageComponent, 2);
+ Composite launcherComponent= createComposite(pageComponent, 2);
+ createLabel(launcherComponent, DebugUIUtils.getResourceString(RUN_DEBUG), registry.get(IDebugUIConstants.IMG_ACT_DEBUG));
+ fCombo= createCombo(launcherComponent, items);
+
+ initializeValues();
+ setControl(pageComponent);
+ }
+
+ /**
+ * Utility method that creates a label instance
+ * and sets the default layout data.
+ */
+ private Label createLabel(Composite parent, String text) {
+ Label label= new Label(parent, SWT.LEFT);
+ label.setText(text);
+ GridData data= new GridData();
+ data.horizontalAlignment= GridData.FILL;
+ label.setLayoutData(data);
+ return label;
+ }
+
+ /**
+ * Utility method that creates a composite label instance
+ * and sets the default layout data.
+ */
+
+ private Composite createLabel(Composite parent, String text, Image image) {
+ Composite composite= createComposite(parent, 2);
+ Label imageLabel= new Label(composite, SWT.LEFT);
+ imageLabel.setImage(image);
+ Label textLabel= new Label(composite, SWT.LEFT);
+ textLabel.setText(text);
+
+ GridData data= new GridData();
+ data.horizontalAlignment= GridData.HORIZONTAL_ALIGN_BEGINNING;
+ composite.setLayoutData(data);
+
+ return composite;
+ }
+
+ /**
+ * The default button has been pressed.
+ */
+ protected void performDefaults() {
+ super.performDefaults();
+ // Select "none"
+ fCombo.select(0);
+ }
+
+ /**
+ * Returns preference store that belongs to the our plugin.
+ * This is important because we want to store
+ * our preferences separately from the desktop.
+ */
+ protected IPreferenceStore doGetPreferenceStore() {
+ return DebugUIPlugin.getDefault().getPreferenceStore();
+ }
+
+ /**
+ * This is a hook for subclasses to do special things when the ok
+ * button is pressed.
+ */
+ public boolean performOk() {
+ IProject project= getProject();
+ if (project != null) {
+ boolean ok;
+ String selection= fCombo.getText();
+ return saveLauncherProperty(project, selection);
+ }
+ return false;
+ }
+
+ /**
+ * Convenience method to get the launch manager
+ */
+ protected ILaunchManager getLaunchManager() {
+ return DebugPlugin.getDefault().getLaunchManager();
+ }
+
+ /**
+ * Returns the project this page works on
+ */
+ protected IProject getProject() {
+ IAdaptable element= getElement();
+ IProject project= null;
+ IResource resource= (IResource)element.getAdapter(IResource.class);
+ if (resource != null) {
+ return resource.getProject();
+ }
+ return null;
+ }
+
+ /**
+ * @see IWorkbenchPreferencePage
+ */
+ public void init(IWorkbench desktop) {
+ doGetPreferenceStore();
+ }
+
+ /**
+ * Initializes states of the controls.
+ */
+ private void initializeValues() {
+
+ IProject project= getProject();
+ if (project != null) {
+ try {
+ ILauncher launcher= getLaunchManager().getDefaultLauncher(project);
+ if (launcher == null) {
+ fCombo.select(0);
+ } else {
+ fCombo.setText(launcher.getLabel());
+ }
+ } catch (CoreException ce) {
+ fCombo.select(0);
+ DebugUIUtils.logError(ce);
+ }
+ }
+ }
+
+ /**
+ * Find the launcher with the given selection (name), and save it as the preference.
+ */
+ protected boolean saveLauncherProperty(IProject project, String selection) {
+ try {
+ ILauncher[] launchers= getLaunchManager().getLaunchers();
+ for (int i= 0; i < launchers.length; i++) {
+ ILauncher launcher= launchers[i];
+ if (launcher.getLabel().equals(selection)) {
+ getLaunchManager().setDefaultLauncher(project, launcher);
+ return true;
+ }
+ }
+ getLaunchManager().setDefaultLauncher(project, null);
+ } catch (CoreException e) {
+ DebugUIUtils.errorDialog(DebugUIPlugin.getActiveWorkbenchWindow().getShell(), ERROR, e.getStatus());
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * The push button has been double clicked
+ */
+ public void widgetDoubleSelected(SelectionEvent event) {
+
+ // The select all button has been double clicked
+ }
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchesView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchesView.java
new file mode 100644
index 000000000..5958af5f3
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchesView.java
@@ -0,0 +1,219 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.model.IProcess;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.actions.SelectionProviderAction;
+import org.eclipse.ui.dialogs.PropertyDialogAction;
+
+public class LaunchesView extends AbstractDebugView implements ISelectionChangedListener {
+
+ protected final static String PREFIX= "launches_view.";
+
+ protected SelectionProviderAction fTerminateAction;
+ protected RemoveTerminatedAction fRemoveTerminatedAction;
+ protected TerminateAllAction fTerminateAllAction;
+ protected SelectionProviderAction fDisconnectAction;
+ protected SelectionProviderAction fRelaunchAction;
+ protected SelectionProviderAction fTerminateAndRemoveAction;
+
+ protected PropertyDialogAction fPropertyDialogAction;
+
+ /**
+ * Updates the state of the buttons in the view
+ */
+ protected void updateButtons() {
+ ISelection s= fViewer.getSelection();
+ if (s instanceof IStructuredSelection) {
+ IStructuredSelection selection= (IStructuredSelection) s;
+ fTerminateAction.selectionChanged(selection);
+ fDisconnectAction.selectionChanged(selection);
+ }
+ fRemoveTerminatedAction.update();
+ }
+
+ /**
+ * Initializes the actions of this view.
+ */
+ protected void initializeActions(LaunchesViewer viewer) {
+
+ fTerminateAction= new ControlAction(viewer, new TerminateActionDelegate());
+ fTerminateAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_TERMINATE));
+ fTerminateAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_TERMINATE));
+ fTerminateAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TERMINATE));
+ fTerminateAction.setEnabled(false);
+
+ fDisconnectAction= new ControlAction(viewer, new DisconnectActionDelegate());
+ fDisconnectAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_DISCONNECT));
+ fDisconnectAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_DISCONNECT));
+ fDisconnectAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_DISCONNECT));
+ fDisconnectAction.setEnabled(false);
+
+ fRemoveTerminatedAction= new RemoveTerminatedAction(this instanceof DebugView);
+ fRemoveTerminatedAction.setHoverImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_LCL_REMOVE_TERMINATED));
+ fRemoveTerminatedAction.setDisabledImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_REMOVE_TERMINATED));
+ fRemoveTerminatedAction.setImageDescriptor(DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_REMOVE_TERMINATED));
+ fRemoveTerminatedAction.setEnabled(false);
+
+ fRelaunchAction= new ControlAction(viewer, new RelaunchActionDelegate());
+ fRelaunchAction.setEnabled(false);
+
+ fTerminateAndRemoveAction= new ControlAction(viewer, new TerminateAndRemoveActionDelegate());
+
+ fTerminateAllAction= new TerminateAllAction();
+
+ fPropertyDialogAction= new PropertyDialogAction(getSite().getWorkbenchWindow().getShell(), getSite().getSelectionProvider());
+ }
+
+ /**
+ * @see IWorkbenchPart
+ */
+ public void createPartControl(Composite parent) {
+ boolean showDebugTargets = getSite().getId().equals(IDebugUIConstants.ID_DEBUG_VIEW);
+ LaunchesViewer lv = new LaunchesViewer(parent, showDebugTargets, this);
+ fViewer= lv;
+ fViewer.addSelectionChangedListener(this);
+ fViewer.setContentProvider(getContentProvider());
+ fViewer.setLabelProvider(new DelegatingModelPresentation());
+ fViewer.setUseHashlookup(true);
+ // add my viewer as a selection provider, so selective re-launch works
+ getSite().setSelectionProvider(fViewer);
+ initializeActions(lv);
+ // register this viewer as the debug UI selection provider
+ DebugUIPlugin.getDefault().addSelectionProvider(fViewer, this);
+
+ // create context menu
+ createContextMenu(lv.getTree());
+ initializeToolBar();
+ lv.expandToLevel(2);
+ fViewer.setInput(DebugPlugin.getDefault().getLaunchManager());
+ fViewer.getControl().addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent e) {
+ handleKeyPressed(e);
+ }
+ });
+ setTitleToolTip(getTitleToolTipText(getPrefix()));
+ }
+
+ /**
+ * Configures the toolBar
+ */
+ protected void configureToolBar(IToolBarManager tbm) {
+ tbm.add(fTerminateAction);
+ tbm.add(fDisconnectAction);
+ tbm.add(fRemoveTerminatedAction);
+ }
+
+ /**
+ * @see IWorkbenchPart
+ */
+ public void setFocus() {
+ Control c = fViewer.getControl();
+ if (!c.isFocusControl()) {
+ c.setFocus();
+ //ensure that all downstream listeners
+ //know the current selection..switching from another view
+ DebugUIPlugin.getDefault().selectionChanged(new SelectionChangedEvent(fViewer, fViewer.getSelection()));
+ }
+ }
+
+ /**
+ * Adds items to the context menu
+ */
+ protected void fillContextMenu(IMenuManager mgr) {
+ fRemoveTerminatedAction.update();
+ fTerminateAllAction.update();
+
+ mgr.add(new Separator(IDebugUIConstants.EMPTY_LAUNCH_GROUP));
+ mgr.add(new Separator(IDebugUIConstants.LAUNCH_GROUP));
+
+ mgr.add(fTerminateAction);
+ mgr.add(fDisconnectAction);
+ mgr.add(new Separator());
+ mgr.add(fTerminateAndRemoveAction);
+ mgr.add(fTerminateAllAction);
+ mgr.add(fRemoveTerminatedAction);
+ mgr.add(fRelaunchAction);
+ mgr.add(new Separator(IDebugUIConstants.PROPERTY_GROUP));
+ fPropertyDialogAction.setEnabled(fPropertyDialogAction.isApplicableForSelection());
+ mgr.add(fPropertyDialogAction);
+ mgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ /**
+ * @see IWorkbenchPart
+ */
+ public void dispose() {
+ if (fViewer != null) {
+ DebugUIPlugin.getDefault().removeSelectionProvider(fViewer, this);
+ }
+ super.dispose();
+ }
+
+ /**
+ * Auto-expand and select the given element - must be called in UI thread.
+ * This is used to implement auto-expansion-and-select on a SUSPEND event.
+ */
+ public void autoExpand(Object element) {
+ Object selectee = element;
+ if (element instanceof ILaunch) {
+ IProcess[] ps= ((ILaunch)element).getProcesses();
+ if (ps != null && ps.length > 0) {
+ selectee= ps[0];
+ }
+ }
+ fViewer.setSelection(new StructuredSelection(selectee), true);
+ }
+
+ /**
+ * Returns the content provider to use for the viewer of this view.
+ */
+ protected DebugContentProvider getContentProvider() {
+ return new ProcessesContentProvider();
+ }
+
+ /**
+ * The selection has changed in the viewer. Update
+ * the state of the buttons.
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ updateButtons();
+ }
+
+ /**
+ * Returns the resource bundle prefix for this action
+ */
+ protected String getPrefix(){
+ return PREFIX;
+ }
+
+ /**
+ * Handles key events in viewer. Specifically interested in
+ * the Delete key.
+ */
+ protected void handleKeyPressed(KeyEvent event) {
+ if (event.character == SWT.DEL && event.stateMask == 0
+ && fTerminateAndRemoveAction.isEnabled()) {
+ fTerminateAndRemoveAction.run();
+ }
+ }
+}
+
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchesViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchesViewer.java
new file mode 100644
index 000000000..dc5047412
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchesViewer.java
@@ -0,0 +1,87 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.model.IStackFrame;
+import org.eclipse.debug.core.model.IThread;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Tree;
+
+/**
+ * The launches viewer displays a tree of launches. It can be
+ * configured to display run launches or debug launches. When
+ * displaying run launches, it filters debug targets from the viewer.
+ * When displaying debug launches, debug targets are displayed,
+ * and the debug target's corresponding system process is filtered
+ * from the view.
+ */
+public class LaunchesViewer extends TreeViewer {
+ /**
+ * The view this viewer is contained in
+ */
+ protected LaunchesView fView;
+
+ public LaunchesViewer(Composite parent, boolean showDebugTargets, LaunchesView view) {
+ super(new Tree(parent, SWT.MULTI));
+ fView= view;
+ LaunchesViewerFilter filter= new LaunchesViewerFilter(showDebugTargets);
+ addFilter(filter);
+ setUseHashlookup(true);
+ }
+
+ /**
+ * Update the buttons in my view
+ */
+ protected void updateButtons() {
+ fView.updateButtons();
+ }
+
+ protected void updateMarkerForSelection() {
+ // update the instruction pointer
+ if (fView instanceof DebugView) {
+ ((DebugView) fView).showMarkerForCurrentSelection();
+ }
+ }
+
+ /**
+ * Only sets selection if it is different from the current selection
+ */
+ public void setSelection(ISelection selection, boolean reveal) {
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection ss= (IStructuredSelection)selection;
+ Object element= ss.getFirstElement();
+ ISelection oldSelection= getSelection();
+ if (oldSelection instanceof IStructuredSelection) {
+ if (element != null) {
+ IStructuredSelection oldss= (IStructuredSelection)oldSelection;
+ Object oldElement= oldss.getFirstElement();
+ if (element.equals(oldElement)) {
+ if (element instanceof IStackFrame) {
+ //update source selection only...line number change
+ ((DebugView)fView).showMarkerForCurrentSelection();
+ } else if (element instanceof IThread) {
+ ((DebugView)fView).updateButtons();
+ }
+ return;
+ }
+ }
+ }
+ }
+ super.setSelection(selection, reveal);
+ }
+
+ protected void clearSourceSelection() {
+ if (fView instanceof DebugView) {
+ ((DebugView)fView).clearSourceSelection();
+ }
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchesViewerFilter.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchesViewerFilter.java
new file mode 100644
index 000000000..9fbb90e2c
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LaunchesViewerFilter.java
@@ -0,0 +1,66 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.model.IDebugElement;
+import org.eclipse.debug.core.model.IDebugTarget;
+import org.eclipse.debug.core.model.IProcess;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+public class LaunchesViewerFilter extends ViewerFilter {
+ private boolean fShowDebug;
+
+ public LaunchesViewerFilter(boolean showDebug) {
+ fShowDebug= showDebug;
+ }
+
+ /**
+ * Helper method for #select - returns whether the given
+ * launch should be in the viewer.
+ */
+ protected boolean showLaunch(ILaunch launch) {
+ if (launch == null) {
+ return false;
+ }
+ if (fShowDebug) {
+ return launch.getDebugTarget() != null;
+ } else {
+ IProcess[] processes= launch.getProcesses();
+ return processes.length > 0;
+ }
+ }
+
+ /**
+ * @see ViewerFilter
+ */
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ ILaunch launch= null;
+ if (element instanceof ILaunch) {
+ return showLaunch((ILaunch)element);
+
+ } else
+ if (element instanceof IProcess) {
+ launch= ((IProcess)element).getLaunch();
+ if (launch == null) {
+ return false;
+ }
+ if (fShowDebug) {
+ IDebugTarget target = launch.getDebugTarget();
+ return target != null && !element.equals(target.getProcess());
+ } else {
+ return showLaunch(launch);
+ }
+ } else
+ if (element instanceof IDebugElement) {
+ return fShowDebug;
+ }
+ return false;
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LazyModelPresentation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LazyModelPresentation.java
new file mode 100644
index 000000000..07cbd13dd
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/LazyModelPresentation.java
@@ -0,0 +1,159 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.ui.IDebugModelPresentation;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.jface.util.ListenerList;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.graphics.Image;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * A proxy to an IDebugModelPresentation extension. Instantiates the extension
+ * when it is needed.
+ */
+
+public class LazyModelPresentation implements IDebugModelPresentation {
+
+ /**
+ * A temporary mapping of attribute ids to their values
+ * @see IDebugModelPresentation#setAttribute
+ */
+ protected HashMap fAttributes= new HashMap(3);
+
+ /**
+ * The config element that defines the extension
+ */
+ protected IConfigurationElement fConfig = null;
+
+ /**
+ * The actual presentation instance - null until called upon
+ */
+ protected IDebugModelPresentation fPresentation = null;
+
+ /**
+ * Temp holding for listeners - we do not add to presentation until
+ * it needs to be instantiated.
+ */
+ protected ListenerList fListeners= new ListenerList(5);
+ /**
+ * Constructs a lazy presentation from the config element.
+ */
+ public LazyModelPresentation(IConfigurationElement configElement) {
+ fConfig = configElement;
+ }
+
+ public Image getImage(Object element) {
+ return getPresentation().getImage(element);
+ }
+
+ public String getText(Object element) {
+ return getPresentation().getText(element);
+ }
+
+ /**
+ * @see IDebugModelPresentaion
+ */
+ public IEditorInput getEditorInput(Object element) {
+ return getPresentation().getEditorInput(element);
+ }
+
+ /**
+ * @see IDebugModelPresentaion
+ */
+ public String getEditorId(IEditorInput input, Object inputObject) {
+ return getPresentation().getEditorId(input, inputObject);
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ if (fPresentation != null) {
+ getPresentation().addListener(listener);
+ }
+ fListeners.add(listener);
+ }
+
+ public void dispose() {
+ if (fPresentation != null) {
+ getPresentation().dispose();
+ }
+ fListeners = null;
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ if (fPresentation != null) {
+ return getPresentation().isLabelProperty(element, property);
+ }
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ if (fPresentation != null) {
+ getPresentation().removeListener(listener);
+ }
+ fListeners.remove(listener);
+ }
+
+ /**
+ * @deprecated
+ */
+ public Image getLabelImage(Viewer viewer, Object element) {
+ return getPresentation().getImage(element);
+ }
+
+ /**
+ * @deprecated
+ */
+ public String getLabelText(Viewer viewer, Object element) {
+ return getPresentation().getText(element);
+ }
+
+ /**
+ * Returns the real presentation, instantiating if required.
+ */
+ protected IDebugModelPresentation getPresentation() {
+ if (fPresentation == null) {
+ try {
+ fPresentation= (IDebugModelPresentation) DebugUIPlugin.createExtension(fConfig, "class");
+ // configure it
+ if (fListeners != null) {
+ Object[] list = fListeners.getListeners();
+ for (int i= 0; i < list.length; i++) {
+ fPresentation.addListener((ILabelProviderListener)list[i]);
+ }
+ }
+ Iterator keys= fAttributes.keySet().iterator();
+ while (keys.hasNext()) {
+ String key= (String)keys.next();
+ fPresentation.setAttribute(key, fAttributes.get(key));
+ }
+ } catch (CoreException e) {
+ DebugUIUtils.logError(e);
+ }
+ }
+ return fPresentation;
+ }
+
+ /**
+ * @see IDebugModelPresentation
+ */
+ public void setAttribute(String id, Object value) {
+ if (value == null) {
+ return;
+ }
+ if (fPresentation != null) {
+ getPresentation().setAttribute(id, value);
+ }
+
+ fAttributes.put(id, value);
+ }
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/OpenBreakpointMarkerAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/OpenBreakpointMarkerAction.java
new file mode 100644
index 000000000..a9101208b
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/OpenBreakpointMarkerAction.java
@@ -0,0 +1,55 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.ui.*;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import java.util.Iterator;
+
+public class OpenBreakpointMarkerAction extends OpenMarkerAction {
+
+ private static final String PREFIX= "open_breakpoint_marker_action.";
+ protected static DelegatingModelPresentation fgPresentation = new DelegatingModelPresentation();
+
+ public OpenBreakpointMarkerAction(ISelectionProvider selectionProvider) {
+ super(selectionProvider, DebugUIUtils.getResourceString(PREFIX + TEXT));
+ setToolTipText(DebugUIUtils.getResourceString(PREFIX + TOOL_TIP_TEXT));
+ }
+
+ /**
+ * @see IAction
+ */
+ public void run() {
+ IWorkbenchWindow dwindow= DebugUIPlugin.getActiveWorkbenchWindow();
+ IWorkbenchPage page= dwindow.getActivePage();
+ IEditorPart part= null;
+ // Get the resource.
+ IStructuredSelection selection= (IStructuredSelection)getStructuredSelection();
+ //Get the selected marker
+ Iterator enum= selection.iterator();
+ IMarker marker= (IMarker)enum.next();
+ IEditorInput input= fgPresentation.getEditorInput(marker);
+ String editorId= fgPresentation.getEditorId(input, marker);
+ if (input != null) {
+ try {
+ part= page.openEditor(input, editorId);
+ } catch (PartInitException e) {
+ DebugUIUtils.logError(e);
+ }
+ }
+ if (part != null) {
+ // Bring editor to front.
+ part.setFocus();
+
+ // Goto the bookmark.
+ part.gotoMarker(marker);
+ }
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/OpenMarkerAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/OpenMarkerAction.java
new file mode 100644
index 000000000..773a085d5
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/OpenMarkerAction.java
@@ -0,0 +1,57 @@
+package org.eclipse.debug.internal.ui;
+
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.actions.SelectionProviderAction;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+/**
+ * Open a marker
+ */
+public class OpenMarkerAction extends SelectionProviderAction {
+
+ public OpenMarkerAction(ISelectionProvider selectionProvider, String label) {
+ super(selectionProvider, label);
+ setEnabled(getStructuredSelection().size() == 1);
+ }
+
+ /**
+ * @see IAction
+ */
+ public void run() {
+ IStructuredSelection selection= (IStructuredSelection) getStructuredSelection();
+ //Get the selected marker
+ if (selection.size() != 1) {
+ return; //Single selection only
+ }
+ Object object= selection.getFirstElement();
+ IWorkbenchWindow dwindow= DebugUIPlugin.getActiveWorkbenchWindow();
+ IWorkbenchPage page= dwindow.getActivePage();
+ try {
+ page.openEditor((IMarker)object);
+ } catch (PartInitException e) {
+ DebugUIUtils.logError(e);
+ }
+ }
+
+ /**
+ * @see SelectionProviderAction
+ */
+ public void selectionChanged(IStructuredSelection sel) {
+ if (sel.size() == 1) {
+ setEnabled(true);
+ } else {
+ setEnabled(false);
+ }
+ }
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ProcessesContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ProcessesContentProvider.java
new file mode 100644
index 000000000..f1527238c
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ProcessesContentProvider.java
@@ -0,0 +1,61 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IDebugElement; import org.eclipse.debug.core.model.IProcess;
+
+/**
+ * Provides the contents for a run mode of the Launches viewer.
+ */
+public class ProcessesContentProvider extends DebugContentProvider {
+
+ /**
+ * @see BasicContentProvider#doHandleDebug(Event)
+ */
+ public void doHandleDebugEvent(DebugEvent event) {
+ Object element= event.getSource();
+ if (element instanceof IDebugElement) {
+ // the processes view is not interested in anything
+ //other than launches and processes
+ return;
+ }
+ switch (event.getKind()) {
+ case DebugEvent.CREATE :
+ insert(element);
+ break;
+ case DebugEvent.TERMINATE :
+ Object parent= getParent(element);
+ refresh(parent);
+ updateButtons();
+ break;
+ case DebugEvent.CHANGE :
+ refresh(element);
+ updateButtons();
+ break;
+ }
+ }
+
+ /**
+ * @see ILaunchListener
+ */
+ public void launchRegistered(final ILaunch launch) {
+ Runnable r= new Runnable() {
+ public void run() {
+ insert(launch);
+ if (!DebugUIPlugin.getDefault().userPreferenceToSwitchPerspective(true)) {
+ IProcess[] ps= launch.getProcesses();
+ if (ps != null && ps.length > 0) {
+ selectAndReveal(ps[0]);
+ }
+ }
+ }
+ };
+
+ asyncExec(r);
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RelaunchActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RelaunchActionDelegate.java
new file mode 100644
index 000000000..fb5fef75a
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RelaunchActionDelegate.java
@@ -0,0 +1,65 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILauncher;
+import org.eclipse.debug.core.model.IDebugElement;
+import org.eclipse.debug.core.model.IProcess;
+
+public class RelaunchActionDelegate extends ControlActionDelegate {
+
+ private static final String PREFIX= "relaunch_action.";
+
+ /**
+ * @see ControlActionDelegate
+ */
+ protected void doAction(Object object) {
+ relaunch(object, null);
+ }
+
+ /**
+ * Re-launches the launch of the given object.
+ */
+ public static void relaunch(Object object) {
+ relaunch(object, null);
+ }
+
+ /**
+ * Re-launches the launch of the given object in the specified mode.
+ */
+ public static void relaunch(Object object, String mode) {
+ ILaunch launch= null;
+ if (object instanceof IDebugElement) {
+ launch= ((IDebugElement)object).getLaunch();
+ } else if (object instanceof ILaunch) {
+ launch= (ILaunch)object;
+ } else if (object instanceof IProcess) {
+ launch= ((IProcess)object).getLaunch();
+ }
+ if (launch != null) {
+ ILauncher launcher= launch.getLauncher();
+ Object element= launch.getElement();
+ String launchMode= (mode == null) ? launch.getLaunchMode() : mode;
+ launcher.launch(new Object[]{element}, launchMode);
+ }
+ }
+
+ /**
+ * @see ControlActionDelegate
+ */
+ public boolean isEnabledFor(Object element) {
+ return element instanceof ILaunch || element instanceof IDebugElement || element instanceof IProcess;
+ }
+
+ /**
+ * @see ControlActionDelegate
+ */
+ protected String getPrefix() {
+ return PREFIX;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RelaunchHistoryLaunchAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RelaunchHistoryLaunchAction.java
new file mode 100644
index 000000000..27c11ef24
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RelaunchHistoryLaunchAction.java
@@ -0,0 +1,53 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Re-launches a previous launch.
+ */
+public class RelaunchHistoryLaunchAction extends Action {
+
+ protected static final DelegatingModelPresentation fgPresentation= new DelegatingModelPresentation();
+ protected ILaunch fLaunch;
+ protected String fMode;
+
+ public RelaunchHistoryLaunchAction(ILaunch launch, String mode) {
+ super();
+ fLaunch= launch;
+ fMode= mode;
+ setText(fgPresentation.getLaunchText(launch));
+ ImageDescriptor descriptor= null;
+ if (launch.getLaunchMode().equals(ILaunchManager.DEBUG_MODE)) {
+ descriptor= DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_ACT_DEBUG);
+ } else {
+ descriptor= DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_ACT_RUN);
+ }
+
+ if (descriptor != null) {
+ setImageDescriptor(descriptor);
+ }
+ }
+
+ /**
+ * @see IAction
+ */
+ public void run() {
+ BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
+ public void run() {
+ RelaunchActionDelegate.relaunch(fLaunch, fMode);
+ }
+ });
+ }
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RelaunchLastAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RelaunchLastAction.java
new file mode 100644
index 000000000..0f89790e5
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RelaunchLastAction.java
@@ -0,0 +1,70 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Re-runs or re-debugs the last launch.
+ */
+public class RelaunchLastAction extends Action implements IWorkbenchWindowActionDelegate {
+
+ public RelaunchLastAction() {
+ super("&Re-Run/Debug@F10");
+ }
+
+ /**
+ * @see IAction
+ */
+ public void run() {
+ final ILaunch recent= DebugUIPlugin.getDefault().getLastLaunch();
+ if (recent == null) {
+ Display.getCurrent().beep();
+ } else {
+ BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
+ public void run() {
+ RelaunchActionDelegate.relaunch(recent);
+ }
+ });
+ }
+ }
+
+ /**
+ * @see IWorkbenchWindowActionDelegate
+ */
+ public void dispose(){
+ }
+
+ /**
+ * @see IWorkbenchWindowActionDelegate
+ */
+ public void init(IWorkbenchWindow window){
+ }
+
+ /**
+ * @see IActionDelegate
+ */
+ public void run(IAction action){
+ run();
+ }
+
+ /**
+ * @see IActionDelegate
+ */
+ public void selectionChanged(IAction action, ISelection selection){
+ }
+
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveAllBreakpointsAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveAllBreakpointsAction.java
new file mode 100644
index 000000000..ea5e5fd67
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveAllBreakpointsAction.java
@@ -0,0 +1,86 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IMarkerDelta;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IBreakpointListener;
+import org.eclipse.debug.core.IBreakpointManager;
+import org.eclipse.debug.core.IDebugStatusConstants;
+import org.eclipse.jface.action.Action;
+
+/**
+ * Removes all breakpoints from the source (markers) and remove all
+ * breakpoints from processes
+ */
+public class RemoveAllBreakpointsAction extends Action implements IBreakpointListener {
+
+ private static final String PREFIX= "remove_all_breakpoints_action.";
+ private static final String ERROR= "error.";
+ private static final String STATUS= PREFIX + "status";
+
+ public RemoveAllBreakpointsAction() {
+ super(DebugUIUtils.getResourceString(PREFIX + TEXT));
+ setToolTipText(DebugUIUtils.getResourceString(PREFIX + TOOL_TIP_TEXT));
+ }
+
+ /**
+ * @see IAction
+ */
+ public void run() {
+ final IBreakpointManager breakpointManager= DebugPlugin.getDefault().getBreakpointManager();
+ final IMarker[] markers= breakpointManager.getBreakpoints();
+ final MultiStatus ms= new MultiStatus(DebugPlugin.getDefault().getDescriptor().getUniqueIdentifier(), IDebugStatusConstants.REQUEST_FAILED, DebugUIUtils.getResourceString(STATUS), null);
+ IWorkspaceRunnable r = new IWorkspaceRunnable() {
+ public void run(IProgressMonitor pm) {
+ for (int i= 0; i < markers.length; i++) {
+ try {
+ breakpointManager.removeBreakpoint(markers[i], true);
+ } catch (CoreException e) {
+ ms.merge(e.getStatus());
+ }
+ }
+ }
+ };
+ try {
+ ResourcesPlugin.getWorkspace().run(r, null);
+ } catch (CoreException e) {
+ ms.merge(e.getStatus());
+ }
+ if (!ms.isOK()) {
+ DebugUIUtils.errorDialog(DebugUIPlugin.getActiveWorkbenchWindow().getShell(), PREFIX + ERROR, ms);
+ }
+ }
+ /**
+ * @see IBreakpointListener
+ */
+ public void breakpointAdded(IMarker breakpoint) {
+ breakpointAltered();
+ }
+ /**
+ * @see IBreakpointListener
+ */
+ public void breakpointChanged(IMarker breakpoint, IMarkerDelta delta) {
+ }
+ /**
+ * @see IBreakpointListener
+ */
+ public void breakpointRemoved(IMarker breakpoint, IMarkerDelta delta) {
+ breakpointAltered();
+ }
+
+ protected void breakpointAltered() {
+ boolean enable= DebugPlugin.getDefault().getBreakpointManager().getBreakpoints().length == 0 ? false : true;
+ setEnabled(enable);
+ }
+}
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveAllFromInspectorAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveAllFromInspectorAction.java
new file mode 100644
index 000000000..4fb814b13
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveAllFromInspectorAction.java
@@ -0,0 +1,33 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+public class RemoveAllFromInspectorAction extends InspectorAction {
+
+ private static final String PREFIX= "remove_all_from_inspector_action.";
+
+ public RemoveAllFromInspectorAction(ISelectionProvider provider) {
+ super(provider, DebugUIUtils.getResourceString(PREFIX + TEXT));
+ setToolTipText(DebugUIUtils.getResourceString(PREFIX + TOOL_TIP_TEXT));
+ }
+
+ /**
+ * @see InspectorAction
+ */
+ protected void doAction(InspectorView view) {
+ // Ask view to remove all variables
+ view.removeAllFromInspector();
+ }
+ /**
+ * @see SelectionProviderAction
+ */
+ public void selectionChanged(IStructuredSelection sel) {
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveBreakpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveBreakpointAction.java
new file mode 100644
index 000000000..b8156b410
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveBreakpointAction.java
@@ -0,0 +1,77 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import java.util.Iterator;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IBreakpointManager;
+import org.eclipse.debug.core.IDebugStatusConstants;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.actions.SelectionProviderAction;
+
+public class RemoveBreakpointAction extends SelectionProviderAction {
+
+ private final static String PREFIX= "remove_breakpoint_action.";
+ private final static String ERROR= "error.";
+ private final static String STATUS= PREFIX + "status";
+
+ public RemoveBreakpointAction(ISelectionProvider provider) {
+ super(provider, DebugUIUtils.getResourceString(PREFIX + TEXT));
+ setEnabled(!getStructuredSelection().isEmpty());
+ setToolTipText(DebugUIUtils.getResourceString(PREFIX + TOOL_TIP_TEXT));
+ }
+
+ /**
+ * @see IAction
+ */
+ public void run() {
+ IStructuredSelection selection= getStructuredSelection();
+ if (selection.isEmpty()) {
+ return;
+ }
+ IStructuredSelection es= (IStructuredSelection)selection;
+ final Iterator itr= es.iterator();
+ final MultiStatus ms = new MultiStatus(DebugUIPlugin.getDefault().getDescriptor().getUniqueIdentifier(),
+ IDebugStatusConstants.REQUEST_FAILED, DebugUIUtils.getResourceString(STATUS), null);
+
+ IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
+ public void run(IProgressMonitor monitor) {
+ IBreakpointManager breakpointManager= DebugPlugin.getDefault().getBreakpointManager();
+ while (itr.hasNext()) {
+ try {
+ breakpointManager.removeBreakpoint((IMarker)itr.next(), true);
+ } catch (CoreException ce) {
+ ms.merge(ce.getStatus());
+ }
+ }
+ }
+ };
+ try {
+ ResourcesPlugin.getWorkspace().run(runnable, null);
+ } catch (CoreException ce) {
+ ms.merge(ce.getStatus());
+ }
+ if (!ms.isOK()) {
+ DebugUIUtils.errorDialog(DebugUIPlugin.getActiveWorkbenchWindow().getShell(), PREFIX + ERROR, ms);
+ }
+ }
+
+ /**
+ * @see SelectionProviderAction
+ */
+ public void selectionChanged(IStructuredSelection sel) {
+ setEnabled(!sel.isEmpty());
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveFromInspectorAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveFromInspectorAction.java
new file mode 100644
index 000000000..19e2d7b1d
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveFromInspectorAction.java
@@ -0,0 +1,55 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import java.util.Iterator;
+
+public class RemoveFromInspectorAction extends InspectorAction {
+
+ private static final String PREFIX= "remove_from_inspector_action.";
+
+ public RemoveFromInspectorAction(ISelectionProvider provider) {
+ super(provider, DebugUIUtils.getResourceString(PREFIX + TEXT));
+ setToolTipText(DebugUIUtils.getResourceString(PREFIX + TOOL_TIP_TEXT));
+ setEnabled(!getStructuredSelection().isEmpty());
+ }
+
+ /**
+ * @see InspectorAction
+ */
+ protected void doAction(InspectorView view) {
+ IStructuredSelection selection= getStructuredSelection();
+ Iterator vars= selection.iterator();
+ while (vars.hasNext()) {
+ Object item= vars.next();
+ if (item instanceof InspectItem) {
+ view.removeFromInspector(item);
+ }
+ }
+ }
+
+ /**
+ * @see InspectorAction
+ */
+ public void selectionChanged(IStructuredSelection sel) {
+ if (sel == null) {
+ setEnabled(false);
+ return;
+ }
+ Iterator iterator= sel.iterator();
+ while (iterator.hasNext()) {
+ Object item= iterator.next();
+ if (item instanceof InspectItem) {
+ setEnabled(true);
+ return;
+ }
+ }
+ setEnabled(false);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveTerminatedAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveTerminatedAction.java
new file mode 100644
index 000000000..f8f805ee0
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RemoveTerminatedAction.java
@@ -0,0 +1,82 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.core.model.IProcess;
+import org.eclipse.jface.action.Action;
+import org.eclipse.ui.texteditor.IUpdate;
+
+/**
+ * Removes all terminated/detached launches from the UI.
+ * Clears the launches output as well.
+ */
+public class RemoveTerminatedAction extends Action implements IUpdate {
+
+ private static final String PREFIX= "remove_all_terminated_action.";
+ boolean fRemoveDebug;
+
+ public RemoveTerminatedAction(boolean removeDebug) {
+ super(DebugUIUtils.getResourceString(PREFIX + TEXT));
+ setToolTipText(DebugUIUtils.getResourceString(PREFIX + TOOL_TIP_TEXT));
+ fRemoveDebug= removeDebug;
+ setEnabled(false);
+ }
+
+ /**
+ * Removes all of the terminated launches relevant to the
+ * current perspective. Has the
+ * side effect of clearing the console output.
+ * @see IAction
+ */
+ public void run() {
+ ILaunchManager lManager= DebugPlugin.getDefault().getLaunchManager();
+ Object[] launches= lManager.getLaunches();
+ for (int i= 0; i < launches.length; i++) {
+ ILaunch launch= (ILaunch)launches[i];
+ if (launch.isTerminated() && isLaunchRelevantToCurrentPerpective(launch)) {
+ lManager.deregisterLaunch(launch);
+ }
+ }
+ }
+
+ /**
+ * Updates the enabled state of this action to enabled if at
+ * least one launch is terminated and relative to the current perspective.
+ * @see IUpdate
+ */
+ public void update() {
+ ILaunchManager lManager= DebugPlugin.getDefault().getLaunchManager();
+ ILaunch[] launches= lManager.getLaunches();
+ for (int i= 0; i < launches.length; i++) {
+ ILaunch launch= launches[i];
+ if (launch.isTerminated() && isLaunchRelevantToCurrentPerpective(launch)) {
+ setEnabled(true);
+ return;
+ }
+ }
+ setEnabled(false);
+ }
+
+ /**
+ * Returns whether this launch is relevant to the
+ * current perspective...ie Run or Debug.
+ * For example, if in the debug perspective (fRemoveDebug= true)
+ * and the launch does not have a debug target, <code>false</code>
+ * will be returned.
+ */
+ protected boolean isLaunchRelevantToCurrentPerpective(ILaunch launch) {
+ if (fRemoveDebug) {
+ return launch.getDebugTarget() != null;
+ }
+ IProcess[] processes= launch.getProcesses();
+ return (processes != null && processes.length > 0);
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ResumeActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ResumeActionDelegate.java
new file mode 100644
index 000000000..d94c445e2
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ResumeActionDelegate.java
@@ -0,0 +1,56 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IDebugElement;
+import org.eclipse.debug.core.model.ISuspendResume;
+import org.eclipse.jface.viewers.IStructuredSelection;
+
+public class ResumeActionDelegate extends ControlActionDelegate {
+
+ private static final String PREFIX= "resume_action.";
+
+ /**
+ * @see ControlActionDelegate
+ */
+ protected void doAction(Object object) throws DebugException {
+ IDebugElement element= (IDebugElement)object;
+ if (element instanceof ISuspendResume) {
+ ISuspendResume suspendResume= (ISuspendResume)element;
+ if (suspendResume.canResume()) {
+ suspendResume.resume();
+ }
+ }
+ }
+
+ /**
+ * @see ControlActionDelegate
+ */
+ public boolean isEnabledFor(Object element) {
+ return element instanceof ISuspendResume && ((ISuspendResume) element).canResume();
+ }
+
+ /**
+ * @see ControlActionDelegate
+ */
+ public boolean getEnableStateForSelection(IStructuredSelection selection) {
+ if (selection.size() == 1) {
+ return isEnabledFor(selection.getFirstElement());
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @see ControlActionDelegate
+ */
+ protected String getPrefix() {
+ return PREFIX;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RunAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RunAction.java
new file mode 100644
index 000000000..69029f5d7
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RunAction.java
@@ -0,0 +1,33 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2000
+ */
+
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.ui.IDebugUIConstants;
+
+/**
+ * An execution action that uses launchers in
+ * run mode.
+ */
+public class RunAction extends ExecutionAction {
+
+ protected final static String PREFIX= "run_action.";
+
+ public RunAction() {
+ setText(DebugUIUtils.getResourceString(PREFIX + TEXT));
+ setToolTipText(DebugUIUtils.getResourceString(PREFIX + TOOL_TIP_TEXT));
+ setImageDescriptor(DebugPluginImages.getImageDescriptor(IDebugUIConstants.IMG_ACT_RUN));
+ }
+
+ /**
+ * @see ExecutionAction
+ */
+ protected String getMode() {
+ return ILaunchManager.RUN_MODE;
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RunDropDownAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RunDropDownAction.java
new file mode 100644
index 000000000..6473a3bfa
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/RunDropDownAction.java
@@ -0,0 +1,32 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench
+ * (c) Copyright IBM Corp 2001
+ */
+
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchManager;
+
+public class RunDropDownAction extends LaunchDropDownAction {
+
+ public RunDropDownAction() {
+ super(new RunAction());
+ }
+
+ /**
+ * @see LaunchDropDownAction
+ */
+ public String getMode() {
+ return ILaunchManager.RUN_MODE;
+ }
+
+ /**
+ * @see LaunchDropDownAction
+ */
+ public ILaunch[] getHistory() {
+ return DebugUIPlugin.getDefault().getRunHistory();
+ }
+}
+
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ShowQualifiedAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ShowQualifiedAction.java
new file mode 100644
index 000000000..1581f628c
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/ShowQualifiedAction.java
@@ -0,0 +1,58 @@
+package org.eclipse.debug.internal.ui;
+
+/*
+ * Licensed Materials - Property of IBM,
+ * WebSphere Studio Workbench