From 52db12dc920f5031b8a150e894960da78f1e80cb Mon Sep 17 00:00:00 2001 From: jooyoul Date: Fri, 17 Feb 2017 16:28:30 +0900 Subject: [PATCH] RTSDK: remove old dirs - remove old dirs - change pkginfo contents Change-Id: Iea1c6c9ee1f80cb7ef50ad860f116da18abd5373 Signed-off-by: jooyoul --- rt-ide/package/pkginfo.manifest | 24 +- .../BUILD_INFO.txt | 21 - .../META-INF/MANIFEST.MF | 12 - .../META-INF/eclipse.inf | 2 - .../about.html | 79 -- .../about_files/lgpl.txt | 504 ------- .../fragment.properties | 12 - .../os/linux/x86_64/librxtxParallel.so | Bin 55322 -> 0 bytes .../os/linux/x86_64/librxtxSerial.so | Bin 174170 -> 0 bytes .../META-INF/MANIFEST.MF | 10 - .../META-INF/eclipse.inf | 2 - .../about.html | 36 - .../plugin.properties | 12 - .../plugin.xml | 7 - .../src/gnu.io.rxtx_2.1.7.4_v20071016/about.html | 84 -- .../about_files/lgpl.txt | 504 ------- .../src/gnu.io.rxtx_2.1.7.4_v20071016/src.zip | Bin 63743 -> 0 bytes rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016.jar | Bin 75312 -> 0 bytes rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016/about.html | 84 -- .../about_files/lgpl.txt | 504 ------- rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016/src.zip | Bin 63743 -> 0 bytes rtosRXTX/librxtxParallel.so | Bin 55322 -> 0 bytes rtosRXTX/librxtxSerial.so | Bin 174170 -> 0 bytes .../.classpath | 7 - .../.gitignore | 1 - .../.options | 2 - .../.project | 34 - .../.settings/org.eclipse.jdt.core.prefs | 362 ----- .../.settings/org.eclipse.jdt.ui.prefs | 62 - .../.settings/org.eclipse.pde.prefs | 32 - .../META-INF/MANIFEST.MF | 24 - .../about.html | 28 - .../build.properties | 16 - .../plugin.properties | 20 - .../plugin.xml | 32 - .../pom.xml | 17 - .../connector/serial/activator/UIPlugin.java | 111 -- .../serial/connector/ISerialSettings.java | 28 - .../serial/connector/SerialConnectWorker.java | 215 --- .../serial/connector/SerialConnector.java | 239 ---- .../serial/connector/SerialPortHandler.java | 116 -- .../serial/connector/SerialProperties.java | 163 --- .../connector/serial/connector/SerialSettings.java | 203 --- .../serial/controls/SerialConfigurationPanel.java | 133 -- .../connector/serial/controls/SerialLinePanel.java | 787 ----------- .../serial/controls/SerialPortAddressDialog.java | 689 ---------- .../connector/serial/interfaces/ITraceIds.java | 22 - .../serial/interfaces/IWireTypeSerial.java | 51 - .../serial/launcher/SerialLauncherDelegate.java | 159 --- .../serial/launcher/SerialMementoHandler.java | 64 - .../tm/terminal/connector/serial/nls/Messages.java | 79 -- .../connector/serial/nls/Messages.properties | 71 - .../org.eclipse.tm.terminal.control/.classpath | 7 - .../org.eclipse.tm.terminal.control/.cvsignore | 1 - .../org.eclipse.tm.terminal.control/.gitignore | 1 - .../org.eclipse.tm.terminal.control/.options | 3 - .../org.eclipse.tm.terminal.control/.project | 34 - .../.settings/org.eclipse.core.resources.prefs | 2 - .../.settings/org.eclipse.jdt.core.prefs | 100 -- .../HelpContexts.xml | 18 - .../META-INF/MANIFEST.MF | 25 - .../org.eclipse.tm.terminal.control/README.txt | 18 - .../org.eclipse.tm.terminal.control/about.html | 28 - .../org.eclipse.tm.terminal.control/about.ini | 27 - .../about.properties | 24 - .../build.properties | 36 - .../org.eclipse.tm.terminal.stylesheet.dark.css | 15 - .../icons/clcl16/clear_co.gif | Bin 595 -> 0 bytes .../icons/dlcl16/clear_co.gif | Bin 364 -> 0 bytes .../icons/elcl16/clear_co.gif | Bin 595 -> 0 bytes .../plugin.properties | 42 - .../org.eclipse.tm.terminal.control/plugin.xml | 275 ---- .../org.eclipse.tm.terminal.control/pom.xml | 17 - .../schema/connectors.exsd | 111 -- .../terminal/connector/TerminalConnector.java | 223 --- .../TerminalToRemoteInjectionOutputStream.java | 163 --- .../control/CommandInputFieldWithHistory.java | 322 ----- .../terminal/control/ICommandInputField.java | 35 - .../terminal/control/ITerminalListener.java | 33 - .../terminal/control/ITerminalListener2.java | 27 - .../terminal/control/ITerminalMouseListener.java | 43 - .../terminal/control/ITerminalViewControl.java | 133 -- .../control/TerminalViewControlFactory.java | 44 - .../control/actions/AbstractTerminalAction.java | 101 -- .../terminal/control/actions/ActionMessages.java | 34 - .../control/actions/ActionMessages.properties | 25 - .../terminal/control/actions/ImageConsts.java | 31 - .../control/actions/TerminalActionClearAll.java | 53 - .../control/actions/TerminalActionCopy.java | 67 - .../control/actions/TerminalActionCut.java | 54 - .../control/actions/TerminalActionPaste.java | 69 - .../control/actions/TerminalActionSelectAll.java | 50 - .../control/impl/ITerminalControlForText.java | 41 - .../terminal/control/impl/TerminalMessages.java | 32 - .../control/impl/TerminalMessages.properties | 28 - .../terminal/control/impl/TerminalPlugin.java | 92 -- .../terminal/emulator/EditActionAccelerators.java | 68 - .../terminal/emulator/IVT100EmulatorBackend.java | 222 --- .../terminal/emulator/LoggingOutputStream.java | 48 - .../emulator/VT100BackendTraceDecorator.java | 176 --- .../internal/terminal/emulator/VT100Emulator.java | 1396 ------------------- .../terminal/emulator/VT100EmulatorBackend.java | 494 ------- .../terminal/emulator/VT100TerminalControl.java | 1414 -------------------- .../internal/terminal/model/ISnapshotChanges.java | 90 -- .../internal/terminal/model/SnapshotChanges.java | 391 ------ .../model/SynchronizedTerminalTextData.java | 107 -- .../internal/terminal/model/TerminalTextData.java | 274 ---- .../terminal/model/TerminalTextDataFastScroll.java | 259 ---- .../terminal/model/TerminalTextDataSnapshot.java | 303 ----- .../terminal/model/TerminalTextDataStore.java | 344 ----- .../terminal/model/TerminalTextDataWindow.java | 207 --- .../terminal/preferences/ITerminalConstants.java | 32 - .../preferences/TerminalPreferenceInitializer.java | 39 - .../preferences/TerminalPreferencePage.java | 75 -- .../provisional/api/AbstractSettingsPage.java | 181 --- .../terminal/provisional/api/ISettingsPage.java | 80 -- .../terminal/provisional/api/ISettingsStore.java | 45 - .../provisional/api/ITerminalConnector.java | 147 -- .../terminal/provisional/api/ITerminalControl.java | 160 --- .../internal/terminal/provisional/api/Logger.java | 195 --- .../provisional/api/NullSettingsStore.java | 39 - .../api/TerminalConnectorExtension.java | 98 -- .../terminal/provisional/api/TerminalState.java | 52 - .../api/provider/TerminalConnectorImpl.java | 152 --- .../textcanvas/AbstractTextCanvasModel.java | 348 ----- .../internal/terminal/textcanvas/GridCanvas.java | 232 ---- .../terminal/textcanvas/ILinelRenderer.java | 37 - .../terminal/textcanvas/ITextCanvasModel.java | 84 -- .../textcanvas/ITextCanvasModelListener.java | 24 - .../terminal/textcanvas/PipedInputStream.java | 312 ----- .../textcanvas/PollingTextCanvasModel.java | 49 - .../tm/internal/terminal/textcanvas/StyleMap.java | 296 ---- .../internal/terminal/textcanvas/TextCanvas.java | 470 ------- .../terminal/textcanvas/TextLineRenderer.java | 168 --- .../terminal/textcanvas/VirtualCanvas.java | 348 ----- .../tm/terminal/model/ITerminalTextData.java | 150 --- .../terminal/model/ITerminalTextDataReadOnly.java | 85 -- .../terminal/model/ITerminalTextDataSnapshot.java | 226 ---- .../org/eclipse/tm/terminal/model/LineSegment.java | 35 - .../src/org/eclipse/tm/terminal/model/Style.java | 154 --- .../org/eclipse/tm/terminal/model/StyleColor.java | 54 - .../tm/terminal/model/TerminalTextDataFactory.java | 20 - .../org.eclipse.tm.terminal.control/tm32.png | Bin 1349 -> 0 bytes .../org.eclipse.tm.terminal.view.core/.classpath | 7 - .../org.eclipse.tm.terminal.view.core/.gitignore | 1 - .../org.eclipse.tm.terminal.view.core/.options | 1 - .../org.eclipse.tm.terminal.view.core/.project | 45 - .../.settings/org.eclipse.jdt.core.prefs | 380 ------ .../.settings/org.eclipse.jdt.ui.prefs | 62 - .../.settings/org.eclipse.pde.prefs | 32 - .../META-INF/MANIFEST.MF | 21 - .../org.eclipse.tm.terminal.view.core/about.html | 28 - .../org.eclipse.tm.terminal.view.core/about.ini | 27 - .../about.mappings | 6 - .../about.properties | 24 - .../build.properties | 20 - .../plugin.properties | 14 - .../org.eclipse.tm.terminal.view.core/plugin.xml | 17 - .../org.eclipse.tm.terminal.view.core/pom.xml | 17 - .../schema/contextPropertiesProviders.exsd | 128 -- .../TerminalContextPropertiesProviderFactory.java | 228 ---- .../terminal/view/core/TerminalServiceFactory.java | 51 - .../view/core/activator/CoreBundleActivator.java | 56 - .../ITerminalContextPropertiesProvider.java | 53 - .../view/core/interfaces/ITerminalService.java | 73 - ...TerminalServiceOutputStreamMonitorListener.java | 27 - .../view/core/interfaces/ITerminalTabListener.java | 27 - .../constants/IContextPropertiesConstants.java | 50 - .../constants/ILineSeparatorConstants.java | 32 - .../constants/ITerminalsConnectorConstants.java | 336 ----- .../view/core/internal/PropertyTester.java | 36 - .../tm/terminal/view/core/nls/Messages.java | 35 - .../tm/terminal/view/core/nls/Messages.properties | 14 - .../core/preferences/ScopedEclipsePreferences.java | 459 ------- .../terminal/view/core/tracing/TraceHandler.java | 295 ---- .../eclipse/tm/terminal/view/core/utils/Env.java | 233 ---- .../org.eclipse.tm.terminal.view.core/tm32.png | Bin 1349 -> 0 bytes .../org.eclipse.tm.terminal.view.ui/.classpath | 7 - .../org.eclipse.tm.terminal.view.ui/.gitignore | 1 - .../org.eclipse.tm.terminal.view.ui/.options | 3 - .../org.eclipse.tm.terminal.view.ui/.project | 45 - .../.settings/org.eclipse.jdt.core.prefs | 362 ----- .../.settings/org.eclipse.jdt.ui.prefs | 62 - .../.settings/org.eclipse.pde.prefs | 32 - .../META-INF/MANIFEST.MF | 40 - .../org.eclipse.tm.terminal.view.ui/about.html | 28 - .../build.properties | 19 - .../org.eclipse.tm.terminal.view.ui/contexts.xml | 12 - .../icons/clcl16/command_input_field.gif | Bin 385 -> 0 bytes .../icons/clcl16/new_terminal_view.gif | Bin 934 -> 0 bytes .../icons/dlcl16/command_input_field.gif | Bin 239 -> 0 bytes .../icons/dlcl16/disconnect.gif | Bin 139 -> 0 bytes .../icons/dlcl16/new_terminal_view.gif | Bin 175 -> 0 bytes .../icons/elcl16/command_input_field.gif | Bin 239 -> 0 bytes .../icons/elcl16/disconnect.gif | Bin 890 -> 0 bytes .../icons/elcl16/new_terminal_view.gif | Bin 173 -> 0 bytes .../icons/eview16/terminal_view.gif | Bin 938 -> 0 bytes .../plugin.properties | 73 - .../org.eclipse.tm.terminal.view.ui/plugin.xml | 470 ------- .../org.eclipse.tm.terminal.view.ui/pom.xml | 17 - .../schema/launcherDelegates.exsd | 215 --- .../terminal/view/ui/actions/AbstractAction.java | 189 --- .../view/ui/actions/NewTerminalViewAction.java | 77 -- .../view/ui/actions/SelectEncodingAction.java | 79 -- .../view/ui/actions/TabScrollLockAction.java | 58 - .../view/ui/actions/ToggleCommandFieldAction.java | 89 -- .../tm/terminal/view/ui/activator/UIPlugin.java | 264 ---- .../ui/controls/ConfigurationPanelControl.java | 421 ------ .../view/ui/controls/NoteCompositeHelper.java | 173 --- .../tm/terminal/view/ui/help/IContextHelpIds.java | 44 - .../view/ui/interfaces/IConfigurationPanel.java | 144 -- .../interfaces/IConfigurationPanelContainer.java | 38 - .../interfaces/IExternalExecutablesProperties.java | 45 - .../view/ui/interfaces/ILauncherDelegate.java | 97 -- .../view/ui/interfaces/IMementoHandler.java | 36 - .../view/ui/interfaces/IPreferenceKeys.java | 67 - .../view/ui/interfaces/ITerminalsView.java | 40 - .../terminal/view/ui/interfaces/IUIConstants.java | 24 - .../terminal/view/ui/interfaces/ImageConsts.java | 102 -- .../view/ui/interfaces/tracing/ITraceIds.java | 29 - .../view/ui/internal/ExternalExecutablesState.java | 55 - .../terminal/view/ui/internal/PropertyTester.java | 58 - .../terminal/view/ui/internal/SettingsStore.java | 68 - .../internal/dialogs/EncodingSelectionDialog.java | 230 ---- .../dialogs/LaunchTerminalSettingsDialog.java | 647 --------- .../handler/AbstractTriggerCommandHandler.java | 68 - .../handler/DisconnectTerminalCommandHandler.java | 62 - .../handler/LaunchTerminalCommandHandler.java | 157 --- .../ui/internal/handler/MaximizeViewHandler.java | 29 - .../internal/handler/NewTerminalViewHandler.java | 35 - .../ui/internal/handler/QuickAccessHandler.java | 29 - .../view/ui/launcher/AbstractLauncherDelegate.java | 159 --- .../view/ui/launcher/LauncherDelegateManager.java | 422 ------ .../view/ui/listeners/AbstractWindowListener.java | 130 -- .../view/ui/listeners/WorkbenchPartListener.java | 114 -- .../view/ui/listeners/WorkbenchWindowListener.java | 27 - .../ui/local/showin/DynamicContributionItems.java | 129 -- .../ui/local/showin/ExternalExecutablesDialog.java | 460 ------- .../local/showin/ExternalExecutablesManager.java | 294 ---- .../terminal/view/ui/manager/ConsoleManager.java | 646 --------- .../eclipse/tm/terminal/view/ui/nls/Messages.java | 154 --- .../tm/terminal/view/ui/nls/Messages.properties | 113 -- .../view/ui/panels/AbstractConfigurationPanel.java | 202 --- .../panels/AbstractExtendedConfigurationPanel.java | 634 --------- .../view/ui/preferences/PreferencePage.java | 678 ---------- .../ui/preferences/PreferencesInitializer.java | 41 - .../terminal/view/ui/services/TerminalService.java | 359 ----- .../view/ui/streams/AbstractStreamsConnector.java | 173 --- .../view/ui/streams/InputStreamMonitor.java | 366 ----- .../view/ui/streams/OutputStreamMonitor.java | 318 ----- .../terminal/view/ui/streams/StreamsConnector.java | 122 -- .../view/ui/streams/StreamsLauncherDelegate.java | 113 -- .../terminal/view/ui/streams/StreamsSettings.java | 201 --- .../view/ui/tabs/TabCommandFieldHandler.java | 102 -- .../terminal/view/ui/tabs/TabDisposeListener.java | 81 -- .../tm/terminal/view/ui/tabs/TabFolderManager.java | 858 ------------ .../view/ui/tabs/TabFolderMenuHandler.java | 398 ------ .../view/ui/tabs/TabFolderSelectionListener.java | 55 - .../view/ui/tabs/TabFolderToolbarHandler.java | 373 ------ .../terminal/view/ui/tabs/TabTerminalListener.java | 160 --- .../view/ui/view/OldTerminalsViewHandler.java | 124 -- .../tm/terminal/view/ui/view/TerminalsView.java | 778 ----------- .../view/ui/view/TerminalsViewMementoHandler.java | 178 --- .../ui/view/showin/GitShowInContextHandler.java | 85 -- 264 files changed, 12 insertions(+), 35038 deletions(-) delete mode 100644 rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/BUILD_INFO.txt delete mode 100644 rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/META-INF/MANIFEST.MF delete mode 100644 rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/META-INF/eclipse.inf delete mode 100644 rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/about.html delete mode 100644 rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/about_files/lgpl.txt delete mode 100644 rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/fragment.properties delete mode 100644 rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/os/linux/x86_64/librxtxParallel.so delete mode 100644 rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/os/linux/x86_64/librxtxSerial.so delete mode 100644 rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/META-INF/MANIFEST.MF delete mode 100644 rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/META-INF/eclipse.inf delete mode 100644 rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/about.html delete mode 100644 rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/plugin.properties delete mode 100644 rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/plugin.xml delete mode 100644 rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/src/gnu.io.rxtx_2.1.7.4_v20071016/about.html delete mode 100644 rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/src/gnu.io.rxtx_2.1.7.4_v20071016/about_files/lgpl.txt delete mode 100644 rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/src/gnu.io.rxtx_2.1.7.4_v20071016/src.zip delete mode 100644 rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016.jar delete mode 100644 rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016/about.html delete mode 100644 rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016/about_files/lgpl.txt delete mode 100644 rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016/src.zip delete mode 100644 rtosRXTX/librxtxParallel.so delete mode 100644 rtosRXTX/librxtxSerial.so delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.classpath delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.gitignore delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.options delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.project delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.settings/org.eclipse.jdt.core.prefs delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.settings/org.eclipse.jdt.ui.prefs delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.settings/org.eclipse.pde.prefs delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/META-INF/MANIFEST.MF delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/about.html delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/build.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/plugin.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/plugin.xml delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/pom.xml delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/activator/UIPlugin.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/ISerialSettings.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialConnectWorker.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialConnector.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialPortHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialProperties.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialSettings.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/controls/SerialConfigurationPanel.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/controls/SerialLinePanel.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/controls/SerialPortAddressDialog.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/interfaces/ITraceIds.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/interfaces/IWireTypeSerial.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/launcher/SerialLauncherDelegate.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/launcher/SerialMementoHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/nls/Messages.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/nls/Messages.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/.classpath delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/.cvsignore delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/.gitignore delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/.options delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/.project delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/.settings/org.eclipse.core.resources.prefs delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/.settings/org.eclipse.jdt.core.prefs delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/HelpContexts.xml delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/META-INF/MANIFEST.MF delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/README.txt delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/about.html delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/about.ini delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/about.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/build.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/css/org.eclipse.tm.terminal.stylesheet.dark.css delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/icons/clcl16/clear_co.gif delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/icons/dlcl16/clear_co.gif delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/icons/elcl16/clear_co.gif delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/plugin.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/plugin.xml delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/pom.xml delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/schema/connectors.exsd delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/connector/TerminalConnector.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/connector/TerminalToRemoteInjectionOutputStream.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/CommandInputFieldWithHistory.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ICommandInputField.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalListener.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalListener2.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalMouseListener.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/TerminalViewControlFactory.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/AbstractTerminalAction.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/ActionMessages.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/ActionMessages.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/ImageConsts.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionClearAll.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionCopy.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionCut.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionPaste.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionSelectAll.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/ITerminalControlForText.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/TerminalMessages.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/TerminalMessages.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/TerminalPlugin.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/EditActionAccelerators.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/IVT100EmulatorBackend.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/LoggingOutputStream.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100BackendTraceDecorator.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100Emulator.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100EmulatorBackend.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/ISnapshotChanges.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/SnapshotChanges.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/SynchronizedTerminalTextData.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/TerminalTextData.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/TerminalTextDataFastScroll.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/TerminalTextDataSnapshot.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/TerminalTextDataStore.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/TerminalTextDataWindow.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/preferences/ITerminalConstants.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/preferences/TerminalPreferenceInitializer.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/preferences/TerminalPreferencePage.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/AbstractSettingsPage.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ISettingsPage.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ISettingsStore.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalConnector.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalControl.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/Logger.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/NullSettingsStore.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/TerminalConnectorExtension.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/TerminalState.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/provider/TerminalConnectorImpl.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/AbstractTextCanvasModel.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/GridCanvas.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ILinelRenderer.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModel.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModelListener.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/PipedInputStream.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/PollingTextCanvasModel.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/StyleMap.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/TextLineRenderer.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/VirtualCanvas.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/ITerminalTextData.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/ITerminalTextDataReadOnly.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/ITerminalTextDataSnapshot.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/LineSegment.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/Style.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/StyleColor.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/TerminalTextDataFactory.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.control/tm32.png delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/.classpath delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/.gitignore delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/.options delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/.project delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/.settings/org.eclipse.jdt.core.prefs delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/.settings/org.eclipse.jdt.ui.prefs delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/.settings/org.eclipse.pde.prefs delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/META-INF/MANIFEST.MF delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.html delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.ini delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.mappings delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/build.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/plugin.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/plugin.xml delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/pom.xml delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/schema/contextPropertiesProviders.exsd delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/TerminalContextPropertiesProviderFactory.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/TerminalServiceFactory.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/activator/CoreBundleActivator.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalContextPropertiesProvider.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalService.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalServiceOutputStreamMonitorListener.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalTabListener.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/IContextPropertiesConstants.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/ILineSeparatorConstants.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/ITerminalsConnectorConstants.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/internal/PropertyTester.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/nls/Messages.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/nls/Messages.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/preferences/ScopedEclipsePreferences.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/tracing/TraceHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/utils/Env.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.core/tm32.png delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.classpath delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.gitignore delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.options delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.project delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.settings/org.eclipse.jdt.core.prefs delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.settings/org.eclipse.jdt.ui.prefs delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.settings/org.eclipse.pde.prefs delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/META-INF/MANIFEST.MF delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/about.html delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/build.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/contexts.xml delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/clcl16/command_input_field.gif delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/clcl16/new_terminal_view.gif delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/dlcl16/command_input_field.gif delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/dlcl16/disconnect.gif delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/dlcl16/new_terminal_view.gif delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/elcl16/command_input_field.gif delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/elcl16/disconnect.gif delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/elcl16/new_terminal_view.gif delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/eview16/terminal_view.gif delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/plugin.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/plugin.xml delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/pom.xml delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/schema/launcherDelegates.exsd delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/AbstractAction.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/NewTerminalViewAction.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/SelectEncodingAction.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/TabScrollLockAction.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/ToggleCommandFieldAction.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/activator/UIPlugin.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/controls/ConfigurationPanelControl.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/controls/NoteCompositeHelper.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/help/IContextHelpIds.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IConfigurationPanel.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IConfigurationPanelContainer.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IExternalExecutablesProperties.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/ILauncherDelegate.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IMementoHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IPreferenceKeys.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/ITerminalsView.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IUIConstants.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/ImageConsts.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/tracing/ITraceIds.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/ExternalExecutablesState.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/PropertyTester.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/SettingsStore.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/EncodingSelectionDialog.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/LaunchTerminalSettingsDialog.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/AbstractTriggerCommandHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/DisconnectTerminalCommandHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/LaunchTerminalCommandHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/MaximizeViewHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/NewTerminalViewHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/QuickAccessHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/launcher/AbstractLauncherDelegate.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/launcher/LauncherDelegateManager.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/listeners/AbstractWindowListener.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/listeners/WorkbenchPartListener.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/listeners/WorkbenchWindowListener.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/local/showin/DynamicContributionItems.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/local/showin/ExternalExecutablesDialog.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/local/showin/ExternalExecutablesManager.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/manager/ConsoleManager.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.properties delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/panels/AbstractConfigurationPanel.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/panels/AbstractExtendedConfigurationPanel.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/preferences/PreferencePage.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/preferences/PreferencesInitializer.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/services/TerminalService.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/AbstractStreamsConnector.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/InputStreamMonitor.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/OutputStreamMonitor.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/StreamsConnector.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/StreamsLauncherDelegate.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/StreamsSettings.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabCommandFieldHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabDisposeListener.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderManager.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderMenuHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderSelectionListener.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderToolbarHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabTerminalListener.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/OldTerminalsViewHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/TerminalsView.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/TerminalsViewMementoHandler.java delete mode 100644 rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/showin/GitShowInContextHandler.java diff --git a/rt-ide/package/pkginfo.manifest b/rt-ide/package/pkginfo.manifest index f4b441a..fe8702c 100644 --- a/rt-ide/package/pkginfo.manifest +++ b/rt-ide/package/pkginfo.manifest @@ -1,38 +1,38 @@ -Version:3.0.116 +Version:1.0.1 Source:product -Maintainer:hyeongseok heo , yoonki park +Maintainer:hyeongseok heo , gyeong-min Ju , jaemin Kim -Package:base-ide-product +Package:rt-ide-product OS:ubuntu-32 Build-host-os:ubuntu-64 Build-dependency:eclipse-pde [ubuntu-64] Install-dependency:version-manager [ubuntu-32] -Description:Make base IDE. This also includes patched eclipse plugins. +Description:Make RT IDE. This also includes patched eclipse plugins. -Package:base-ide-product +Package:rt-ide-product OS:windows-32 Build-host-os:ubuntu-64 Build-dependency:eclipse-pde [ubuntu-64] Install-dependency:version-manager [windows-32] -Description:Make base IDE. This also includes patched eclipse plugins. +Description:Make RT IDE. This also includes patched eclipse plugins. -Package:base-ide-product +Package:rt-ide-product OS:ubuntu-64 Build-host-os:ubuntu-64 Build-dependency:eclipse-pde [ubuntu-64] Install-dependency:version-manager [ubuntu-64] -Description:Make base IDE. This also includes patched eclipse plugins. +Description:Make RT IDE. This also includes patched eclipse plugins. -Package:base-ide-product +Package:rt-ide-product OS:windows-64 Build-host-os:ubuntu-64 Build-dependency:eclipse-pde [ubuntu-64] Install-dependency:version-manager [windows-64] -Description:Make base IDE. This also includes patched eclipse plugins. +Description:Make RT IDE. This also includes patched eclipse plugins. -Package:base-ide-product +Package:rt-ide-product OS:macos-64 Build-host-os:ubuntu-64 Build-dependency:eclipse-pde [ubuntu-64] Install-dependency:version-manager [macos-64] -Description:Make base IDE. This also includes patched eclipse plugins +Description:Make RT IDE. This also includes patched eclipse plugins diff --git a/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/BUILD_INFO.txt b/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/BUILD_INFO.txt deleted file mode 100644 index aeb74a0..0000000 --- a/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/BUILD_INFO.txt +++ /dev/null @@ -1,21 +0,0 @@ -Native Build Info: ------------------- - -platform: x86_64-unknown-linux-gnu -built by: martin.oberhuber@windriver.com -build date: 18-Apr-2007 -OS Name: openSUSE 10.2 (X86-64) -OS Version: Linux osgiliath 2.6.18.8-0.1-default #1 SMP x86_64 GNU/Linux -Compiler version: gcc-4.1.2 20061115 (prerelease) (SUSE Linux) -Compiler config: configure --enable-threads=posix --enable-ssp --disable-libssp \ - --enable-shared --enable-__cxa_atexit --without-system-libunwind \ - --with-cpu=generic - -build script: -------------- -#!/bin/sh -mkdir build-osgiliath -cd build-osgiliath -../configure --disable-lockfiles -make -cp x86_64-unknown-linux-gnu/.libs/*.so $OUTDIR diff --git a/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/META-INF/MANIFEST.MF b/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/META-INF/MANIFEST.MF deleted file mode 100644 index 7100702..0000000 --- a/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/META-INF/MANIFEST.MF +++ /dev/null @@ -1,12 +0,0 @@ -Manifest-Version: 1.0 -Ant-Version: Apache Ant 1.7.0 -Created-By: 1.5.0_12-b04 (Sun Microsystems Inc.) -Bundle-Name: %fragmentName -Bundle-Vendor: %providerName -Bundle-ManifestVersion: 2 -Fragment-Host: gnu.io.rxtx;bundle-version="[2.1.7,2.2.0)" -Bundle-SymbolicName: gnu.io.rxtx.linux.x86_64 -Bundle-Localization: fragment -Eclipse-PlatformFilter: (& (osgi.os=linux) (osgi.arch=x86_64)) -Bundle-Version: 2.1.7.3_v20071015 - diff --git a/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/META-INF/eclipse.inf b/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/META-INF/eclipse.inf deleted file mode 100644 index 92ffed2..0000000 --- a/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/META-INF/eclipse.inf +++ /dev/null @@ -1,2 +0,0 @@ -#Processed using Jarprocessor -pack200.conditioned = true diff --git a/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/about.html b/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/about.html deleted file mode 100644 index 0adc920..0000000 --- a/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/about.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - -About - - -

About This Content

-This is an unmodified binary release of RXTX-2.1-7r2 as downloaded -from http://www.rxtx.org, with -the following exception: -
    -
  • Linux native library was built without lockfiles (contrary to - the original distribution) in order to allow easier use. See - the file BUILD_INFO.txt for details.
  • -
- -

License

-
-RXTX License v 2.1 - LGPL v 2.1 + Linking Over Controlled Interface.
-RXTX is a native interface to serial ports in java.
-
-Copyright 1997-2007 by Trent Jarvi tjarvi@qbang.org and others who
-actually wrote it.  See individual source files for more information.
-
-A copy of the LGPL v 2.1 may be found at
-http://www.gnu.org/licenses/lgpl.txt on March 4th 2007.  A copy is
-here for your convenience.
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-
-An executable that contains no derivative of any portion of RXTX, but
-is designed to work with RXTX by being dynamically linked with it,
-is considered a "work that uses the Library" subject to the terms and
-conditions of the GNU Lesser General Public License.
-
-The following has been added to the RXTX License to remove
-any confusion about linking to RXTX.   We want to allow in part what
-section 5, paragraph 2 of the LGPL does not permit in the special
-case of linking over a controlled interface.  The intent is to add a
-Java Specification Request or standards body defined interface in the 
-future as another exception but one is not currently available.
-
-http://www.fsf.org/licenses/gpl-faq.html#LinkingOverControlledInterface
-
-As a special exception, the copyright holders of RXTX give you
-permission to link RXTX with independent modules that communicate with
-RXTX solely through the Sun Microsytems CommAPI interface version 2,
-regardless of the license terms of these independent modules, and to copy
-and distribute the resulting combined work under terms of your choice,
-provided that every copy of the combined work is accompanied by a complete
-copy of the source code of RXTX (the version of RXTX used to produce the
-combined work), being distributed under the terms of the GNU Lesser General
-Public License plus this exception.  An independent module is a
-module which is not derived from or based on RXTX.
-
-Note that people who make modified versions of RXTX are not obligated
-to grant this special exception for their modified versions; it is
-their choice whether to do so.  The GNU Lesser General Public License
-gives permission to release a modified version without this exception; this
-exception also makes it possible to release a modified version which
-carries forward this exception.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-All trademarks belong to their respective owners.
-
- - diff --git a/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/about_files/lgpl.txt b/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/about_files/lgpl.txt deleted file mode 100644 index 5ab7695..0000000 --- a/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/about_files/lgpl.txt +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/fragment.properties b/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/fragment.properties deleted file mode 100644 index 856ddad..0000000 --- a/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/fragment.properties +++ /dev/null @@ -1,12 +0,0 @@ -################################################################################ -# Copyright (c) 2007 Wind River Systems, Inc. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/epl-v10.html -# -# Contributors: -# Martin Oberhuber - initial API and implementation -################################################################################ -fragmentName=RXTX for Linux x86_64 -providerName=RXTX.org diff --git a/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/os/linux/x86_64/librxtxParallel.so b/rtosRXTX/gnu.io.rxtx.linux.x86_64_2.1.7.3_v20071015/os/linux/x86_64/librxtxParallel.so deleted file mode 100644 index b6f813569c85f7046851b112792212bebb159a05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55322 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 - - - -About - - -

About This Content

- -

June 5, 2007

-

License

- -

The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise -indicated below, the Content is provided to you under the terms and conditions of the -Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available -at http://www.eclipse.org/legal/epl-v10.html. -For purposes of the EPL, "Program" will mean the Content.

- -

If you did not receive this Content directly from the Eclipse Foundation, the Content is -being redistributed by another party ("Redistributor") and different terms and conditions may -apply to your use of any object code in the Content. Check the Redistributor's license that was -provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise -indicated below, the terms and conditions of the EPL still apply to any source code in the Content -and such source code may be obtained at http://www.eclipse.org.

- -

Source Code

- -

This plug-in contains source code zip files ("Source Zips") that correspond to binary content -in other plug-ins. These Source Zips may be distributed under different license agreements and/or notices. -Details about these license agreements and notices are contained in "about.html" files ("Abouts") located -in sub-directories in the src/ directory of this plug-in. Such Abouts govern your use of the Source Zips -in that directory, not the EPL.

- - - \ No newline at end of file diff --git a/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/plugin.properties b/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/plugin.properties deleted file mode 100644 index f5c58ae..0000000 --- a/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -################################################################################ -# Copyright (c) 2007 Wind River Systems, Inc. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/epl-v10.html -# -# Contributors: -# Martin Oberhuber - initial API and implementation -################################################################################ -pluginName=RXTX Source Bundle -providerName=RXTX.org \ No newline at end of file diff --git a/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/plugin.xml b/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/plugin.xml deleted file mode 100644 index be8a747..0000000 --- a/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/plugin.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/src/gnu.io.rxtx_2.1.7.4_v20071016/about.html b/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/src/gnu.io.rxtx_2.1.7.4_v20071016/about.html deleted file mode 100644 index 099ace0..0000000 --- a/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/src/gnu.io.rxtx_2.1.7.4_v20071016/about.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - -About - - -

About This Content

-This is an unmodified release of RXTX-2.1-7r2 as downloaded -from http://www.rxtx.org, with -the following exceptions: -
    -
  • RXTXCommDriver.java v1.16.2.57 was compiled from RXTX CVS and included - in order to support disabling version print on startup (set System Property - -Dgnu.io.rxtx.NoVersionOutput=true). This is RXTX - bug 71.
  • -
  • CommPortIdentifier.java: Include the Fix for RXTX - bug 83 - due to which CommPortOwnership events are lost. The original - fix from bugzilla is included in this version of the library.
  • -
- -

License

-
-RXTX License v 2.1 - LGPL v 2.1 + Linking Over Controlled Interface.
-RXTX is a native interface to serial ports in java.
-
-Copyright 1997-2007 by Trent Jarvi tjarvi@qbang.org and others who
-actually wrote it.  See individual source files for more information.
-
-A copy of the LGPL v 2.1 may be found at
-http://www.gnu.org/licenses/lgpl.txt on March 4th 2007.  A copy is
-here for your convenience.
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-
-An executable that contains no derivative of any portion of RXTX, but
-is designed to work with RXTX by being dynamically linked with it,
-is considered a "work that uses the Library" subject to the terms and
-conditions of the GNU Lesser General Public License.
-
-The following has been added to the RXTX License to remove
-any confusion about linking to RXTX.   We want to allow in part what
-section 5, paragraph 2 of the LGPL does not permit in the special
-case of linking over a controlled interface.  The intent is to add a
-Java Specification Request or standards body defined interface in the 
-future as another exception but one is not currently available.
-
-http://www.fsf.org/licenses/gpl-faq.html#LinkingOverControlledInterface
-
-As a special exception, the copyright holders of RXTX give you
-permission to link RXTX with independent modules that communicate with
-RXTX solely through the Sun Microsytems CommAPI interface version 2,
-regardless of the license terms of these independent modules, and to copy
-and distribute the resulting combined work under terms of your choice,
-provided that every copy of the combined work is accompanied by a complete
-copy of the source code of RXTX (the version of RXTX used to produce the
-combined work), being distributed under the terms of the GNU Lesser General
-Public License plus this exception.  An independent module is a
-module which is not derived from or based on RXTX.
-
-Note that people who make modified versions of RXTX are not obligated
-to grant this special exception for their modified versions; it is
-their choice whether to do so.  The GNU Lesser General Public License
-gives permission to release a modified version without this exception; this
-exception also makes it possible to release a modified version which
-carries forward this exception.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-All trademarks belong to their respective owners.
-
- - diff --git a/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/src/gnu.io.rxtx_2.1.7.4_v20071016/about_files/lgpl.txt b/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/src/gnu.io.rxtx_2.1.7.4_v20071016/about_files/lgpl.txt deleted file mode 100644 index 5ab7695..0000000 --- a/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/src/gnu.io.rxtx_2.1.7.4_v20071016/about_files/lgpl.txt +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/src/gnu.io.rxtx_2.1.7.4_v20071016/src.zip b/rtosRXTX/gnu.io.rxtx.source_2.1.7.4_v20071016/src/gnu.io.rxtx_2.1.7.4_v20071016/src.zip deleted file mode 100644 index 044fcbda67c8bab9b1e12dda7c6ecc0dca716adc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63743 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

?_+HJ11Pu;ZxCTy#u8*@u;WQ$ll*Nfn+#* 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 QQjkjEhQ$v290cV50oZ053jhEB diff --git a/rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016.jar b/rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016.jar deleted file mode 100644 index 4d8b57273799ce02c03b5d9b04b50a0d213119ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75312 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 Dev}FJ diff --git a/rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016/about.html b/rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016/about.html deleted file mode 100644 index 099ace0..0000000 --- a/rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016/about.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - -About - - -

About This Content

-This is an unmodified release of RXTX-2.1-7r2 as downloaded -from http://www.rxtx.org, with -the following exceptions: -
    -
  • RXTXCommDriver.java v1.16.2.57 was compiled from RXTX CVS and included - in order to support disabling version print on startup (set System Property - -Dgnu.io.rxtx.NoVersionOutput=true). This is RXTX - bug 71.
  • -
  • CommPortIdentifier.java: Include the Fix for RXTX - bug 83 - due to which CommPortOwnership events are lost. The original - fix from bugzilla is included in this version of the library.
  • -
- -

License

-
-RXTX License v 2.1 - LGPL v 2.1 + Linking Over Controlled Interface.
-RXTX is a native interface to serial ports in java.
-
-Copyright 1997-2007 by Trent Jarvi tjarvi@qbang.org and others who
-actually wrote it.  See individual source files for more information.
-
-A copy of the LGPL v 2.1 may be found at
-http://www.gnu.org/licenses/lgpl.txt on March 4th 2007.  A copy is
-here for your convenience.
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-
-An executable that contains no derivative of any portion of RXTX, but
-is designed to work with RXTX by being dynamically linked with it,
-is considered a "work that uses the Library" subject to the terms and
-conditions of the GNU Lesser General Public License.
-
-The following has been added to the RXTX License to remove
-any confusion about linking to RXTX.   We want to allow in part what
-section 5, paragraph 2 of the LGPL does not permit in the special
-case of linking over a controlled interface.  The intent is to add a
-Java Specification Request or standards body defined interface in the 
-future as another exception but one is not currently available.
-
-http://www.fsf.org/licenses/gpl-faq.html#LinkingOverControlledInterface
-
-As a special exception, the copyright holders of RXTX give you
-permission to link RXTX with independent modules that communicate with
-RXTX solely through the Sun Microsytems CommAPI interface version 2,
-regardless of the license terms of these independent modules, and to copy
-and distribute the resulting combined work under terms of your choice,
-provided that every copy of the combined work is accompanied by a complete
-copy of the source code of RXTX (the version of RXTX used to produce the
-combined work), being distributed under the terms of the GNU Lesser General
-Public License plus this exception.  An independent module is a
-module which is not derived from or based on RXTX.
-
-Note that people who make modified versions of RXTX are not obligated
-to grant this special exception for their modified versions; it is
-their choice whether to do so.  The GNU Lesser General Public License
-gives permission to release a modified version without this exception; this
-exception also makes it possible to release a modified version which
-carries forward this exception.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-All trademarks belong to their respective owners.
-
- - diff --git a/rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016/about_files/lgpl.txt b/rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016/about_files/lgpl.txt deleted file mode 100644 index 5ab7695..0000000 --- a/rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016/about_files/lgpl.txt +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016/src.zip b/rtosRXTX/gnu.io.rxtx_2.1.7.4_v20071016/src.zip deleted file mode 100644 index 044fcbda67c8bab9b1e12dda7c6ecc0dca716adc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63743 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

?_+HJ11Pu;ZxCTy#u8*@u;WQ$ll*Nfn+#* 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 QQjkjEhQ$v290cV50oZ053jhEB diff --git a/rtosRXTX/librxtxParallel.so b/rtosRXTX/librxtxParallel.so deleted file mode 100644 index b6f813569c85f7046851b112792212bebb159a05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55322 zcmeIbdwdne-9Ns&Czm0F5C~CJ#3Mw-Tex_`3rZkh0#Uh(7CD6E1Og$6xp1*oqo^fC zG+1q^^|9$wTe0?ntyS8pjp7BhwRorYsZD)s8^kK&rD$9Ez2Bdi+1<0}r1klIpV#+~ z@2i_v&dldCpWA%qGqba^yR%nMtD5e)u49jwbFM=uUZgRTO~IH)Oa{qhXQGpX-xB9& zq0J78(sK77r%^VAWI<3z4s)dfB8}^eNq2b~+-*|JN05AD4Br?-Z_{p56`Lw8#+miU zw%RP@hmY2XX!?PnvngqL%m$y>slk8wYxT`B`ueM%W9wy7W43b)G)y&GCLkSe@+X^= zNk0CE;r}fBpMn1q@qaY_d7O>^$@o7H|0m&p68@*)|5W^!;lB|7Bk|8;1pX)D{{;LW zi+}1q2mhzx{|Nk_i+>)c;Qvg?{qOw@35gnN@`r|S%pQjSK@l9m!|{Iz{u!df@o$f# zYzAoo{!Qo!wiv&ICFeL}P0FOi=R#;yqdd6W!AeI-zlw|(dygWqSy7Zd)@`7uqu%QWI5k?c6v3*G=o z8cg<0m-NBG*yZtC2&CR_1~-n|K*!@+{1e}6^jdp9Z|IjW*l^f5CtI9|$icoAkKhRY zJ!0n%jNa`cKVbN($+Caao}P#w7}rBH#KT*VNBSiu;H{mXGjeuC9%tl=@rwBtTA$ox*Doxz5F7Y8mJ&*{WD z+~B*}L2>*@Ck}!W^$m_^OqTTs<8K2UkEGFS!*G;FJJ|+5+1T@agJ*bH8lqk{_(Vj0 zm%;xc;veh(EfM-x4E>IX{TyR?Tq1HX4n*SZbc64Wv~Q2`&pzYlYAwe3RYd+924868 zbQ?Jn4gQM}JBJwjD4ggDo%aq#`|s^mjU*}(8)hW7-OD0=?l2@T89U=gYlLYY=NtXd^SnDW(|IA0ShlLEG11yq-O`pwIEnhk z`Zgy~hr~%FYSvaWTisB9Mbb&kSe=-YTvp%OmTZ~YP~F;^Y;|T-udYrkYiv){HzlfO z&6(8%A+5=_ii@XD?XRq|vAMl%N_$;hvSlvCW)iV1+4fn;py{Iaw$CIkjjkox3}c=8 zR@4|3YH4q7OV&EA$;R45a&@w?&4CSx6|COs>J~>+CqUQK;duu~7*^K6?u1zdm*Op9Fx3pBR6F8%M z5|#6}t+mc$2Wcw%TSA=e)sSQo7NvB4BGkL7389|h( zpc37*UiZt^`eoHMI%w*bp|577M>L1Kz;sp{9jDc4s9)NQ2u5v7TboM95w2nGbSIIl zt!}GEXfADS)#C$DjkTm`S=+XDR&@(pm~1$CLh1OE&j5>aepTg^sfh`t6G}OQ&wRKT zkX>AS#3aR_ha=`gsbz$08B_jwhL8L^(g9Y&r-b`VIeoP3@YY=;k3*qf`9m^($ z@ZsyC$sznGD+Fmp2tPW6pB2KFgzyVPcsuuI@sbce?9b&PeE9mQIfS=!B+6ME!gJ1T zkB$)D&N*4OA%q`iiIH}N@DoD#Eg}5rA$)fTe?|zuHH5d<#VpBzWq@R(Zs4nAr!a)g(Yb5HL<9LHQrm|bem zE`jF|=5%LIkH9ksWA@?f*(UH5!t7;xx&=Oqa5mvCfhQ2=Wze1uflnaJu-?-w@F>FU zUVD}Zd^lnBU1!fMfrk>t1)j5KvcP$S2NE79utzwba9rR|js(oh`8|aK?erNSK8An@N0yJ5Z)#53xs(ou%}1hX9)8uXwNo*A0x~mU{ANeKO@Yp zzo$#!9}#Ak+|wcOcL}pA?r8>$R1UUR#m4Oa7!h|WuJ38{4(^iX>as`2q)zZT^D8?4 z*nW1!`bq0S=(HVCv2oH;;QKy=sJ(+K*7vB2&g_N29DD)NE<&baV`0VhFSNh;WOfB0 z_vsyVgO4hwp!Ji!csOK0VB6uKJ<(_`sMs{A2?dp%JDx5(_}@?O&=$PEWAITO4i1w< z;q8o=9d)IHkGhUj&i}N$qH|G6Uqxp_$-aute^hnWmK=abhF5INt>}FJVAlpntk^gW z#=c(B`R>841B9>dsqB2btxoWp28~9OS8OVdBdO~AlTazxL}yN|*mwb0AJg39dk$_M zgObi2G1SIat|`#BwyVtLY7-htqSN=Q_<`NgN_7I$fU0az*4;y0)s#4hr{m<%JRCYe0b-hv1`5SG{!LEH6 zDByB9yRA%@f&mQ{$ADoSPQwp&(c#)Q#Qlg8@i$F_eQhOiST#o42ejjVd$6km)Z#9( z(i?jt@rVdscUT;){AtC;iQ{|rwEg|yK^^J(SE|OiLXaW8P&KJnW#=z-&98ZTtEfN~ zUpY8yoCMbsgRi>{$g0l2_FezCg9ocR|6I|zqwfl2D>ju6&#su%fzmb0DmI<=D~wN7 zo$pn3!WVxY-_y66G!k8`Y(?iA2WK@0u&#W?#yd(Vpkm|qN_6|)Rni5x3h)+5?=R_Q z`8AKzv>jEQy%opresc2XoxPjTUeX)jj1H1mKs@suj_a%yny{Ar=|$F8`cq}+KPo#v z=sOPPZJgM*?-N+r`5J<*3PzenzyR_n+d+bV&md6Bc){`M`WG-#Y#MYQDvNl117kF* z{#!tOe}W|GAu?!D|6CBhCKSalGwJ*rBoy`?NtK)CmE?Cm^~e$PuU|5(d^c{=~=2gC&7f4)z%`}+4P@ynl>Q2+RJ z{yRhbkM?D!>c3a>f5-B_2jYnRi&OX`_OI0Zb(a6WbpDYk{8=IWWf#NYCyInYqmYy> zD4Sn4ud?&+IOBXcx8j<&*MnW+4f=KV};6o>SULdo8T($E8m-jRm>0GjvyXBzrKfd4CNUaolb ztsI_0HnzPKAAHkKQOy2yeb3;VxLjG@xkvhN*``%48l`H}LnYmUZYvpH@nSF9Z3IB4 zV!)H-7>YU}<7Y2ku(a^6ZvlMtz)_EWl5_lH6*Z65zd*-SbY5q;dyn5$-y^6kL~ezM zY1hAb)eJV>1)T@bdY$j~efvYS*#YMZ6Z$ry#%w*&#|axu9Fg9V)|$P&ZLe3me6G6p`0|qBd)gu0p3loJ))7y? z;tVkt(++mxiq3f@3SP}Z?-+zhEry9KBz^NCANd1WL=_*-5}BHGmX{3co2Uzas|)|Z zL<-qQMxYGUFT=@m)1bFeH29_u;gQOkzxO@=0c7&rxnuBkuK|a%^RV*HH>P#=vDU?!<$HFVd?2>| zNkqa9cLRPOb<58Dpnb17Z;XFhq#W$x)hy3;U!)}%BGIrZo#*#u53xo1ma%+O@i|h# z)09;3-M*uN-Mdp{(kMv91VtFM9{c?YUAK zr`&N&JZ~DrrCeyeL1^u4(M}b|pwZA~eGk1a4U^Ecj|eU2jBr_Bx0JP&3@+>J33^(2 z=b!sdM+w63%H!J(8~i|d$zaZwFlCb2NUfQTY-iQ?{?YgohSZCW(*}r+cl$;`hNgK` z`fFL|uTf9l2MNZ~x#gWZs%nDBf|Lh&d6olShE64iG~K2cQ+1o7K`_EkCIP$m1=Nq{_fIg|nG^eld2rgM zV%|OKJ5xB}=FX>NJnTC_1hfpaXKu7Ah$m^$Pm7e__r38RsN~cy^OsG7zRrS8#b05< ztJyzj0@eA{p6STiz}A-~GT$-R518)+*AF;_$tmJsR|PuABOXt2oljvd&;qMEpD-Tp zd|li#3nbV7Wo>b1AE!f+3jx@2tC)1!El5EBFe9Sx1lY3oIh-LmvW@@f7e^w&jIZxM z#oTjBoHk{raF2k`5rV#3S!!l>y1tVhwH4j459iSy_(GYBFIeE9w^y;GeIL0$hl@Ay+%Lowh{N*?$6xByEKk;~yr2myi%l)_ zWJ%B&Q+X*0xGFwP7R8Tgjn_BEk7;%E^5xuQ+uURe)*-p@&jrC%txly=S8IxcCFm8% zj;(JRTY1qme~Fx{j;+g^8fu-&#?@HLtc_#Ed|BIaS-sVZtMePVfE{mZipy$kbz3sN zRPG!&ZCJ2w!g{s8OdDO2m4#PXKE>?`s-}sRjq_WRfd%k-u#_HOQ{5VG_Z2p`G}R<) z<88~6@s{M}?MW=v*Tx6nSjA;`#|WL@*xKIA8wttUsZFa^U4*r3S-(%w0X4jv5M6(b z*SE$So7&>_tC|~&RA;#0mNVg(gf^;|1wMZ*)F4}^0 z1JZ3scOu=1RN)ld%W|X#SdO$1qudxwn<|iQz{IwLFfIlPNZBRQdp$uK+0p7P8|1&IgY!w&^;nQS9QU5;yKOediUT#sP+%yPsRU+ z4EQSGJAmgRlRZdZi~qG5=&uC6IRpKzz%P%`(-zKomjEyK6ldHJTc1@`5Wi7dSAw!% z;(s5?pF`@*xFKhK?gg8&Zp@xtF!^ThCisO1<$QquEoi$R5i#S2?DaVpY>M3oVdHM{ zXzwu8eeqsdw z67U@Bqx5eBA4e=k@mVmDu^Pso3YjB-Zw6lO1y3m`oK-M}*GVt1?b;gi6oLln11)dxoSmotm=Zq6^4&=cbjXV|_M&4-T zF%)|}iTEXk z9)1(p>cwb#S8RB`;kq>q^NIg`F_(sxYysYwgWLzp8? zT58gBO?sh87n`)vq*s~rCX?Q2(jS=g5tBY=($`J;j!8c?X@Pm(wP##h?6=QATaqn!Y^l06d3=1#-1&2-#jENY+t(hC zN!R~_OyU-&3W<(M9nto^4jcdWIdvP~(f+BW1i!pi@to`MtL53}m)F=19*|0ob6U?i zb+V;jZ{o-H_iM~}VBrY6!xc!aZ`*melAVAFG@l9V=aI*(Q~E8BKF>I-AJPnuKHky~ zX{N^?U+;%Dvi=}XUdC~eV;+N?g>2+e$Q?k19*4a2G+D$59*NusM9O24qwpL{#%Cda z(oaG70Z4U5zn-&?I)1JnlIY`(yZWK?A5iokc03(ds+pS8r}Q6qyyIU{>W3cx@vq3_ z!N-!?bVLGO9&}`&YZzP8+CH|XrLDen?q^|Y zZFg`2h?mWc3YCIu4ISx*gwx&7QnIpj>&0&PUh|(Xy|1840;7U z(1{&~sf@~veG|(wu8JLlfy&E`odjf7ZtPn`=EUX}1DTzLCwZN$?ATeDqNr@I3}>p` zt|UZwGcfDO-OQ|!<{e<+7AfSL7P+@Go2_yb*Ro>Y6|uQjz+cy4BD8y8sj4r+dtdqP zVu~B>sDEJe%^%`^Q$VFgVmQwqYQRGEb6A&OWWeEy?;PY0GhkemV9u0ZY``(<22?u# z5Ce`=iNOF5HQ+?`;xK^24LDi-j-n1XV1>F9qkjGo2ArktW$6e5E>y4Jq>?|<9mXMi z^b)0z=EvQ`1zfJC(&ka7M$PK0wE0*AwyE`$JjQL13a(Y_DC#743cWMB!&N_r$Ma8i zX9;|*t1hE^O5HeQ$40Mr)k+GV;Eoe`gR8zsac8@0gucsFJ6X$e_ZtFlan-L0Pcv}0 zt6m{I-N0L2^*h4n8+eo!BIkB#neRSES~xu=W%$6Y5!VQ9eb z4e-zawsDT4?p)r6`aSA4Jj=;@1`Uyg<$G!2yd{uep{%@SL`0TD7H_o5I|b2Wp+aZi zrwFh7ZMpQbn+;j{59F<;eGh8SJ9&E$METpb<5gZGeff}%q(T_NHqB8#fb4wwi`EUg z7C*$&zWnK7Y?0&jqN!qoMZkVo5*s3MT!v@qVu!Fryg!1#JB~H>hNB_8F;ke`j~aQ$ zUo6M?7HXU?**anuNOm@^61f zT_)L)=n39p$=0wA3CSJ?XL?H{`zc3(T522oB!++rR7`nwg;zMOz zU&!XDH}G4q4hYwq$+Fe&3;JWCXW+*jGJ(t-m)Tf_?8 zp(Cx(@gAnG|2Rl_j1cd;yjz!}F2wJEx%e6SBlNtN&|;Hwy>I1ZQPe}4*~u#)^so)u z;e;MBg7ZcZ>e0~fykD__AFZK>N5}J)(u60r2s9>dE);lA{aB!Jd3>MFd*(TTCg%MC zvq|rldjy)C_W_|_7qA&dSLAiVSKbT93p6WlBwPBWN`V&U{e>D{Z4_up-n-QBTBktE z^X9VbzwQyJIj@Y+>%S0aZQhxb+50>ojzW3Yv+xZKZgBH%qJ!S-lhQ6X?`Fo?pJS+K zZ1fg4?@2b*o{<7}yLq>whk9>oaI2fQo~7@cCZ*flyvtdoeHz^E=JAfMw|~Br_PBX_ z>4Xn7?@l-GG}`}>R~-_{&{p0*9ulz6&AW%-!M6q6 z=c;Qc*>iId_Oa0iTr~$x>}9#f3EbhSR-8M$T(?T#4W9Zv?aXsm3EbtWIK}0=w+Ot& zQyF8p26x3i`W2)}lilkC-Vjqyv15#N?-95wrsfkK?>;B+ zmYCX2`cvI^1@4ZiBiQp!cZcB>=Gf@1G4&lb`$YFlfw#rf1BB0ZFBN!uO#PMZG0DAJ z;GUTJCE@ejy9C}DQ&+LAr?^iDyepTyaa&Z3embx1R-j=04$M{IPKN5I*mbwHD zX?^%KU!O4q|}+1TivS?XlQSEGB9z`L^4J3J3u?k*5`cb3{s`EBl%0{3RA zZM1id`yGM%vJ{`J^R94r3A`^$HM1*y!Tm_!16eAc@!#RbM^ax$wwl2BUhmEjctf`O zEB$qY+bnQbwwlIarqjJ$;4RteCGy|sJ}z)~wn~uyX7??Dw`QyV=74gGJM1XR-jJ-j%H$=7{u7_ceicXRE8} zzq?!~PWipr>O8`CyT=OLm#uz7|9#h;De%5*wVCnqeRrk62eQ>u96WyLZWOp9N8Q2p zxzD{<;0-zIOKk5SyUz;Tm7^YJ`~Jk;EAW;awSw{=bO#TmU?xFmL-IW4w&r$EP|Mj>x3fz;U9%TDG=6+w`ojK~y^vC1wa{}+mQOB~q zpLE|9cz2HKru?05;V7wpj+#mTKjV%UxGzV2k@|k=&JlQDj^Zs*?>Vrd`9fp_MrM#6pW3W0a! zssh$$ue(v;-MQ*n#`j;`Z36e^swTqkx-Sdd2mOrS{q9Es@5@!+V0}Jtk0_zO1G%b` z`ag0f3*4d9v25>;-D-h1D7BFO|C@V*z+FmxO8x(E?-h89QYSHf;9-HgmCE%1d)|8j zZ&m7M`a8=z-ZMFRII)lGPyca6Y1mD)>x7I^w@bsOQK-rEBADwW6vTOa9dQQ++Z)QQx8k~dS}o&k!>?Ov(3QsAB7XZd*VMuB$? zP%iy*iuZkicMni6v3*YSo)frtfO?hoo#DMJaNht`#P&YZD;z`p`v$0|a{-_2jTiX9 z0Cg?tCwX%O?#NU7INqG+wFE3Gscju{7 z7;hCGx6r`(FHe1&`et||1m2dX*0FzH;GH4x_B{1z4DdyUzb8)(P=IH97fbohJar!J znd`L*ybCb(UF_W?@a{a7HvsUZ-j4dD-b8_S z4pd{QZ>_gj;9UdNDE5adyz2zsJy0FP`d;aMSKwaQmk0PNZt`N8@Uu|IgZS=k_@Roda zI_=ryJtS~Q zXW1YB(<>EtU%o14{CwL>2z(%4olAe+?OiW$#~?M4;&aMvL9 zD%<1x-k`CRzh#hmj{g0jcdo$QgVd4q=Y3w2z*`5YTMGdH*y|Q}+aUFQ*5^TQm%!Tx zsh`rmpL%-*?ir+34+8v2_B`&*6}Weh z`Wo$j(px8R-yn5uA>gOIuL-?Rn#AZ+C$jO@IE@8zu180`+IYzw;&uysbc8&iMbm zw@~2i1?U^B(DsKBR+uc{cfd~kAAt~wVR zuuwfse=Nye4f)>a;p#P-zclwN0>;&gw5HaSj#14NS(p2Ol#Ww>WZjk<;)zbtWiZ0! zRr@gJVBaJ-D@W0`qD?G&&Xx`9K(i0y#rrT84Er8(p!_oO1GplPqw2}TYupGEitc0) zFL>QP7$CYt6pDVzB3}Kv&qs@1Vi7NeT~SL5hlxERgzFLDf0snZlPEBiITQ^8wy2Ut zq}5u5$dr#|IWM52^2HJ({~{7~lE`<{u-|C;Z7jMcwMgXCRnUJk%X!)DlEHfThd>nb zdfT;_Cy3!Cx5kL4!Tu^RMZ6*oX{HS*;t*fNYv+*VvaXV&1^`>ki*6&#pi6)$;>CB! z7vfb@em2W_y&aNh-1IpXadsFf8pdWg1lFu3!2|se3}XR^Hp3^FJCpPe{gJW&M1Mvy zfXh!g>M_#uNw8CAa_5mz}} zt~X{-^(hIs?2(DUs^V;=h-)DkiHxdp5^;ef)b&!rqMig?G08+=Regy>Tt>-AWK{i- zL|j{Oxn`Q7Rxgo&i!GT5tf~)5#1)u~L`K!&C@~o54643M0xt1nBCx8SB@x$sG7=e8`#@C8#h}oD=LdQ*@WosiiWXWG z6G*_NqBH^{elE(2xONon+cK8ezS~ABt|;|OWfk5|O0G5aPiZtiPD-vqMZ0>6=66WN zwW)rotma`LD&neD|CC1axuoQJRqT@n}=0&99%3HrwR`a!_cQKN~8I35EXGPGCHQDXf7ueS19|XvYJ9?YP_<(ISkUY18D8is!}%b#U=WOiW6?_>F1mPbzMru=!9bKx}_ z%BK81mUAIC8gQn32#SihFdGdEQ$C*MT&RsUo++P=qGB%GhMSCK_Uh$w5^yCqjlf(! z+(H5_?WPgXV{q}0Nx-$R zMxK$#sJf9vTsRN)&lFYnk$@}dnFy?^7f8hA^^8PD)n7@(HTO_gPf;}jWkpOfcn_v;1C`2jhRZd^5|RWqC0E zhs*C{`CgVsqTa}Vp5?r;5DhX@{vOMDqahj@rhEvBig@E8+MK3*Jj;0_BH9L~d^U=T zd1E5%VV3#hKM8oJB8|X~|0Lk8i!=f|{*!?BGSUd__)h}f+(;v^<39;_wBM#;CX^!dzP|Uk6#u%X>1IluMF5;b+kR4{OGm1sL>Eg-^ zC{6ez6czI(OjxYpy^OrPArrEh&r3n$Iu`NXj5~*MA!4Os66fqzAi9-AykQgSXF_gP zQGbe}V&1?py8SX6XTPBU-qCSCfy6)yWPidU-rRAsQw%^+F|b9v&*K(Gi^j2tw|rdg zCY&O0CX0CY$K{>Ul%hHo@kWq4K3a4Qi+E4S<<=c3Tz9aDw};&GqeTz0hGnHd5^)6@N69 zILc75i{U9oloj)ymI)ExOT$br|2qkIlgki@o5X8|;7F7e^RAa65D$sN48gf1;B7EN zAkGnA8G-}}cwfvAh+o7_hMU!<|ASHsVE=fI%S{z<9s|qhvTGV2C)BC7?Q!47yJiAzNG< zFhqRI5-_YFgYKT?WVkJ0h`5<0VE8&2bWd$Zw&)2m&_vyzltJ2I~Z_pb6r62k3X zC;z{ZITcdmk@dlNSOu&3c}G12Z0?~Gu%D{JqtiLl^LW=H=lo6(f-CRVJU|t<3Z(D= z62R;;k^qOC37(GZ^1NT+!Gr9XghWdvG8AXEd>=++UpR`z)1hI&%mlLN+4wEK96#=` z#gOLY@`bfZ1k)CEcwTER9ta;Z4;Y#-h|o#2o=@~I1C1I>p4ezSNjw;lp(ZRrVQh4l zi?;(#fynbw>fYnI_HC8Nz{A5^qYg_pu6EqJJ&7)G~l5e z)Ru?usbf;)9qU`e*YMn_=sxbXG1q=lVrYn)-wJTAiLq0=^PLfVN6$qoIqoen>1A<4 z`;n0fRCzcYI58!$9O;FcYxzZ(#f~RIPM+m;?qt$>FwKM z5>X@g9-#YYHt+*6dEaE0QFSMpnMV^?w921|%B_I4%AbfzzHc;gKLz|mJU0vu8#!3R zR51f^TvR?NDmjhUCThf7z`KyUwORIqE_2XRcrc{3S+9y& z=L6Pey((sPvAn+4abFeh@~*$OQp5aCiMHxDV%18*V#RA>#Ww*TwW1FEzl}YQ{HyqP zhL1WO28|hrpXQirKLyfeEJ8FKDec)L8sj*jIHSHzj;|r-o*i@T$4nY<kI1$9V z@*(d;fzJc%jNr?sZZ9Od1zJnDk-poct3jr<P4ZFIAyJ9=vPM<3dpBHrdCT+yL-c8A;yb*nAJbAYV8Izj63 zA;EV6IwgGV)x}utxG(Fm$_T#1q{pJ(TEUA{uo$3L@DdeV15gyaLWy?)(h6QB_!K~= zgfGpyGZ_~T>BcaEzh=@;L8TS^j0#Ri;A;gxr-DlWih@Td@k&5iK@Y)i0CYxeJPWc9 z<;h})=XM*ZlW-H4$15Pwjqs?%*B1+HBRnSYwF|H`!s8N8hrts^wP3q9SHl+pjvvMN zeZs4Rxa$EQ*NUOSebVFEKeoC1s^dOIxVTSw@9@ODx%+CKa2$81oLavN`V;pVn>^fC z=W$XZQIE%OMBveF>~GI`tOVx@6gq-$47*>Y%ieM&7VP)Bw%|4`kM|+=NVaRA6yJq$ zdgK|1AHaM)l;1=eIg^5Q`9#9=!DHZS2rqaXnb#*JAC9U`|VBM9@mR6hs-jPSpVQ1rwTXb;38(6`!Jq|{%5Eh4Mm=AdC z3Qdw`|2E*G&?Xvk(Y~YUT@8Ah%j4oa4W5D0xHwP4s|X)P5%fdsAwKL=1- zrQywl#frE`-FzO%$>)3Ih%J2*LD%6+04!?j8DvHr*D;^{$zyvNOmAs!*>7{xBgIqjBXXTZIhL#KcZCE?>>p) zBM>%hk{=22ml#B&_y#-Pn#Iq}u4}&ucv76kI!+Hrw7Hwa-24&N+?&MQ`GAjH0f{$> zb!!10HwA6ucDZzkx4B8&xmomm9i`5wmDD$lgYOltJ1!0sjyZ8joJS~6&W3A6-$#J8 zd)A4*!|>36Nc_A=JO`jN;yp@CQsQD)%vfTi^_nyRGA(tHNc}2cEp?Gd?IrvGTkJAf zkd2|y;@7ilE|FE(D!`((Rl?@o1Ht9iuHFc8PL!J;iF z6ANAkJW@{cQ{<6B7vXW-YD@*(N|zTkoUS+}8z}O79CDUQz3dmz?922e;L@Y~5{~kV z0P49zHRldj19VPq#W*_fro-8d-IJe1ybrwD09ELp1G_Zfbb!`#u0q#RZaq5tEWrQc zJp&s5&-M&(hv52gehy#VJ4O|u+PH3V3v-6z_n3mBfiav_yhEH=!C3>(9>^=bSP6iE z1J8xevyfFfn?2YW2uuzWQsox8ZV~CohUyK{60$3cCSowgO)C=R87w%69ca~{d%IvK z$)KY_ITjMIA5N^`97N0DLsKLdLWZ)o4WU-6bEq*PTboc+jI!hMDRfx2s4vzSJg3SL z<J0T1&1=)G|Qs3<3um!|x_ zM~379JnGay8$g_feQf}b4nXwmR1KmSG^0ZjU~fr?Y9O6p>9E~{b)N^eV~rhX5rW4B znpo>GdB%<*E~YX@gCRY^kQ(sBfry`>AUi2A1pOi)IxnA%iCBw9-)3MvXC}+szZDF^ zuM064EFJfM)HNK(?59C)XMh(+!}Eycxii}*jU6}B!>74i6xbbtV#D2;Ube>BU4mjI zu9pSWF7#y2xt&I&8CBQRuyX9GrlrZ2v2*55n}>~j$MW-K@}s|9)-oX#SlV9SP$3WW`s%jjV@pf9Nr>+G*cs&XQ^&4Yy=v?V+0wYNrlB4C0ZY|0myInQ+rVv}G)=u` z7>jTJr6QKr<6~?h#*l<%E~}{-yLRH~iPKL#xwXADd9nx`EBi~0wd9WdAY0|C=2BdL zInIj4`qJg_3p0sTwaCLw=dgBdC)YQgOKUUT-x^7pID z&L~^{{@Ihpsi!ZE4N!F-Oj6eX?TslubLE2NXPrA%eeg^y&pXcjAeN6`Z}hOUmTy*< zoIUAOHR^-dTJ=i%$;)D2zFPe(R;k|fjx9d(yh&$ITBY7n%RhKOw%Qx##;$nf>DW+J zsusou*Qu(T&b=x2l`HO?8OxiYz8d>u?3JTmZjTLF7;9P>8&dk$SaDaax@2bTrZ1=& zFI8Q-U|cM3e{A)PSYBQ1l51a{`MLSyV*~cb*35_vSQuN_r4fVn$69B^2Gzyp8j6Db zv6dOJg1Xqn*S=I0VyTOL9J}_k*t%C#)n6~IJ@*-Pv^REG_s<_v<6@`161zafzkg9| zh?)@_d}nv}U9shF#)?#(s#UeIJzr2=YX2T}^tv-H!`Wc@f^$12oqdU#nOv_fN~ogP z;5V<2)uMg_?~Dy7Rm(3K8(Tgjc9g-9Eo;A5;)%vq1HOAKL zj}18Il9MN$uHY^2_#!pwx>&o4PfA{*KL2WRS*-ES*gWqP_XSnDLKxNN#qH|s7h>03 zt=?Q5yQ1y&*xGYuEPkKdm!7oTJFX~pBy62rIq5$Z#2&s{-8rhIeP&PWiiM~C`CfHN ztoqKEXD*4YopDNRG1}qMv(DW%Z}Khb=vk^Fwov`-^M733@u%2VuKHQ)%tc-<`tcfs z%>UXz!;`QXXx8Hrgva6j2y@NR8WS6g5k^KGoP&VkUW5SG7MeY%Nku#l8_MWia#*}w z(2U~k!X)}l3cX!&jM7_0QF^;5Xz5FgytpyoZUaZQ`E^b*c)MEnoKKf=TWZJ3waaKf z^668yr?zG~c5%!4!SdTBthX(H>NeHB9=oo@6AO>XcGa>kHSu<($kxYfTkV(IRiA1S zzw!QY-(OztR-_$3v{k5;hUIPBk(0#^j zuzf$;YqCX#U)mYlVH@)udkrI2sh za@cLMr{aSJ+zai3WZUwlfAPUw*%U6a`(7(Pjhx8*IbNJ}<@?GjYMa{ebp*Y!+xf}1 zX}AZ2q&&b*)87?nb*AG(t_^yNx{N#Y&A70V+%)>arpDFvEp6@94O5p_w;1#1;)BCY zjmtz8KLL#o9FP6qnpcfYowtB^yoX$-a@jwQ714e$6(C}68$QiY z!+L0BnbcQfr#CcJw|$nj(oReyI1Q_5YOHNVBf&euKfON5k6Er8xxfmC1j_)#8PY|>des_iZawhn&0Gz1Z{(SsyouODZZh^*6P(s`MB@& zmZnv6l6Cq!&mrf998~7`9Ad(S$u(8@Y;^FOl?N*7XXk}wt*p)EI_Xm5#+;)7HqlRBB zPunq(?Gr?N$Z}LtKJ)>r+Z&{b=Pt)*KEi7H4Khre~DzsV&OvnOkX}T^;n9A15Mtr5du_k$ujx+7f zkU0r{{X3&qT7wU!OFNjRF+_Aq85cMxM=MDi zIOv9LElum_qXidmqgVcIMN1Dhu*)cx^<SZ?z09erN8iE8$XSZhgRWbkNZV^kQ$sCeL}uAh ztHZ)D=%f0wH*IrU3xg@t7S4($Ik)TJGG{Mc7eV=9;GYLBs;S`sQ|n-WX<7qmPF>?H z$SqIS)i);f*)7rB)aqch0cV;7s1r3!4ehHMLji&zO`<~kh~AG5z`;18=LLbIf)bn) zWJGIq5(#Vq-B91!mT0S9=FDsIPnlY5YeO>G45GT)An>EjL&ucYw_u*bn4Y3PYh}J} zg>WKLJYxFUihA24Q=2N>A*6$(jNcFxRJLt(g0mKeB)PPy0K#XahGd<@tegr{TckXh zHri8^se{;GR$Ge`rs+j;wnHDWAqHEt55oFVc92f3S!#r@sFq0sNwgGSGDgEzf9%BR zvX0X*oGtaaE;!G@R(6iCQzAB;tW~(Ct!RyQ#BE(e^|ICpdYF?2 zO6lr6p9H;EW_N+Z!+qRgIASKJgH6N*9VR>k!4&N?&8=(Av)2_@IEnT~#AB_tCKEea zcB$H!(pdt_XXoj0UEQp-^R;)00GFa;=^xn2wq<7{bF3-zV&h{fpeo84iz!_d^EuWN%o73zJA zlkiLgU=UsABw+j#;C%-*t;STOp=k}Kz{~KTtfshGE%mD~A6>0aB>vo#W;p(!Q-d*4 z>fnc*K*3p00%Jk4rInZcsUv3i0|C5gAjLsX4u)2zuDZT~0hl4cq~4q`O0{&H11FJT zE}p2B&a|hJfW?gUsRX(+g^PXy9=8uHd;0eS(uz*i8qEOHGUGI%cvu_@==$d`+_@DdY6iYV65h z-?ol-nW}5r7<$v|8*9yUua!;5>kiEMwI@^U3PRcR7$8zdn!p{>#@4Grg!XT5E9Uy` zZK=bA%uS`ab)`c><#Ng&(VV4Cwd870vPd}@5_*^c;* z3o)4-&G67VGnJxR(ZLTxn6$8FvSTh!C3Ignj)LY6b(z4&CI+mR`zZ)tY6Qd20#59c zxUiQ-mqh}5nqOOQE(*iLe02JrVkVr;rqGSsiug=&oK9U2Nvv+;EXqzDXl&S;42vF= z5gyo_6>G4t zg`V(-c;+|aJcJ9|WQ(5bwTfqhdkSVIl4%6-*B<@P=J>Vt4bvkZqgIDt;IQEQj*|$& z7!irn$O^=GyIj!(Batxym$ST@HA7`Ta~%Y%R-|2?GOqd)A_@%G*q`WXvz;a8=FV!9 zdd?bU^SQ1@0v9*MezL^mt~IIa%(vNnK5D@yCTk_R&H{t+lO-l+xm{u=!g8+_F9}F2^(_G^%2jNNR`?{BSzQ5F zS_qdKYQD0@10B|8r~0VbR?zwYrOAWeZd3GqpJcwx-tVL41@t=CV~YM{QihSu^DS2% z=;qr@v}pu?E#tes?D;mk)bJr_t~FUJDnlHl3+mTMtH5<;+w2v-uEpuP(n2j=*BmQ| zn@00+oki(_(n4*&sr83`?PuAn>^dTXE=w1b*8JOy+9yp)|J(fE0$iM?g%8X3yl?h= zo89lDF0)xH37tJGg!yzq^Q@q^d_jwBHV~B7Na=!RTS0&H1pi^wdHOqJQn*>(!!|Q6#dAg zteVaLCcwo-PUy$-J@~Ih2PA0*K4Q3^>0ioors!ppdd}uHo8RrT@#TV)qt_Je_u1Ac zn;*^>0dSzMamj>!EZ<*!(P=JACrPW&wA<+5DkCTUx#3MOQFz z2L&E%FPpz4z{RC7^kezX@I|N9E1e{*UgsL_8U0JS&=k!#DeGnP3w^eNZ6`^4ZY8O#U|k zE-n=e{aC&S4NZm!N+(IH*CU4enf|3bXNq1nsq`#H_qm>&9l9TiHSD<1$k0l<~{q;<~`Qn!wn-GYO}xa zQH!25St|;&3hjd6H(k&?D~KNu;epvwx}da6r_qM`37;#G&Xsl%wAE1m(C3h`P%~AIGevCz)iII-F(p<2PVbo!C?*lu3obGo28R#3=* zJ3fN}3oReNLCFK%!)C1^uCvf)t@I3?=mI04#uqfJ&SX~ws1}pGDnQ+CvOf+`514GA zE^QP(Xxi0U28VCG%8L4q;TNO@0{OFFjK~){UH{-W&k%()eDA6)2KmiE!}qSTzz+-( z%TbS*tgQhwd@rpzdJWMVCS|9x`8NYxq0Rp(zzw(gz5o}u`L_ey7@OZ0;KtefUjy7k zo97oHd7xA6(z(#DHMj`xi}FCHve{33)Pk51VMS%Q(o7dL&k9=Q3!3|$$#Pc+t#0nT zG}&p3I97J9&o$d-twm^!?P+7B3!Co1N*S(x$N;rs$g{W&gMNlkpNU58%e>T<~l8 zz88qL*#kamfoCLGNg29fx}bSh(EGlix#@z^`rIE4^*cV-EX$Q^%)mTjfXN;kpn^*2 z+zun)AHJYPR!~rnvOX8}rAJNPX$F*U@bjB}emD!>)md_#bX2U2v-${K5EV7JZA@KJMTn(WE|^{)k` zg`m}Sf-fa)1V7yrP4-FBM%`vpbgfBQdz-%{z!gRfw0vLu*P;WGv^s1u+*T9(6;;%2 zNVwSu4;pCmacr$)aB-arel4Hu{sc5c+bp+w;(@LoGZL(%45NV+^r+93Rt-z?h)*)x zWQ{WOG=JkU&{WvZ0y`CfAHN(@N_b@f1{P8y|cv#TyazC~K<4`<_l| za(SYT53VPc*MiqVPH7F^!)t{?ovf%qA!Jsss;`0eCWygLsmRuHmg0&2(we4KtMHZ= zNRvz3`G{$C<1)NcV!-D1rF_xEhwB^bnrvD1(xolQ)fU3m6-k>H>ns4T*la@+EYW(5 zn$$-5{{eAVC$7Pnn`TazSzWU!cd6uI%gvRdV^+Z(HZM;wwtS+wuVm8-vy?z(#AoK|2>9LldpsZo_ZWE<hCUi}dzZy9D#JJh9 z{n(~f4@l&QxKq|Z!~C}Y+SJBDl;4h5%TN&Jx8sUU7aD(9e#>X!RS|wW?$|WK?#G?w zZ#Deb21||&N2jJy`>p?IGmp>XpLyFp!$%W~{gh1lfd>8GsQ)@q66P-~(WExLi@_Z_ ztbU97GBV`%$x7q8s8lCWe?|Fk2U(cE(C`<2M*eR`_~V8@Zuq16qVRXX&)Bo}k1_mX z41YI`3zb`bTdyCYENuVIv2l_+JI6}m#C78TT7H|}kCHHdpW*K_{JVWlow0m2eK^A3 zGcGQK+`F5HwNpbu|FiH8WGKtlf0yCkW%#WgOCOD&ohUFavLupP{sED~2L z?7SltpXJ#3L@GYppC_c^a~ymAPsQi@=k-*)^3U6;_yLYR52xbu9D9CE#Se7sc{3HC z@7VKVDt?fEo=e3SIQIONiXZGarSULI@-ak}J@14IW7q}Po=;NoLmhjbNW~Xn+>eJ* zl8<3GB|EN%3uE}Oq#dtQ@rO8e98SgC-DtvC#)FNxXQJeAPLb2goR#Qa@x zQp;k_k*Np+#hj7-;3I>9PajXCXFtty-t({bECJ`>neb)6dsxVh#?|b8=obO+I_dGS zLh$MFuvYNt@o>H1gZ8rH%dLVhc6N@7BNrTBN0xR@HrK7T- z&p?igcpe_Xzbg0wXWMaBqfY-Q`1E?c2fWyMbSiy+?ZU^tGquY({orQ+?|SbYjP{Eq zf=}-ks|n9IDEw(REVIMyod&BA<3*H!kq{Cz@B6$1UKR+5qInn*%t~B`Q z{%~J6_~?FPKQs8~et1t9e01Nt7X%;J$^OHG-{cvpv+{czU>*mI9NVo&X*52iV*Fr+ zzV93SX~0_=qFy%m*+OpsBzB%t7s1>8=&p$1UootF3Nviy2?l?+;4vPWQ-GE8w82OB zyL;QOq8AP<)R}~esrJ4 z0)vn4lXwL1nd&=A=#4TYw%yN&;5!V-3?o0fA6-j7^w$YK!+ea(iCjj+7P9}N{d~uo z?R;zSnp|QTc7RIY^-64C1$1j0HV1*cL}Kc^i{>P%D(B8iBmkACKr^QLMObTW<~~)m zrKgWO^Hisq317aiZAvVYZL1QpcA2QguDW`Kv$lQJs&!Vuv8(4wC-<4?k@a>~@igwhG6r#baaHEj*4 zs7$*4`5VNrIQj;0CLy7{+Y+HjVUx{Rov`oX$(!C-P{w=Kt*M6TJ&RLune@OhvQHx3 zBgLwCCJO(BMSrujOjM8)trq=|SPEZq$Fb^lc$c@jHr1e2=mt$SsW{o7MZe>TFXSYf z`Br=Q)ysaASIwGpK@;|v&QvUos^6h(#k;f#d6z!*RnoeaWTdgN(vE$hQfIcqHel}OaA#f$j$*cuvpw4@4dZN?5|ZFQ;0cG(~)6$h*EmUmN21Z!XaPeo@k z*KbYPPxGHr=v^E$kwmvXkoT!SL(lM)`|rLc5~xmN6W>n8ThL7reSt73-8Om+mD zBFMIknL@{jY#EwKjO>P)sh|?We7!W6dA&Z>zh>{jl--#UNx2LZV^=iew>?4F-+8C<>Z{WJ6X$60^G)tkT3y zEZ1c*THE4FE55b((wbVUh!z3?1HROV+M-s8*2-Ojf?5$#+5hvLnY+0O!TSC6fAhJS zIcLtyoH=vm%$d1!_x>!e;G)!&6vMvy85bIaa?V$n9G#FIOw}=@8QI1F{P!3q3+;ep z%E6I0HY=PR8irdCtYaYV?K*w?W`(!I3SH>xK|+pyDxF*~pYa0!;d;R>fgP@5!MN-& zO@T(?ze8pH5pVvpLi7$F>ZkB_NLpT(A)nNz!2kN+t}g=0jkxFIo`!n~ZeAO3XW~8s zcNBLnZe9=Jeh_yU_mjBma2Mmg758(vD{(Kw&2sO>eHHFM;Jz03!?^!~dj;-`ar5&i=AowzGB?iL-6MR+Xkn>EZ}Dee~B z>v7M;&C9C-q#La7#3XJ6lsZLkoUX6Pk?w{lS74BiU&%#}Wo7dGU`2X#HYOj)98XoDu z57qJE2#<5%|C>G^@1Q*b@zDbvo|W;ki0IN{0-Zb^LN2 z*6Q#M9Wt1Sy9oDU+_&Lw#Ldf(yB_y>xN~s#zOL7Z8iWDdzr=ka?jY`KaPvA$1@iw# z_++lXD}HLU0_JM^_YjiLOs$Zq z8ovkzf%qI#A(rZdSD~!VdOz3ncL*NzTIlw;nIz?CA_P$#ou&EdpmO4RUIm6r@ESm1 z>(>z?w;@KMHf9x?WDpFA$XR#lEgFAuFFtL#9j)87XQ?8*Udv~%=BHlwmllUnm8Ru0 zU(qkrfS{Y=-p6_cD3f3Gg=m%aLZtHyJ3mwwR`62}Fv^QC+g zrj0_QLK_pI{OLOG3^IXt);m@w9*yt_jF^=+BO2eX<Cczp;7vv=Uo2w8Uzr0@V#s8aHo@v6TqTzqr zhuEe0Db$KX8_MhJUgg-s_#Uk%tx-icMVEiG*7KTq3jdpx$ee)k-t~L zU_-8tp;x4@f7z`Nx_qD3pJuH;HvItMe~3{$Rgv3va)9P@mFE9)UCwWXUeWTuZ3iwu zM+iRwl|~eOrUgO1<+Y029dZ#GD zFEo8qFM4fOj9=OE|EVIh?b7L5|62+a9_C%H{lcdP5TIDOGJDBkoyM=}g^z3eRkprq z#UHQ7MTOS4bggg2n!Zx^W2Wv$dyI3=W_w%oWIi7C@p_m>GJQ^<8)6*Ay#XA zo5&4%7*mM9YW;k)mz-NQ{UF`04z2i)Yy2s?oSJ%tcno^R>s8@j#ra=P=f?70`eXO| zIa1ES^c{K}byljhvoy(*y1kjYy$@*o47vCO=EZ{(E+w%`}zjWrS0#0j!lZzpT~A2k1& zn*Uoget)lepV#dgq|0xuP=vM|ekJ_{|3{Atk1nSU`KVX*QxpPZa`}XR_-RcFzFp%_ z6}f2u!P7drQJ2%2s}N|8T$Au$^!9uOzoPj(S@W40Q20_674UxcWw9>*T&>UbS1H0gO}|{~)c}HNIvPeuJ~O=vp|csKz2tnjroTz^)2jLT zjmBT6+f{R|LOiVTei!|m&k{K=xiv-w|Iq!CIaR@9bm}D02lPvwLM+j8n55;?swV_J z42*rczdBYZdfOlPyOu+7vBKY|0%LTqcAcW}^I;!2{}#UN7K}Z9&)5BHOi_eKY5Gfh z>Fsolzf04v()#ctjsKhGUl#emwQKy{sF(6j=K={A#}%(JS`M;-1DO59>oVQ04&6}~ z>VAJ+?1Q4=|9|S}{g5BqRjlO?Gb`6SQm+OOp!?)X>7`dT|2JqpYkr~VexvI>83mI6 z!V-nARDn^Z`$aaJfICOiZ$X^&EnY>ar*q?6sTclLfx-{e^hY2hedlC_x8?suuYSBh z%k4U?Z}qRZRR;Zkja~kwJ{eOrr=_10^<@whJMv7s8T6>5U!Gobl&YdyKb zuD6$*FV^_02Iz7wQ-~cJ|D^8Udc9uzhc5qPq?4ZI#@_I$LV7yb-g{_BvF zJ(h{G_2ErvmnK4RjE+9sOU|~Q_-uW+T@ik!`TV(-L$j8H7N^mm<=LtY(ha)&e`)=x zFI9+gjeoHh|MPYEujzW5S1Q5@;Ez{_wo5Gw6l~k27leQ4RldU8`g5wDPg|=Levt}{ z6}{?xRM(rT>C-h~i^gAb2>a&K?P@Ji1y}0w-xhu}fWYprBei_?i9;-^XD zS803V=7tfjw^U#((E4fUf%TlmKisQ-cWM09y53c~U+n&RO3SlDcgWkC-b6?}Z1yUI zO+P}9uV$^_M{4<8eF*-4YSUk$%K3*b|3{Dy?N!A~Zo%04xkk%>l{SP=X?oh}Bl_6q z38G%HdoQbUYX$4 z2QC<@u2DFkg{-a(`_w00||l)`)`$r&KRmlv@k-YKtJ2T>s)gsXsSR>n{aEON>Ae<)fC` za7_qesrA>eJs_T69rSC^2>PqaiiE#|N|)xN+)Kluns8`xxV+q7JCohgr<{U6ln^E6 zSN*U8d(%-r_>)N0Nk&(-+;y`V6)gp9` zG3}E4qD!j^s!PfYYS-n{HD)$?8949@C90^czFsMxzpm6@6GA5$!J1k~x%?oZIQphm ztMJ8D)z?>1szItoSy4@`zq-a>nKgDuM1V#0WvV*mk45w36D0`jlW7m(+s2 zss%kT2MJeH^LmU&zqhuwWXboWPhJ8GvB35G2Q&WGkqyt}(*FO25CRZ}Q{-&#NlCv|O}ZOiQQ~@+b*~ zYQHbrOi%<$r}{%PVbLbj$o0vRRuY?7S+O5PnhWdsgUg)^YdnM2xKAc75hEH1&hVG| zVXkHc7Wu2gp}eY+`IWFt-;)J$=$WT);-nz|d-EW$iz=(HpHf{Fs;#b^UR~yg4eVCF zLr4)M<;Yd4av7mgAP(I@s=2CpJ=vdysU}!aU3rK`>&}AO^;C#5W#lVLf<+k5r3(V3 z)nOPdL_?K&OcTEd;wmbwD5+Y2iIO&@h&dFZ4AW|L6(>5K0i_hFVn~ERjrkL83I~g9 zdsS3YTIvr54Vv8mX5=6S%)v96e-UKyecb|c8mMGXe;<+3=KSD{{2xL!W!B6eM3(zQ zsB&k`_(5bde-PP>?`I9_mm63d2*MWksrE??_yJTXi^Fbm2@L4>7xw*R=)XhCAP_uc z60;pjCP+J^AYcX#B_kvqqW=TIL-sk64$;qG9t`R^uMY*s{8wH_rMHcH&|eEhS6Y4u zOCTdaEPK#j2~X?$BtNCnUs6j)KukNVMtNm8Sn>TiI2)p4X9Y?ZPLV;5F&(14EHA@E z2lH78W=qP7=3`1z1}J zznT7Gx#~lZ)LhR*r#RRv6i0p;oXtRa0P8u`;G(RW;G#gVv?xoj-mCX;X}W9Jz~elB{!?EGL*EwO>BDkDX0U8qj!{aI&^IU9?OEMzgJ7UWN!QUt`9 zacV)IVx;Q76hr-`BIMmqV8-~zOHnGw#uFkX(^NiUoT-F+;<_ojOH>r8x~#rRP-XVa zVdqk{D?U_hJxj1_RBf^;RPOHo3a@BYZ8oJ{cQ=K~rMT&)Jvc^;sV^nZ5RHY&g3Ye$Qq%vm2}0Rfz2@?D}+Hs~vcI zFOsP(4t!QOxv|E9KgWS@b>Ise_$?0natFS{fq%e(-|oQM&y1P8Pvfy|3n@9SEp7pb z$5vPJN^{_`1)RLn9r%GstYM6F;IRdkyxa~vw)T=&h69f+_~e!8!0WD*v}_07dCnup zfghPH1;V{X29e*4m_Vl+gGsze}aufSmD5*=)l)F@TWTPbq>78fvi<-Q zk^gB9yw8D8ci{6K_>m6$GzZ@8z&povh66v{L7(Zs>n&$V&351m9rQU4{1pzo&w;ZgTOIgp2R`b+=Q!{&2j1tvuW;ZC9r)WE_&E-|epD!_#SZ)( z4*CiQ{+AAXjRXH{2fogM*N+4xwcdfh%R#@)fxp**Z+75+>%gyc;O}$bS2^&j9Qf4^ z{QVAmiv$0l1HZM&Jz;AKjA93J29Qa2a`0Wn-;|_eM1OEpH-g4mo=)muB z;GcBh_c`$PGdW3q$t?l({~3v?e`yZYRIp_I0XEJT*_76n7oA zKzK0WLV@2VJcMwLz}pBPMmSU87YWlPjJpNiNO&0Gbb;3r9!}U0_({Ta3FCVX05R%O z!hBpB?-cj}!iN*?5cqDwM-Xlm_zuEH5^fRrR>FMD9$zK!&4fn~ZWj0k!gTfH^#a!t zK8A3Oz}FI{%NZ{gcs^men(;z`uOdtrGoB;x48q3|&J=hW;o}Lr1)fZpE@nJk;0c83 zTE-25&nA2l;XU86{bvw%6YdoF6v8JH?hyD#gij&dD)146PbJ(U@DRduMdPakP9;2w zaI?VsZwGuD;d+5TCww~L8i7A1oI$u);139oCR`}++l0>`oFniy!apXQDe#Mg&m`;? zcq8Gn2&W6Ymhc$DhQLn}9!q%7x6=QFGYNMJ`~YDtwc;HD-%a>z!mR?|LHHcPEdt+4 z_*}xP1iqOtUEz4Mz&8*+k8r)fwS<2{xJKY>31<^77I;44@q`NnzKZY!!Z`xZAbdXI zOo68nzJRb>;K_vPLdVkuo42>c_$bdBS! z0v|zm3gH%khY-#syh`9y!g++71>WBb_#(pf0)I|;D&ZP|KPK!WTrBVhg!2g(3j8+V zX@qkG-bVOh!kGfUNSH2h+%51%!qW+-3%r)_C4>!upCo)K;XV7M{|Ofo?iBa|!j}>5 z5cqDwGYGc|dDfj*Al*haE-v%5}rf2Sm61D zuOwV3@KuEAV#jj?oLJ0iw>B* z+->-pT0^Oc4w;^s?W=y`TgYe3_L=_(|qQD z)xadSp|txD@kP^pP20jBzA#`Vpp>m`<*t*UowHHKq+3x23Jm=SwEv2#nuq&h6HiA% zzS*|boA}q(HpM|C;abBN5<{0Poz;*?OUGNDIg?#RXp-xsdIQ(e>W0KnVpoki4HKym zI?c6WFlNn$#BgFe7mPDPN4l2tb%ch5izs98L?c}Nh2|%c7*xLI%#_gXrR9;tVQY#p z;f4O?T5$`CjwFVysfPg#z3y7E7w{S$hHq;~^p{f72Fbh~dfIi{vq)@6qzW46azhWg zZu`5SQh;(bwlXhzIKg?oEt2S0zNQN38-OWqUOFj~7_bHn1g3&CE1o0y79uDw&<`$O z)6(D7I8EqXD{f~xYEP!8w4Ci~JX4qNS`lSBIMwM5i6LaH_+Lj0zplnqP%fRcroQn+ zAlROP!uX46I{gF8PDnS>hfDgJR?N9=YmE0kDTAo|9^)Q*>=> z-1jT_v}Lw7C0tG4qR=neP+!9V_NMu{tFaw9mKHZ0V0XG2-_ZG8EB=7|4F^ zk%C2>tdA#!8xGj=2|u-V0Qr4J^BXx(9?u;KL!{%0F9y^Mh;x;YFv#- z(_UBO;YewYr%3rqolu|M9;Hq>fJdwPw0^jnI?(lN2cwOu{FeYiVi+d^ht2{3jS3xy z@O=<9ts=dQ9BI!z1p6U-{C37T%Hls~Y!G7Q&GDZyP8E({C+T1|zJM{X!SuO|(?Y~A zV@w?8sf-<_($8l+jk&TI8^YM>j6p$||2W2n6MHyg!x$UH7|j6EzkxHeR@~Un5Nlow ztuf*sA*$@%TAHl*-$^tODb4Yh7#%>O4U8Se z;W=4Ode~K7V_YXSf(N|64nimFGv|4%0<+Asr@*ZA>;pR^ebM_?fzlWKIW^5^?kI?6 z_@ey^%ufrVtM*_lCYtxD1fThWFE%U-ldLZ`;!(`S-ozUPLMge*JebOk_hfA?h*o;i zedfmL(Um@QIGQsOQ;P80o4=X9=rb)+`ZvC&y`gkpbp0xV(LsskH4=$($oZPKhCIIL zFFGW?EtKsuZxwtrB7xb=l(}uqzGy_zw1$4{Yp-V_ues=rdPXqgeck9beC-V+%@10%lJIKCxR5M7xKy+K2I$Wzk)dgye>8=@{#qArO3ew9@DO@6e$ zr@-8qXkJD*8d;4XKRT2+G_zHZnOUug+cTg`zUVwpT0ykTla7w3G`sohEzjOC`+K_& zUES$3zhReynUH6n*L;&qS?K=^UsJ+s?)@w5N+NV}Wc^CiouV0CnhCGqBRFO9I+e9x zZz5q@>|-B#SaHO@9$63#dE8(uqYduVh zBYNt4Y+?iW;jpt-V+hG`bBr%AWg-wgDg!JP5cn_*83vWO=;4Ux!!pk;D;RVz4f6tO#RqH{ZOW$DZ$p5UxttIMf;Be?@IUB z-RYuuFAQV@vi9OVi4-GIm>JoZ2xUd~9SGB8WNpjZ3rmnFbSHDer~T^-c}9wj=z0Q} z2eVqcey{8oMTWt5Q-d1=F&j-hnoWG~GxQW|P(9^nA1E$^6CeNQr@FtW+Detp@4EFn z-+WVPeq>h#_{}%}243M{L)f8t7|@$8r$)sK%+G!1&a77J4|~{YdBA<-Gk5#U4-$nn z-LP$n=6P}`2_J`IAr*fP6~7ovR&?8!JTzo?qPbpVrvVP~uJzQfnX$FFF^kdnasVeKOayu7*zdqBFCj3o*90g~s@zQ`mN_8qCR=0+@v`pgXLc5TZ@r zJ~PTn2UY|~5LL3o*tmx=x0xIA%(&Nt)%;lXOf$-1&s2a^*$>!bs8yw>hMG`U z5PjTJ&x#v1u?cO^?svh|v0zHbyI$=cpR>&`#b88s&9UlGr@7I$(ia;#vTLv&59WsY zC5f@Vm^Tp`0QVsLDI|IxmepWxJOj~{1I!5x*lBG-tf@7OuH9)ZLxmV0$D$3^^VFuu zra5!3rb#}Hs7Ja{-TYwe4PNR-u?Kw7?5x)Khahs=6Ys3qGoh~-&;weq*k?yzX3xb; z^vrS&;4)!)i%WOz|8}>U$ zeBfh+EA^S})@z~;=wB&ehjl;0$R;-itc<+a#2s*rtZP{}(8^3RMdlZjR>KUjiSLst z_aG{yxaK0|45V0oFols-#hyjgN0S;QjL}s(%hvu1#+PHh#}qF{G2i@;%=_p{7;4zV zzx&KrlwX%`ZWeD3mJs%kW<^g=l-ovE;~fyB>*)anml?){JR>|5aj(QvLgkW?GE6kP zIYX6N%5fCT8f5$yLcAN)&tkrVasBFx--QqNHGL8uidJ4H?H6Gp+xPhtbTL&e8LY+J z+_e(*ppvXlY(q=PcBbgMCOPQ3zlT2%pMnY<^NIHg@8#av-dTC(rrBAa%rsxZWWB2p zyq0!BRqHh zHCsV+Z8STQ=pTC4x}It$#lzHBc(+`c=0*@Ivi}bzxgD-~3LG{fcF?Jg98MHed^4Wu7AI zHVaMJEdIRfX-OQn6N$<;&8L81jV6F6Sp=f*%-z;KWU+P0IO`5HDw5qlv>AH+E7HbB zyvEG2aksGo&b}M0o0NiAD0X4O#{CM3FqUHe5~!b5{G%t88ehqEek?(`55`Z8+xP*+2*p2{6`51wB?gX{@ zg7RMv012w&h5Zr7AxJc*q1asW9G@AX{`*WY^BA4`0#p3p0`tLDgfL}vkb&sE9`aKV zeaN##!lyjjC4An~$@GRzo5vpwXCV6Y7S`3YH@pYBwFcbA zcTsgpU-M$YVCMd+KPQ1E;@<$?Y2Ru8Szglq_e!Ta{Bt@ANB<+>T##nn_7Mt?p4D=_ z+c4p2z{!EVJXiE#{K(LFUsTpzKng#TQLl9-%3W_^^jdd7f;vz5HL!IulZPR>>-F~f zm1qarYqZx_AYcqin>P1q&|M3cE&gwGR*&%v_9iO!&S4PQ<+DEfH?`v~hwmgMMhM7BA>frLtM|S}}V;OzM%B0VTGB`MfD@KojT~Tg*HY z7axyUijl*YuZ>WPpmV|x^0!uuuKTegxh-^$P#DeO82o%-qiAC~+t|-;V?2ztT=V}! zf874B|G9lj(WPkLxzaxF8$~|IjO z4om+yIt4Z)8xOEx%paDbWNq*Zj@HN~>|!ww3`}fTrK)efqrMZ8_5BM4p(#hYp3e0g zy|xTJ;d){t3z*wx{Y2H3qw4xliWxV)yROqwmultTlH&&!!~6%DV%@3=E?}QOOHDO9 zMp3CJ@?U6-+3~0T8>|zt1<}+Ib^}Ubs=-tvln(uev5M?ZIdFj52jJ()?@8)z@-bO~#>i^vzQ7PAv zALGA+;~!2R*1wqd=)jI`<~o{HF<)QWKHnxW!LecdoiOyviwM-(S37@Zf9&zV zu*ZhIH&rP9cn}46)g;d;k~{k#foCM8tW+d7^g)98%U*cvg?0?PN$_&_z0a<8EsH|5 z(A*5~dJaW%zaESp*DaTb(B0nkG9ocHGriBGg%0zsr>tc@GWU69DUj?+BXp+gmXA=* zL|Q2CIx$hlN+)~QvD-sKz3Z4=jc4SSpPGqu=D3>f6EWr)Y6$tFD|!CIDgm3m=usYX zgINFFiPzbnT=Q#sV`&=KOj3n^U%a$~@z~g!g{?IDuGl|N^nI=~3!+bXmVuRm=<}Xt zvedAN9W3jM$iAG=W!~r6koaY2MPBA!h_G=SqHHks_fJHWQlZ)HZd;=V=&lXTP20TB z3~)7W#tyrZVtg&4z&@4gYU06>t_NTSB#O=kb`pph@e)#;oZT-TPaL*dbJZUKVXZ0U`wYRN*sIva$ z^vJ)`pr)b9hM^vwwdURvobH`g=0BM=bOMxjvvSR*Kxbogbv&s2DX>{E*bNkwpnz}CA@XbkIeVnxyDY?rk zJ;!X=KVbCRaK?{DJFSb~VI%8KqVdl;L%^kVR z$~+^ihua-n_W$}bSKp#imeg+XC97e%mhb8-p_&AF*lBWF+83y zI2i{{%qbUGf2HJQIY*cFHn!+R>EVfgW_%svDtR4kCRW4NqhPXYjhHxs_W%UH@uGwX z_HkzWIkK4_i%BF&ohG>gByane+0xPW zP8uFv5eLol!63jU;WUJrozz|xFj&dwa+fO4&4?S33`Q~#$z%lkqIubjWFwNp2nJQ2 zj}adg%bL5Ln(S&io0^8A&W|)A7CK#Yd);6yojkTvQX;J>rbNbrIQ$l}9DjafnIj9Q zEK2zZ$-)%L!U(b)FIn8@N0vLX&?qs>4)79{6v;voWN}Lt&-syNW;sjEUy41oExN<{ zon&OXWMl*xJ>j=}QOM22ObtFEJO~gG2rm!wH|1tRfQUeN5FjED9t4O8ga-j40^vb` zh(LG{AR-VR1en}|Ooj2aMk&4Jwxr?@N-`3|=t^je3@Pi2zb7q5h-Xs1z=Lz^Q)RDz%^odmvS$_0PPeC-()yN;G@x|6tSFl%% zISl)6sE!*_C*_;ifohkhiNNClp*%-qvJ7Fp94qA?|X<}-gIar3bbMM;QP`;`6+ zWLHkxoA%s@;BZ6-TcP_7<9_b2D2}1Q$~7P;F!#c|wMRIC^J0I2r)rW(6ykVx5Se2>2xI@KHaFQ`>9k1*CLH#;O?Gm zQG|Yqwr)ozUc$Psy|K+kXui|KA4d;sNde^?%^sq~h;m8aJ|&Y#Y&S&SpXA%{@j&0} zoxZ`1ud@s((B5>Sty+i`fOR5_NStN`h`WiH2n03zFK8UL&;OR3kGLL~H&MhjgMk?5 zbZZ#94VGo7*{-dPwe}6Rzs?2C8_K6r*gW2pjwidZi8ZX@F_df_P5sZdPJ(11{}V(m z<3>ukvKSdi*&@HnD$i?t=HEF_>?(%;j5z=s>D=Yf%YSPWgl=xgYQ^K}3&qlzuc|5G zOmL$O+Y3@Yo-!#5Z+Xc(%-gZ5vUwYmCsWWoyT0dNPuBM* zS@57f%tF>1qB}dS$JuhQzrh-itn3H0FYi$G6?E4Z=&movD%15{kgN{}CUoO|Kz(nb zSlzw}J>>b%ZOQf>+g)F(^&c=uVZMwmW&2*U9M!>#_%HJGch}dm|0=udd(B6^lm6or zZZ+sCuhdm;u+oxs{4CC}Kf3ns|; zIGcftk3#Dc)Pv~|qvJ%Gi>-T6K1Rn7lra*jR*2Q|V00A*!x5|@HsZqbS;)AsluZ>?FUmAIB?(j}UV1UldxefSVrjxe**_`5dq16Q_!2Tc5Kru@O0{&aP~> zTIBNqaWY zI~8eMaexhMM&nU3AGcp9E#GM!P2EF}!?;#@(1tSIhDd>DUMkPz$$rp0R1Yp@Fn}RW za*{?)=w3q2>4&4>zx)k-rku<7`1AC|K7XtlZ?(Eb)jtli)Jq8eu-w%-Wp8b6(SnKX@oELHQ_c@B~a&%UA ze_ui+K$}lHm~qir_ILkee^;VXO*1W+q(6O^(|NR z-Q2sr?1St3_e;t4U18V9Y5hBrLZEL#BOLAH+}^W&sO|(+-I1!g3R_pLt!PWH;j_5A zI_icNXO6W3)#+*~Hdvg|vDrjTlkxfdIU>I&893!vac~7Ax+{2|-RqcE&(KXu?b#&G ztv%$28LnZMERlaUv?&oDj)i8!Cc?6R96bjXb3NTrYcM)QZ39ib#tZlnDxo4(UMcsR z#goRt2U&qwi(h1x@aSkT8&B6BhVR(OoYZ%DW);64iPF`BCgl9MN$#Hlc{zX!K45c}-ixIV|o|X*MYOpMK+H&$fJ= zJ2c;mw5M2~Z()9{%X61ZwervoK1{|g8_wtS%pIcde;t%kr62%9G}NJXna0 zxQF>*bvtNvWjC->w(8~V6CO&VOst*1uqL21Ig62J@EPL)*#%bX4B68_A@2!pAEg`{ zc9CN1(X&}RQ}9^Y`VzuHtM3Amo2XAiJb6tYhOfk42B`WvmZnp%4z)MmCuUAUk(gev z34qf+oRvp%dU5lxTSftTBohtJj$etwn^DgY?93&HSvNvA(UHxe_k7U{Jh^xtvlj9|N$I5i6rDpx!KJi< z3Wl`ZSio7^bQ-tdmDu{`eI=jC_G|)^~WJ)jZF$5Zk*d^(WFVbZ;k%_&^yW08-d$Wh(# zsQp&-AQ3sfA9L^LeAMEK@#pDTQZb8`%5a8o6M^K$!lzlEponSF(0_{Sa2h;W0Q3xd zPCRZly4|SoDcchA#tWI-Q|5UtKx(`Sd6L{E3-PAKXCr~I@WG;S9#x;0 z$~V8A&BqhDmi7-Hd}Bsa*LnG_pQHikBGCz3~6 zUL;d9hXOhthrV6Q5~z?TY_RcyZ0R7hk5+9a8s?4`a%a{%HoDzcx_NpmGyp}*CS`w5 zE?Rj!nm^K4`jRhtuBRa7Gp|y1*!aXonL;+#m87)c6xLFguk>{|t5Z`ZPslwZ5jwl+ zlcfXCpXV8RKGC8_&7ofjFcnRxt zpsYJKL)zKaJrqi8M6C?=ad)0UiOEv-X7>MYQAz_=oGRaLF-*gLBD5nWsVui5nG@Cw zB+6Sy^1Sm9lT4nuS*9d45#gCLyDH6Vz6uuhk7kz)+sgo*mTt8`JknlZJ0)?%Q)eB*$w&gR^c19K|pc;<6O`Mk*WRfrV49z!N$ zBTkZF+_kdY-))_Z#I8pm&%=S&8GZ|#H5fg>{f{>3h`1=`xWhyWSl{oqzD9a{5w+go z&+$Ce%NbJ7Mg};P4b8^}`MDme4y~iEf#eZIa+3@MY5H6y#tJ;g;DMRf+@O>Z5Y ztzw04JSlv*>?fdwIHw110{d4y=5UNgSXY2ma9qs(iH)dM9A7DH2**>wvD%S%K6$=@ zD^^+0nqPD;WwHA}Md{?AEr^bD&2Ss*b7atsu~NZ}JcO3RO=Xl0Uc^8#8Q}q4)3Ft< zo={u+We|ln0)6(l`aUmks5#Vp_>(l4MDcxXh|LS8rBsE{%u)qK4x96IFkC(0Q z*=e-;cUU|}U_ROqzF!5$!Zd^9YgSUG|e0>@_5}If|joeBnW5ebW8yj&s z0z4dt##@x7iVM`v;RzcP{UNguD|73a-43sxI zbtu;fz8F0eY=OWN$8&_QS=!C$v7U>SmUSq$VG~=d&M2$%qfoFM970WXtvCZpuD9cp zjQ#{n;C&8Z^frnGMNb8P@eqi+*R#-|wCM1L_Y>bH)<^dDH-|6AWA}+3w({?A3f{y3 z6|)N!PNRQ}XE=DI%)PYI{x|zlIue}?Td_ZpV{#own)+AzVTWY6j;Ao*^$}=r2q%em zjK@RRJFoe&!`?OQ+Kyg84-e&TO);#nIK2N}v zov51mx|&WOI|V|+`40w%Uh(CbFXWl8Sb31FUc7CxmWi0_W|u}YqJUO2O zD{?!gDD>z!Yu~e61DYGxp#ZL5mVq~O$6CXUYFRo^VW40Ne6(9)uLy`ivEhbYTQCN) z_O3qxIk>D@h0t1rI(?Dn1u#NGFy2Uo@#c#?@5w>b`YA-}i#7^?MrUnP1)!ZsHDD2z zA;5)c25lsz4+#XYBy98)Y5;ypqwHZY#Z91Cr{M8;qo+axnFMMykWHXY133ihHQ*z# zOapM=8$Hb$m_uNt28s!+(m(}))f%WF(4v7l0u&baWa`lt>vCv$QWnzxoEGuG5k}BE zTOawC>Cs>|zNyF^2ux&M!`1#0XSQ#0LVj5BEhkdo&1$SnP2*k;nJhV&jU%1bo9ebhmXeSw?s& zHIsA7drCBaeukqV^b-uwT+mznn2rf0o5f-J$U(^IgxbgHL=>-K6KmsqD*h&HBQ_51 zl@-0u{5;=8jT`VF-tF7)DK@6|HGGtS!Oh=b4fSn^18Jq<9MT@{;ddH?KOe=!hWCj8 z)9;>)4`pxg4&JAx{yV{*limJ`U2Gssd=-?|EZWTi7+)=)TzU1zI!nmHr=!3ZKn6q0 zwojG9aQ=>J2utvfzaXk?x_gMASzg)a|&M&B?8o$#OI@X7lWG~b$nEYvTN6!)WtvsM@i zR#y;vN+rOUW&2`{%2@%BNuY(4V&(u8qcj3gJe8Ng$gaclqt~S6M_x#iz3!Jugb6=0 zsqUMeqPp|IQ7$%##y85oZ|Fs8LjXz74grriCo=^4l>?rAu1mHc@3+43Tfg{S=)nRr zVNC`Z+k8pv%A-84Y%Ut@jr_h$S;Wcv0=D5 zjjT7eK=b(;mm57e9py|nv1_gi`34!JF^)nONFlDKV`NC(>nWD5ohA8Sm!;?qtBv^} z?Qft5Yp4;hg&aM$CB#0|q5GQh-}q!w=eqhgV-J)n=ZpE0@2e_?hsDHhkGSDjR1q7u z0ubyHT0glD#{Y;iVFU-^1ynA$rOgGghdgdD2EX+_SYUbkm#>nwVdwplKhaaLo@oIs zrhI+`5OqAEHkDAv0hEWs(ZnNrx`-w8fOQN6AIa_)UP-}0s9Hj?aRVV7W$zwBPKxKB z(nk=zbvEjv*Ig`(6)@ij(yuF|@bC^|t926jK&Ia#lgKpwd-R;luUNm1yM81IzmbmC z&#qunt!JfR9#fw9DYk#C!RQh3FVQ1(z03}r2SVvyC7k0ycYt(ucN;Lv)8jp#)w$0Ho;H|`Ipy@1%b0q~(@uRwMRWP-zQMSx{Cicf_wy>)^! zHKQ#-eYEPAu@=-nUh(Ng?Za97cv~7YH_c)R9v2se)7dJ(oX+UDaCOwe^oC8W2>LfJ z_ZU{FALKPdyl58BzrITWbfP~+%v}#d|GKBr3ZZi~y~2)xeZly`BLVQ7$x2|_>KSqu zYlF{x4cdsot!KoKF-`8lu*Tr^*1ylGQcaUGD-M1QBU@%kbp4}8qi|>pY_=Zc-oaGs zg{a&*?Fon?Htql{m$?z^8{lV(Zt%r0HPG8Y0s~kIvUfqotwqT2ETP(M4Uo|Z*luEc zJ#9d2;_+(#vo3pycDcu|f3C z+*}8z^j^;@&=$nXJcZU>XcF3T9SXvHAp`XVum{uvZm^hda|^lEdJ;J9quwg&{GPd6 zgkyC9gv@3=p5#Ek-)+4HCZm`gaZt&6Qx*7L1`C8%K^bWft|1yyE$@r}9?x65mx$O= z?|x@TUeK16B|S~7anLHb<5}CV#)KnlA3)q}Jw^V^-R29JeTUleyNuh`d0C&}V1{_T z*gmJ%o6FyBx!1E&%6eQ$3PW)D?$jLRnt9A9n3cFwvIrXu-(r~({tzm7w+xiMUKvp1L#fstsg8A-IIChn=sNTr#6z^Z5 zrAByb0iMDYn(cX+pJ0Nv_9HWviGN1bFylNWrp7mR;#|xAN#0^ui>>7fLRO3XWr+UR zYvf}V2m`A$JQ5M7gt21A+>BK)2Gfv>vqp$vWtQuyV+=lnS|$<5L3|mjg`0v7{X`VA z?nX|4pF!kV*lpWy?!bz-oXg$?hV|Sd!furhcIGx@6w?f*A4E&BJzBTetL#5a5?_z7 zqM*m-k7hlqHP7|*ZtE6Q6JMuB{Kwe-qd-50K;w@p+yRYykGNkcTpXs7bT0x&gD0h* zh0^0;5Ll-|jFIfaLiOmQcZ4)y-N)>;kUr0U*$<^f|Llj-`u9`R&Ib1Qe4>2I3Os{g z$hx)fJT{Kn=f$(5S+q@skX_%j}N0?Q7zUz)(rOqu(w0pODxn<=iw z$3TGNV@KgFw*9gzBO~d<)f5w-`dW`Xh7rjJ-PRM}Up)wdet!z>QhKH4geeYPEeE0K z>JaNV^qS}@WWQee3O`B*5%f_Grnl&SeFA|aOGl;3PxJN~<5LRP!ZHrJbBgu~tN@ z>=)1}PUu`AWX$JdM`dlx#Y0y-<@yxR(Bz^!xh-@ZxW$hRSX&_qv{eavD4GMWMCLkL zuX~Zmmbw~akRyK!z#C!z;@9*rxcD?|Xf7&E$Ic?+M=3d;4vEsWX=jhwt7P^18SRC& z6FrFM4ST=A>$9M>c{&$auuYaey==;XQmk%E_9`F{rV?4Y80zDq?g49$$-Uli7p~nZ0 zhs&kIMgE6DLbm*$5YGPh@zB4o@$kRM^Y3Ua)Ih2HvEZ00{{*#__5g`uU#_ElxeM5X z?aRXtCFRNK4JR#+QYS4PB5eST7U@OkKPA!vblxFFn&&Vv{iK&gq-&7d7U?`;j^nTB ze=ssQy?K;@@f*Kbv=i%B?-e*z#7#Tw*TMJF&mZTA)!2s?>Jvmz?$fYQ3+29bIOL+= zDc!^Mp!^7ytFZ>fT8q(i^$QNzAmcBNspB;jm~hpIQO1BC0pXtKk|-#7Mp%z_vtzy` zS!`VFaMlPA{`WnaX%s|9Mb%+Ie)4#ja;T`;z1H0D4yM(M2}R>E58jvQ);m z!P8aeqrE*-lx;FM;sre_jUq_$4SF#k`AEI&f${+CE1UWRhSJ2_Qq%pqZ)HQk53d z*HBek+eQt!mJ;u&)z$Hw{`{NrPGJgPm@V|{Z!_~lDNm{O=%_`MG|io&yCEX1NWp@%=R zzCr^zfBc>~A&Dy<(0Tf~8sAoVcKrl-q65A}&_0D*X9$jmCy6b&DH#YDW-}}>7h=z- zwZIIf1LYBA+!_z%!15?nV~@dekG-1RS7C?lCDH3t4ay6s+16`N~U8~ zi6HsD*-dW4)g;~3PQTKKU(KE|Pnd=>%bUBJ*^s|MH?k7euU8=j8&TN1u$}`-t>79I zHjCJYlh}p8V*cR%2td2(dICQ?N#h$ zxjbvEws?uDIzu}OM)g77q^)u^pBsI0dOAfuE_l`!yu&#%4E=RzZ zPptLK&21WM)P2%}%Un{-#NC6y>EYd+;+?rKp)RD&v;uaW>_*qqg-2r32S39wU^NWQ z_>J3r3l^1!wjMUt(4tl7I4qDq^N+(5i)Fd0X;9%1BsJ|DfawGrCMnIS)N zfd_idC#U)F?K1LXl~@Ddm-J4G_QPs?D9+n@$8UD6co4L{*us(cK|QR{jy1@5*>7-8+tWmsCCe7Jy! z4C_1QK!FB+ClbGscXF@&#)(~A?ax6T#r28c8djrvEHofCF%3;x3&U!x6RAeitWQy# zqWsUj@NymJ0o3`leDh1$n7}Vzpm(fSp;Xqj{P!^a!IeG{x!8c8L6fcPRAtl7L1mF_ zXi0#BAySut=rxQ+&-&XKq?z$U|C$|?dIFjN)1Ullx`NpAo?_H~&@bDSx2K@A=zzD* zc0;dgGVo)j(aY1UGk(kd8+QvIPnkRMz=D}4O`2p__25>SV*Ca!wtto*0hIqZmXz%{ z_JOgq91Y`+!?_6aqUHE~wQ(De?u~q#2pz?r7Pv6!w3q zvUgRwp0$Ow)eG?1RJZzhKs?*%KiX%em$&DnO?1DIGXypXJNRI=ajUCQW(4z_F6;n& z`v3Afg65vlmanvfZ|$yJRxkpKeDsU!>5K6yV_Qn&*3kL&U(a(j-VCLTd3RiJ_2QLi z>y;zfA$nVBF66D-Y@p5ES;L#b61U?9L;77=`OnU-T8OWPR=M-n6a=cmb#8BsZ+%T= zptJKJFPQ;Zq(r%f~4t1p3)cf(Fz1TU&AS>Qf7P*vuy8`5V|IfPhe2Xosnz)IFUdQ<2RtJ`!#&!q zKep>0g$AqCsokGiPqx$ks(O+l`DOGZNfHAcz{id=P@)@MAs<5TT@guUCP@I{1IBg+ zYPEEReDAymf6k=*L#5z*=Z8$nJyZ&~>5-KDS~>KcdTEcPAw~_pL42WV^pr|`bleTZ z5aR*|W`aWXz=*zMfVt%($hM@VfC=tgd=MSFXpc*1L-NDrL$HJpRWb6b7W2c`ZhS#} zL8!u@5l~+rPYNZ8a`PMKLH7mjOk*mThZ&HsnOE1IJVf$|N-Or{qu~?Wq1q*6PJcYy zF(Bk);u%RTncz?p^}TU?20Rd2;>O38gZ?r}g|HN-rJ}?%DIxhdcoCErpA2`Gm*6w# zklCmp{sM;M3*JzHpnLTBLwevwyQ`|*!EkAXTYcPnNViECTX6B1QJLqIb^mkbOy;BY z;HTGnlsmy4u7b&1$aar{H5=;>m5QAS8e_x3+Off!>gvj|_`dfdeBs)GVPQQ;$iI_- z@YsV8uv`wl7gd+}7b#fPBL+@PT{nzcX!{gGY7z5iR4yDd#z4y-y^2g;2Kg>RMr6C6<@z0gM!I zNOQ&nV?kAz=3hP&UNt-D@16zVU+{8HjVH^v=k!@5Ltf9GLWf~_X*g694owc1m-}mH z25#`PqN<+LmZwv@5j{o7X*T^B^T4xqd0@;T9UgL`9l@e zoXh2!T@?)1uyB7Fb6*Os=m%Ey7JO-izjUFfPZ3P0>Rq_rP%wau1l$V{n~0DdsiLTZ zN{68AhWv|a+>1&op@fSdIrXu6_gNGOX5?^XnJ7j@Ney*SuD;5F zg9at$kYFR&CN~Y0yA;|_nYr_XpbWz#P#K&cMiHpiGAA^RToiZ%T} zF&O2Q)z`aAtE)n_)s^lL2Og!D94m)%;gbE}E~|y-SX)$45-fsllr9LAR)?!X80sSS zvT98EjuPFo@-Lk-HGj&bvoD$D7PF>%1geeRg1RY%WKoOIuA)*Hfd&3#w;2k`Gls#9yT4?-2A5dq&6{f-mo3atu`Yi`2AOWZTc8l2U&V z>!?Hb+RVHekW|6U8B!-#QW#u;pkFQEFf)}`qtM!LDLTLJQk?z${rS67wW7gCR9Dik zR0A=&hJeDUE*+gzP08RKulYfE;k})HU2ZSB+}>n8(`6-*^gm@<@3S0eQSXBKq?3h4 zpXI53?W@NoxXamxS}@;7M^)(VJ*5m)RpH7?C$vx+9qzUZR78AW;1 z3uj$vcLzLo(bS-rTBQomqQHWxY8lPB-dWxvY}w}*cqbR+Ay?n@c1;J7Yx|>@Bx-3x zbAq|YUn#9JEL_3MyeJ#tKnBm-BGsE-jx7Gg}ty?Y{J0*8JdkrPp$Z zPKR1AafWkqm5(WuE#?{t*CFXS6aQc6^-`@z;V55^H_Ys!Su`l1#6m6EBFyOSnKgdR zPq)`@Zyi)sSKZ*Rt#+dsVSmzo$g071)VkMNYV{|MJ6osvNBKFhEVHZpaAVo_Zf^*S z&fpMtp;8p3)%57F1`!vPs~LYKT*O*6cgd3FijrEYAWBTSh#11~tdc&~7@Gy57e7nt z=Z=i+2oKg?W3Q~jkUgH^vuO*Dc_!)jm18$Z)m0X#MSI{#+WxV&1I~PxRJ*}G*U}P;`CW^nHWw>jR+*cWqs$ZW25_cm5?aXL$<> zM2R5hKI&BqYMLpE1u~z%#9e|xkJX(Uo~z!$tx_e3oY<+DPLrOyn%l5{5a!U8D@kWB z4S$eSv>rH@n!WNVW^F0HS$^+_AJf60!Cz(a`WWnep%n~Wb z^*jF|JX{WfkHTe%L@VO%TN8=x2#aHh#2$pJ5T^A9!HPt}jW8WyHbOVTLWHXj)*x&_ zxC~+8ZHdGxgf$5HNrz^H9SHXzv=AE2_?|I#_tO!MWOzHuLzsz>=g4vpRv;`!SdXv< z;Yx(Y9VicBI>HWwZiE)XOoaSBfEI)!5q2WXM7Rf`58f2$vzOxigViO+3O@ zhQCZCIuU063gzI5b0NZ!2#uAAL=HmtU5P|7!c2s92y^aEBwCn`ry-pPI}xU(AsvrT z+z1O1W+U8#a1O#8JkO~ijIbGD2OcxPJ|Quma&8gv$^Xe* zc&jT1VGdq}n}e_rZ+F!rtVg&KVI~g7v?5%Ea67`{b&wy9FBz?<7h&-R$Q@xi-iB{R z*nzNxa2x7HShETBxzH|zBN5iLqdtV0Tfi^z2$vCl5&Dd<_$Blg!p@h`UkICDLp$-5 zEOQ&`Ls;_$@*(8!?=};^9r}u}{w?SU!kl*?ADkO%{wMkuVduMO7sDN(M_B(p_(N#? z8}dMyV?ho$Ysl*;6&NWu%rH{w(o>EbIw-9fkG_aM9`~}wMB){|_C@@;xN~m7H|#Km z?Th#V+!ZF;Y9kR6UxvFG_^XJ|<(F&~{zin`fycA$-iS;pd!_zd80U_B`P7A>z3@Xf$`h<-#9T6l>FD37!;9I)axwiw069pP{zrS4r}~DE zyrp06aCb!H-5-k9iuALXL+c0g9S{6=;P(=L`SO0Z^pB-R222~y@xgSy*0lz6(=AL# zzFShKP?A%J*C;v8LwW}0Cd$aZ*ya%MnZWa%BQ1aLaCh$ToJjv$&<{e&^6zE&n9KMR z5L!=S{g(HKo~%e^na?vFa~P*E`#KkqH-K*eexNRY^6-(9hr1^a&saVn)_+C6+fs9f zXWlY!%JA&S|3}`NKuJ+#@1q&nOI22N7Y)4>0zyNxNz>3QvI+vCEV7BH2*|$5DxfGL zwjzrP2(GAz?FyrU?T(60yCW*ojx!G9sMF)P;HV5PD2$H0@4GiLtGg`x`G4>C&Uxp& zI;T7Gi+dyPjhnG$L}cF3h}Z~C*%m=oI@&wNwq1;Zoz}TSV)da}-&pJZDD;YqRq1Py zwftC)lfYjeW8YsGGk7iPF^)oviyef7^*$f3sneH`=+p!Xwvq?Ul`-bDOv#BXE#;8p1>GR}xCU?%}c`j?=O z#+dx~W6-l;$od$gUpWT7E$F*Jzxx>UA)t@G1#>LYr5>H-n^)w|0eu_jGgHu6uC<^a z2K@rk`)g9h-;4N(m@{;#5#JowyAZzy@i(%{3|^JFA~Z2pZfN{<>CB5imiuE~V=nPm zMx44LV~Sd370e;@bj(pIL4S?(!RyjiWt_J*eMRQ!u?6d0rf&}V0?aw2{hhitZE9?R zHU-eAUw_bfw&YX6mL3;>_1FW?=7IA+PbH9{ApkQwI8cMu0vjwxCx3(jW9H(B~Y3K9%|7B;2v+SAo6& z^x4Nqe=q2jpdU;A%b@3A4tK2lKL&jw=+kZfE8MeU6M2mv%a@KhVg=|@uP5Q=q7(AR zRVhE{eK0pXR{H*+ZvcG4I$RzvT3p(eb?~y*1LnX(6;p~#M{|CJSbJSzy|1s#Ln6pkfM*iuT<8p56moHg< zbI_}fkzVRQ=!L&Kdh}f8kHidEu5pN;iTGpXyA1T5px?&?Qtt+%{Ss)q+6?-@2aX=S zhY>CR3}Xi4JM+)Z?d6-A7$>fCPxVI_w5`6eZUbT!?uyW= zOdW5SOww`vbRg#Vx7TWy$>Y*sj!PKAC7G1>UZktQv%n~(!#J}F^Cc*HMr_22&~@zl z@T0xo1mAunPe&djCCZ0tuWPWy@L;EjAd==s^ zk$#)ynG~xwEK9=vmEhY&K9t+`v!~I9)Z=5& zC*s+r2lXEit6~LVKlu~l*WeQvC)jeWcL&GnuS-L@Fyh-@a&7t`+)TA!+br_5 z$H%HMvaWME%mUI*LqOlZ>*&!3X#%Mim_O*u!><=*A>UGVhCuzVLOMQEZN#MR54cgz64+WSMbry!0tn7@=>uW zvo3uFI!ViymyP}y&uphKWv%+gdmwC*-$~%xwEO5$d2Lk2-}7Q4Y7f7{Hx+z**889G zTMNF?ZyY^(`me~PogW8Z*_%g?er?Mu?QcEr8`=^qtqre#teec*RAJijOQajP7yTsD zox^c{MdsS{;jv1y-eta7cy`_WhoeV1Kjr;HJ+FQDDo;t=J=^e@u0PV{yo35>)9HLu zr<$jVM$#u#HPzHeq4jAQ($#<0&Y#&HGe)7V@#YGP{KKJ9`S~%)*pFwC`0HOsLm!W_ z7^38Nk;SYs{FSo+_`x*t+q79jZN<1BHX}P-aJJ!WEq|FBI2YRsbS?6`-R6&`B|ppV z_(iIItx)1w1^MH83x9bUIJSB@af=VP(F;F5Y%zv3`5m;O&BpQN{cNWTyH8LC*lj+q ze7OfL?%!JJN0R6o`~RW;uNJ0MX0N?}AKLJM4S%*_>_ko0*oN(F*xQD~Y&hPA{1P31 z%Wb&chFfg7!-mh>aIXzNwBZ38{%pgTOxhi%u?^eVu(u6|*>JoK=h<+%4cFUniw$?! z@Oc~Vwc&?0JYd70Z5ZpS@-)Y-hvXHXLTd@iv@i!{s(yZ^JD%++oA#ZMfHlAKLJM4S%*_th<$O!*(|8 zZNp(U9B;#UHe7DQ^)}pM!yPt!-iCW^_@NCC*zji?#(G%!Hf(3Z-ZmU&!|^tpXT#+- zTyMiIHr!#u=WV#xh9BDSfDM1PVXUW>Z^L#rEPbO;2nS!$&>3*bDLo2X4;XgV35A{8 zb!gYIuw!Xymku2|oLJa;!9tu9l%1;+3S0M|HhC6yt;o}%q+Zww!S(Wul+=`^n^f-m(QjTgmTw{MY=dZGKmr6R^~}Q2y8O=&t+= zWbwjrK2=zYm*6D)xz6y1eg4O6f8~!eciC~s$H^Hyg#pcVsNac@S%KQl(?4>eY%gfPOwiw3f)DXFjwDzu$eipg0kom97&uz zVaX&M()|cH5GW^LY95tw@^K%MMW2mLV{Ex5q}vE*YzpSYS;z^nSpR7k&6+Z;zrVZd z+=Udg7U{83ee1&c4pH_L1`cjb#$j=XUn18iXA~}Z8bgnAIBx(Zt0$I$tmN~gPQ6~o zV8-^}FPNtuiy1j5oh)@8JQgo9PUihDczJv%xVim%2RDSL(I#MLPxgSFRVfI1Po0-R zntI{f1ry|y`us&s_~aTDa@xF$W-XjQkB3^F*&rldAaNcI;8}9U)%g|?IHEFtiPq(5 z!P_3I`ux&ZHSVQk+@&M$xj$|-VEoK{oLOl`?s7FjbQCu&VQ)WAO%EMePHt&YXeA$h_uG`hdg2$vQ zjjU&mbgmfnn{vg;PN(3kUu8w(_g`dN^Xr`G$$ie)+5c0XY`^_*I?E~hbyj2=ux4U5 zn6f8CtDt>WAB!&U(>X_uMP_o?Z0YD@XHP@@cr3cSbmz=H_ZZ1R9_0M}*i_b+GsYY< z@hSbCmyS)P;xoqjjW5+nT<2|&?O<8!Agq%HmqF)44I{;gMz9;!(4v%sz!jn4Ienk#sQCNuO{G)yO!?zMMDBzRmZqUt`u6{x(hg zmHcG*ZZQd+u(b6Flcw?@{2V!4>#RilF)H1>sr{hNZ0DcHVo@XMOMeeet~upjAg=&A z?iB6$rGG>mPLMh~5tmY6&@KPsSlgJXr~vclO`kR6!iCdh+U0CRRLWci*`x7Gr#a_N z`z23}N#3kQoTiOfIBoi@i_hkJl+O0)c&@-{M*A+2bN&pOzw0SOnYQA^+-qh9wJ~vC z6W`IdNqK70`T2aE&I!14_OGhppAmHKoAXP)niEO6dF+JH6^xzx+jxIr%3kw+TS9gS z-~L8kw$b0sKSsWsD?2wYKs~@aV$OD4OykANjKL9IOzQr|IKBJ^m*->XI(w)S#)D|> zskYM?QFABpeKR~#;UqR5SMiAs{J9PvmDk|e<5MhDp`PKrh)D})EOG|pc@u}w=S{%- z;Ke<0Jrj=tI3T;wS(Nl>#d<+w51NYS3Z9T$XdeJ4bXc$mr*NlC=wSPp4tUiK8C(Eq z_OSC}9<~={){8Q{N36rnR3m zcWRf;C8W2XvgpG0Qx-0s)$YvSnz%;3OzmLNrLgarg&o^<=<1lV4ls=C{;?6SfgxOUfi*t>m~3kPZ8(5(#-nDECD1a9cU<_OY5TO=~`Q;E#TE(Cvi z24?9 zu7&kI?qP-UEG+a|w*btyu(fw{0bqfJrCzT%VBErPUc)AU^)2k41f1l)#zZ@*==ywnPiO*Qs+$3m1F0!#ttZ zW``8;V(-69+t&1>p^D0k_emjei5VgIO5^ROBJIo=_QqERg(g7A+Kh7)Fis zMEX!z|5q}CcQO=aw&A~`^!39|4w6KxVdF5q@gO%ZIu19_N9oZwQ9;5Elek6U=nD-K zD96eAC=2;jgqMbpSLjJvGCBq|E%cNc)rl4$b!eyBG#q`M)nb=ck{l=!M}kn8l_{H= z(Hyatalu$BCb4CHY_a3ID5qCPGC0@>mvyDC?u0eG0vg*5fg#e0C3eGTr;*nEczFq0 zO5_C0=p1(-nn$F~TgWplJ$(>>+X01-6#tzu;q;CG?vu=GUr-eOm`x4U*yG9Co+%c z)#}c1BJ-KK<1+Wig1cE3Iw*)NDuA3&xDo!>nS==AZp=jVMI{p5iP0MnVd~Y7+{zR2aR9YP|BE zpw`jTQQ;%69THR;y$Du_?8!lOa*Mh}yOH*0v7kOten&g8%%U7RE~Uhs=!SqT7v#7^7%x8~cf=zk;Pnn8jO8}Aw3m~=BsaGC2(Zvh-K z>jkfIy`Ho{#5^o`gX_hZU6%Qi;7zVq1~W!t=7`{O*PG4TUe`20@z8C$-cQYebIr+u zD_pN@A#lE#DtM>s^#b-2 z+|=YBM|st*S4>=FdI;X{dhb(yOEXsRLFmuh-P)81KJ0qWG5d-`}(q zyf4iw2V>+kbB5sRG_NJ|8)W7Q-k;`uM|+=ct`mGP&AX0xsHqTqIL#YOJi@#yxGde< zk7-WiOv4jH7&g#d&kor=b90MH>G>m(Z1u%Qo-fv-eBSh=3c?u(!H~g zab&XDBe){nJA?IOn)y!fPM$pjo@pARhNl%(rhA82pJto>f_JBT8(G)qnR$Y%(!FNH z7nn_g_oaL9BBRJ+^St2dbnhzayTt4lyg%Iw6E8LO(7&Vpr+a?`A#$1NCirl=w~pm0 zGm{0EWq9etE6iHKYcjkid4E@#M+I-l@J6#eTy5SLyeY%G8`F%)T9b((Dy^tI!|TrW zah+)^cw2_|H9M*6&Dnx0GQ10kZ!%?qcV>8{yx*J5{emkqyy3Wr+-|A_@6Pc40YQ;1 z=0Ad~GQ3{w*zPioaNE*~_GNer*FwbCdBl7rcul6akM;dAlZ`$mt!P80H-q>02~#3?Q>HhH zec)4uBLT{v=}kkz$kS%7;BA@SQri1jvrceDruQuKf6i=j&@=`~|{ zUo`&~ygSny#`g5G$$^@v|C!!{tWU3+4ubb(dKtvK%}Bx3nO-67zsD>Ryg$>sjPl+z zHwr$O>7D8V?=?>dKAh>*Zv|Xs-W6OH^185nz2o_X!p7) zY_l)+hN{Y<_F1dTgcnP`}ud%2;FR2QANmGL;MfZSMbh|cONbyADhX7 zD?{F3JOM;LHLC^hhJ4ny{pKOTRUvO7@fYST!TUnqHrDU2%r}CoL*5YLf15aN6T1J9 zcMdwr$Ty~&;DaIWZQAoYbDrSCAuksfk?+lwg3H2QE8g!T<{rUo!X7^(9Qo1g7Q7+s zH7EYB`AYDnus0hwD&n{?R6E@Nus4zRb=^*aw}rjK1~}avEx01=(a%vNDZacx%Veh}pKi@rF z@cyv(Pue@~&Jlbt?A=9toV!l&;jlNH?V*voPV2wtoy7j7vAbR9Ydmi*wB4SAsWr-fX6C?q;JJq5Phg2Sp<--4emuJdelwBdy(`f-5}l5GNmP+_{2xdR`jS zw{_PEuJpVr^0#xh3*PN{xvXCu+`WRUJg*1aQz!S|g7S|%To&UWykNN{ZOr?w!2SodDNT0{&ueWt>A4@Z-oOq-=!-awEw7A&ik{_ zZ6|nV)T4i<$YOVt;L51?SEj$nT`G8Y)NA4aU+k6(u8MkFapNOP-B$(gi+V$%z{}h( z1y@JCAK2e5ck8v4@<+YPx4JA=d2#lqH@j;ES7v$7v%YO|9~Hbi%X3+pY8E(cY)x8S>6KXf1i7o;KNy7XWDD4`q7miY)$@Nzu@wi$BAO( zZ|+pV+hSgJUEmMg%LP}&yw{li@9u4acg7rdC=0anM^wX5*r4#ayI3P}5#~jo$RpR` z+LPzbaiI@To4NSK=|v294t*@J&?}4qPPNq5 z-koe9(?jVU$z1A<=l!2)nY%gphEMKXJ1XEm=(q$GA{3@l`G&7=|G}pfJcCM(N+OV|h13jr^T}69vL1k?K_Nv!Do!S`vF01{@tIgt zQKtfCRKRr!WZglS7(Kfd6G&$ZiG0`AA{CGu^b3T}{P`qZBY$e+=f6>yXr?y;rd&<` zWI*~NAc=l774m;u=w#;ex8#r5uMrzJeCYOLLb#3_K6k4QHu-Ug&>O@@V5_uB;8S>lBzF`!UM6(r!3S@pTQl7ekT^|DkmNShN7|hM z!{J{t6fh1c z?hY3^s|ug?YlxDHY;8PWm{@Es0o2HZ=~%WK0|u@MBr*79dm>=sLP0W zki_5jBqoYFKVaZWL=uB9>e_&b%M-~= zR#b&BaYc}87D-GL_2+YhmKLDHmCim?)|M z(fNi9Ty;re@I`eEn79;^%w$E46DBUfaD66;iK4Cu7`R}Q#Ndm%J7D4}PBN1f^_nno z?UzeCNlX;=Wx&9-o+JieR5nQYhPiM7D4EHM>IhO?R)mrmDCQg?a(O6;=!;k^3|uct zX0X}c1dUe912doLrns$!R4Y z5KeYBT((QaNy+s=)7bzQ^HOp7l6wc7T;@y3X(i7TPIfI^08GV6$=3&5Toz2l7dXJLg#Gbt(5e~gwBrQtCaM2gwBSVji;0vg|hj7D|9xx zl9cpZ#A>DIBhfF@cM>`)@Z6O2Glk9yv@Rumkosc9T;vC2CgC}GthQmcorlbtGG0*Otl8c_X7s56(=$HHT%B-Q{NO! zwqiE}Dc{g~TvblWiLGcrz`$kZBnDs9%z%k&&&fBh>?9_NIv&wFx#i+^5`$l=-T@O=ypx%%s42q4y1`}eBqoYl z6EJXHJc+><^}B$Hi{;5oRuoSz=-ibn=t)cz^=-hwCG{i*UsN7QnhV$2lbNij?!v_S z%Ek92CW;y#FmN?KiNP0jdBF5i3MMP+USVR*=em7TP89Wez`%w4BnDs9zXB$%?k6)@ zQFTCy8!q=JF;GlrA#&|MiRg6uR{PDd~%ZF8zN>`VELh|Nl!` z(Ekeqw=0qg=Pw`qNf@|)k<8%t|H8lxjbsLz4R^T!B=r9&82tWU7`Ww;oP*#03j_B+ zk{SH|Ul_P4lFZ=u|H8msl4J(I{|71GG){M%?*k^evde@&AvVGSg~IO(E91GVqWLi) zNFhYz8>Ty{7O8*`bXLSrxEVm)aLXl;xPXa38;DrdgIh34w@W=!g+##Jml{cJ=9eQj zZnzUugJ#p-DQT%QcV?8%b5oG`tdQ0MaFa$!WRztnznZ)&Oq^M9=SG>Bq`;czN6_Pj zyEsWSKZAxK<(tk(!mXWz6ew_#kWL1PyF9f>=Ll&qNZjzLMOrANvq0kBPc70qAx#8{ z+d#EQ+k`Y5B<={+BE2M}i$LP$P%YAjLb?JZ?i1A_9T5`m0Jn^k#8UcqJP)z?W*GkS zPw6bGPiG@SM<`s2@t=Rn#ZvoRTJgpR*KPREKjoqUd@eSpP`FIED)FCx%0*lFTx?UJ z@cqK|DgN_Mxo8%jiw!Fjep9%z+T!aQ_){)g$me3~3WdKBu8!c~pK{SyJ{Ox9p8r6L z8*XeVM_{D_+sbh7AQlpXS%xxU;9i(Ah;hVLmf}V z65AxWXeDrcC|ummQ!X_SZm{$O1vC}7(m{_KZt^LYSSgVg?FFtj!o{sWY3xfnn1|5r@&sCD(FF}GNGn0S>A25No)TeN%la>&+A+_N0EF{oY<7|*3JkS~n?+^I7O`6~b zsXih!EAE&oiK7TeodVL7fW#}1W+4cLd7w2E9)|0<;r^+n=16Pn8f%@c;ui`RcU4nz z9YVIq>vqudLb)xU%DW^`ybt)ygz79~2dj#b~ zS0IBrJvRxeAN|P#>a|2rqv)!-K)tUNR2UtDJ<~dU#tUj5&4#t=^iv6~qq8!B2J8@8 zX|z2#Pyf51Zc#DK(0>W)6TK5t?K-0)Ql5d)i*Up0oU3SbbU1kGj8QZ*`Uh;v)S1EJ z;MBB}O{=^DASHM8rGh{ExD{W}xe=@SczpGM?{hnT^Ryuswh4B6PRteKTT0;k)ra zZg${*0d4Js7eN0_^%@*POq3t2tJj)ISx4IwwPh9KOC5g%U%mEB!49e1FX z<4}ol!t|m%Ft-^$n-skQ6ZPC8y_HThjBIk7D@u=!K!wO{A?7LyH<-2X0w=en(z2p| zhKSr&igKc@a4U0LE6R)h6=ldhK~eqaQ&?xsZKJ4BbO@?dZgD@T#-sTkW1}&*?T><* zMTeuEt@y0{)tJ5AR-+NKbwy{2m&ZA{KmMQx%pvw%80?lN6z^e`%QZbzkc zi*o-bx09CPr0CpSpw6%vIQux^4oEm6ciSUfun9Z`AFIgyor-fBOkK1vK4zxH=)zWyM*y>5o!hQeBPx> zD{X+6{G7aHiaJO4p;7p#Tl5ALB=0ic_761&T0Ty4=@YGw{w?ovremFqauqVKOyP|t zdJXfrLg6OU03S7R@~-5O7@T@E(E+HXc`N21C%!8cJp(s2@2W5=InKP9XgSla3M6|tKzsPUdTZG$h&%hLN|Ihsn@7h z``u_=^lfi&C}4qylw>gFDh>DMH;x4g!vhw#(QyXb_a7!Kkvg7l7^otYC;p6f27gI=B&c+nc^R5GCq>)c(X8un7-+f$H6{~ z!*>?@Y6!V&f;{@9YaWe%2GR6MC&i3v9AS=q(wU<R~u+yTpu&k11K$LgbjB4=`x;!%| z%9`)AG;J`{nEPU;!sZ~oA1L2KIew9;NW|Y8qxfP}f>u(%`(w;{7;sa`d~1xEUq!qe zL%R80jEi>906VSCTvSD~rjGQ8h>+e7A#O}d^E`TE(>KTTVV8*CUu^gRlJW~rD!xw+ z#ph$d!_Dqdgd~sT$O2NeW&h5G$djLX(!20*4wbAzszSCxQ<1}F_^sx0nnBEs^&}VP z6p`)Z*$}z#^G}+~_4Sxb0eY`ODe4XNSk&&os1oPkzbVd@Gd6`b^%5J70}DSHrA26y z%Oc!}IK2UFb6LOCnkBguv4>eUH*=0dmOtj2GMmknHiT0A+EkOdi)J|HKe>k}`7H2v zLXT$(^UMazcYT7NpQKX$CV7^>nPCrP=H*ITDYv{g^ha*^eFYWXKq6InuBhAsV`3o( zVly|F4de>qqhJPR5k3HJDs^hU;O?kUTC4?9togvO)ZdGc;+=YOhOpd~j+?_y~VFG>zYNTE5rBsrW$+yQd| z^HMz)WEOL5W}a@0n8#JIDx2HCY`7LI{DhWf`>15gZ|rKek4d(lF`MRQ4~7hLUp;fs zCjBX)7(c9~Iou;TM9^_-4);n9CB&lGy`tC%U?>*BxpR@j`{uZr`ri{IHT zyax9en2S7>z$Zw@wK~pcucp&EV62I=8Z^QsM9_VWc`z>ZvyaVsstu=sh2JMr5f6xn zI}lgM>5q9J{sD5RWH!ys>?VkLE^Zdsq|0mwOY?(fMHkI=%r42`pFsw@B!f(J>*$Z` zuwUAP=5G_W9e`;3P5}9$K7K`dU7FTp#1-MgXc%*)KX{N>?5TJ!vGf;;mBDue6ODE^j)LUE`a%>>4M6t}}yGpvugkCrtA=Dwb(lPdd3$tIl{E{tiiw1Zp*r z`u#oPw0;*#{celLv%(3`#S}{Yo(!y=V5@puMk?my%e1b?=}Fqg^2;IeVl*lxVs7|uXM z;a6hAPr-68^3-N}r3{>nVHhpO3K=>_5p(OytcY?cc?mG)N?&GRD7(SVmH2r$ohw~0 zdbNezLYC#zd{L~_%4<1D#5=bkkBj>u-vh0|^hrKj;5(Eft>}|{w!!a#rEH%GJQ;1E zsTT*k;x)j=lN>TgUd@;H2%yF`R$&9!+#cxweivrTzjU$TN!t|zP!5sqo zH0{Z0OsfLw$oCA?C?tweJjMKqpT*5g4(^k=GuKQ5_XaEco*@AEWz@%6>i&NH+9IvD z7vi*jZOP@7Vij-^yWTC*n0by?$6dw6xWziomgiE$YGRq!+$D{-3b@tzYy)@avir|O z0ZKo$dVFKU7R}iVcjTUc3|im}k$?S5#*wXr$j@!Gc!8bT4jJ8%?s)S&EqPlmUwm>Z zYzd#RA?^`}K5a<1X*UH;w4k?1L01AxL2r|SZX;PH7>eHjMxE=7x@FQbO{LBF)uD*S z?*PdBjukrc(a6p+ntn%>2O#Q1nHnGB1Lb9ao#mn72hMmO1MG4G?wL8l{4nG!LkqtP zgP$3aYZlmSAGaZD4?i=h78xM5=Urr=78xkDC#xywtmcDcI@%tvkf*cFV8Is?A9a9F z&!vTUrmE@9EYMJy&X&ShP~cOvY4drmskDOslu&>lwbW5_ztqp^OwrPGH$1(!`ggDjt6Bz-U6!}VgR*y#M2Q0T~e?8u&YXMt~5{(37&{%9B zZMr_>m03wI+HeQh`Eg8@I8_F#&k&~)r^#T&C)yKer5RC5D3*EE%qXW*X&Wmp*PA{s z`moIs5;szQ{isZUs%-SdXRw4AFOVC*uBj5^B5^w6RAO8tK1>|vjgHGg+tR{DgIs>OCB;YT}Fi?1TAe4iptwfHK+ z_R=2Xvug2Ggv+HPfmMrtN2tZ^z+(A>5!&SkK-J>wh}uT9s3?RMZ>Sa%t@IXWsum^C zkY55-E%t~O(-Egy>=7*V4)~=QB zWER>iA@QLIBtDWU^6ksCjKsuFjI#7^jbRbqumTm~!>AFUzru_TF4XRb|1 zd>w7q+@3BHD{XX#v$TwNA~$|RRVCggt33MxiMOS*2L1>v{nKsf?6DiS^{u)&-7hD~ zb$%F9R;iReHusBc*cVCo-Bp#cQlxOJUdy#oq}%~4QdWwTNOe{>u6~*|vW~^A zbo61bp}LzEt|_yU@^QWhtZ#y5{vgQFK$EJ-r|GHi)UjBZ#r0fcsWY@D97E!F;i$udBlbl$ev%P)zU7M zrL4~pr=?vaOIaODfj{H0vM9#ecowi0_rjRpQApdlC`M~+0a^Rh8)BQS7-(>$J~H?q z%Q)w%onN!zXJF?iZdHT#vuN+a4!#EOXVKoXh=-u#Fz;tkgSEt+*hwq?Gx5XJP;ujq zwl#m4MUDCbs=|NI@)d5{koK<@`V!DpC&aGprENg6>DtS1eg{lPuhg zb52-@XLCjROxC@QPP;J5v^1yD*3mk~&$I{c8-5#+5x+C6nMWk^ZxGjJ5m$n9>d2x# z9^IkiCk>Frzhh!3+44m4MK+tBUGO1GX2WT~0jZ{o5Tz=9E!f?-7@15*B6HYU+a^9| zA|mm-87Z2c;p_5)=+d|=`czCwk4Q0f0r)?4SZ9}lqHBLY)?uBl0M^OZPm=Oe;I8;a zzGK?tygWfA=H%(9Gr24hRHtU<390?6)CjB0E*thk5`Ontt#FPgbsgeVsnMd; zqr{@rXi@6V6eFe>Q(LLAqEr;m8=}-WQHt(FRH^f7D#ed4neM7orB$ZwWVO^(B;hBf zRjIC`)FX&frMihyeQz&zm7G)@r%IJt zWp20ODkR~@tW~MFDD@8FRH^!+)c3@qRDDtExL&?e4QeaZP?Q=DvRJB-D7BE>a{G?2 zsnjhP=*$sM>QuQ^rp^?#)HWo!VwA7c5Ap%WLx@wQ4ts2S^?UnD9rif$?Fp=w`j1zu zPW|X{B76bJqSQ|woBWOB7N!2{)u>Yknn9_*s!};tnPoQIgCqrK`AYpol!~A1E45FQ z>Om})+9yh#2dqlHS6ivSiBdO!EK0pENVau2Ri?$eXXJu>`W zLgHua=jv;@bF8H2Z8#3OWuD_p%oB+>Ax#Z1!lVKX}g^;PVQRi{M!jC&-{I0r|`S&5->!%T?8dQeZD&8lqhYM2~;&Q-I zV6A{JhO||TlN<3;h*e>1e^8~uy&Te3P{vWVDi`UuhUE57w8CGs;k`)0ueYlb_lXi; zBTkjLUzEr@6~mzPq}xPjS751tzZ0n{@c}DQrUs)6Ao1#usj^ZYm?0&0<{>4&1+UUp zi?pqXQ)z2N+8$yl@){}fSHN22YiyB+NRh7<;YFwUMP6$aILNv4^*K;rPRLYP!9!=N z0&~F5kIkzB=ZgaOAx;&TEeh-=76oRD0$)&s6n}0lo6i#k1`O~Om|xT81GAvO8EW$p zR`_E!+<+wfq`fLJT$K0#ajL`!QGzS{YV(mIv$k^4Vpo+|X(hFs zrNthD)cj1oN<2~RjyRRrMePo(61$1SuYg5j_Zkv=)RfrqI7mERC6-!AH`uT_YA3(E zuM!)I#0wCo5*vxc8-Z0~W0Ck2ut;oDLtDaKXayNBXB|4>saB0QK8L;EGT=6{7CR+JS6|DQ>HK?3PBWVi`nP|ue|$e% zr?WOXd#;Lk99htJf{J-Bo1N^JftbH#Q%oH^6v{pMK#mzf=|9Dg#V{@sTr@3_m z=a}>S+`f{9hS`Wyr4PtL!)wGcXE@+;B9k-RuK@>TrC<(lE7_w~d^a(lalRJvKEPsG zcl^fXLH}q zr;D2)(Z8ZnkxDK1feSR%ZlwAdV~E=6V|h5f1kW9|E=RdEzM0P<)bvw%82&xU@&x}` zl;;C~ApS!`$k;FR_9KDik^OVQGk|qb=L^9Vz)inlN3Hl&Ok0~y&JOTa;#So8ODSll zQAjU^QhYXW(<8W_mc9YF&0?IiIv{1{I&rJT7mXlh$@YL;d?^Q}e@EpI+Qy3I#Ya(k z^R=jhxzqBdvZ{40J9?93;H&jdqK;IWiRO4Y|h1= zBo?bHK1w{ABmQ^7-xY(qTJ?LW-S-pA=8xihjE1`T^FuZ_e=Z*HUd4HC7SJ7S;|a#V%lJ(iK8(AsRm-*U&aC0&Q2=dt$ZR zbfIdSfvzrplCSL*qU|)qskT>&wl4sy^s6Mx!@$MT5>{q2t-EoC2wzo0_-YlN-4kM3 zfJgRS*+Is`Q0AW@Q*IR)b&)F47roX>FzV*?MOj1Iv<^D$JB$%OP5=Hw%M>)_VcdE)FGwf zQZ~~^IEL)e!;#L#s{e&Hd>Wa$Q~YwgE(_XUBTf%TzAlF&Tk%fu;IVlfGtzo^w1Nq29@gib5?Wvg7)gzhh zh5tKZ(L!-AWUuR$9n$<&Zk@_@6#lf0yDrx!n9gbX{8+IZT9;-(Vnvz^s1D4--?KJc zg)GNR^^LJZwEjKf^rr4eZfbM3s3{(~Cb0#l~V(L>8J z@0(*}-q+0RjUxF_Jb(TTO5Gk%+X%I#xf*sbPv#rm4gO}7N#G1d zap;Xn`{5_#kkAUm=^>#f&S!f)zXl81LlG*Ed9*+(`vR+Y!Yj&lwb+)0|Tkt{(whBvr(PukQus;P` zw-uV(5F48B3+li!$wDu)yhct=Hk%o5lT`dH#k>)M z)AVrHH9pQ|{ou5Eo*v>WwDsZ<8}5Ul_k&q0_*|*rE%3mj#-DF1boKHQ*2IZW%q&c* zeVf9FEYaL6ZLUXFYZ0zMPV`BpxwnYdEc1^qB&|h(@G{G15 zlV>1pJwCa7d9idj?Jc|Qok}IQmdH(Y?_hPWTqbvX)GAeJrVUNc{KueK4a*8!nI&)V z+4|(aSDQ`lQ43qZ6K!aQC0V6cGZf&DdD14GH7dH()f(c^utVo;YL&P1ctbx%oLc4W zyzyY`gJ%qBAMXjALWpLh=pi6A(ckjaL?hHhf6Mb%{_m@lY-pXNV*MM0^k-a&z#`D1XwDlZC9%_Z#WRKu%#OVa!b}x)l-$^Xb`?t#;!HdL4k>1?yamhA{ zdA*eL4%rkqg;2_|Metf+-7LFP_7L_H%M7<%=#4R{)+PN{y%*N1T9~pdX$b)XJ(FWK zeQUjv&Idak?WxA6iN^OJPBk7N8n?haST!CX8V@9vlQIK5-nXZSWxA%A^I@H?Deg)v z(>2BOfTe_kMB}Z5Qo_N4(=PE#c)FBuA+b#9h6sHxu$J&D?+jZE+?R}cC}F1Fmns{b zyFp7C#}t|_0=1OsQpypC(^6(gDQ_i~`;sB0+(j(+B}48@2BwXoH9S2a*ItC8by)B! zV7(8X;E#x9T_z%>Xoo4DYF+BReVx58&CK(xU@z;IL!s4n_C_U7MG`tIv~5bZ9PU7z zYW-4}wdqr0(fXw@+mwgdoofA(d=h3PuxR~?Y(ZQ@C|bWN_#I%?`ZdArQN>m3-C?$> zOMzAE1L2ldE!cWfBWS$}2WxQm7uaauL*FAv0#}Jv>nml=Ycl2`+7qmhHLnMWMeCKa z=EZr6Xt`R}w0f2KTCNd%E3o!fSG(F<9bB$jUL$K>AAzomUf0T^S8t5u`eN2vIUutb zSWEGNd)xJDT<4^{G3@B9AB7?qbJCjT0M}WNSqQK}L9bitV2aw*aCOFbX(QeQ4ZmKK z&{HI$`}omu+=E1PsUMw#5ib!v(MIeJ0pGy~bi~f|W3R*Q zFdy-u7O@L#taDW_40q0a6e27R@5~n%78l$g898Tf)-bm&nEt=(G|^pn0*;JtWUH#} zKk@&sP7?>>cDh9qeW!`)?(hE{r-`iOHJv6-75u;FG*O)}K9uA%kzGp)cZm@Q|KD<# zNE=#riE2*YU7}hu{0n!9b&;TkyF?ly_6KP{p)eJb*F={3vHy$i5?@1}wcREDl`*y4 zB~q@d?h?PpWhhLiiM8A%enAd(mnfIFc`)(Wa;feT(W}I&hcRS#ZK#;#qm6 zmj&(;|06izF0nbL#`uax;4X2n;Do!x#e&NNcZpjBC)_2zEI8pV@qpljyTtm(GylrK zU1D#+33rJz1t;7kUN1P|E^(*e>cCy%M}iaX60^|1*L0WIQEgz+K|!f_De*5+itcsOc`T zSa8B!;t;{rfxAR{xkL9CxJz6wIN>hwVZjM^iB*EjLcY61+y4db618_txJ%UTHQ_E% z``7ZoUEgFoZ!m9UE&pj6Ydi47o2dH_?qB^yTmUAR|oDA z>o%A22ksI(3Qo97JV$WCUE(sq33rKi2woGoOMFpq!d>ELf)nl%!!0N;;V!X6@V3BR z;z+>>cZrJxC)_3S`#)&^fxE=#1n&;qC4MM4;Vv<)CHWKX5?c#SxJx`$@czJE;&j0Y zcZsV7C)_2j*7_f~OWZ2-gu6t(bA$RHxJ&#@aKc?;2+yY|f8Z{WU#r6S7r09tAUNSJ zafaZ8yTsLkD+70lTLmZFCGHlSaF_VG;Do!xNNdWg4%{Uc3r@I893nX3E^)5lguBG` zf)nl%9~PW&mslk@;V$tFO1t;7k)@eie33rL5f)nl%PZykUmpEN;!d>DOf)nl%Hw#X< zOMFUj!d>DY1t;7kekC~JE-_q8eG={xTMJIOOXQgo)c?R;BEQmz{y%V+$WM-<{|nqD z^5deY|AD*2PX#C3C1$lHeShFCk)H;|_!qcKJX3JOUE*TFWr4fIn*=A^B|a%Q;V$tn zf)nl%4+}02+$A1YLU{>yi9G}-+$ByFoN$-8N^oW1F7YA333rKq6r6CEcvx`4U1H;Q zlvf?NOYAQ=;V$uf!3lSXw+l|VOMF3a!d>ELg4YD@66?2T{t0)9g9InsB`y`5aF_U? z;BA4s#P|G-`1b%GP_5}y#fKX8}$ zXTb?~iQfxOxJ%UbnsAq>?KR;pv2F(`f8Z{$wcv!i#NL7v?h?lfPPj|FL~z1g;*Ek6 z?h+5-;S!z!@n75}rsK)Vcb9lIuK#bjOMDVCYPd^$S76{SQK^Bu#P5X~xJy)Kx=ZAf z`>jx+fd8Q51sVKLrSgrN?l`aev;v;~E8s(Xfy7ng3Y>ocJ;IfNQ24$e5g&FXLrDbE zdqQf2y!qs-Bv}u@=ShW>0aA-(QVt^W4f*&?tf{C|0W&J#x&*Q=7A8hdtHlJ;2qBSg zWi3(xxj~;Tbmq?|=^FV{8$bVRg^6Z*C1A?d^c4Z=lYk`p(NxI)4WW~n&)kD)WgIKKMf>tK`9qoUp*J{qff)B}0YwW3;v57A1p_M~gYxZ#s`t>}r8g0|pO zc!DH%6ge&tI`iOzx6-YdZV5=7CMHO78|b!y4i;6LZ+^*8z&J4RlSZL19WE;C@pz<8 z%Bz5JV4^RF2-lxNVfyXXipWR$gxVm{g?GMTiTHG%Ao+K9kkDCGINPluN-DCo@ho9t zvAG0LBNL`$+30Ff73P{i5`$khx>{5wE)*m)*;3KnqUy`lgCr)3qN_z^;BrC|gD;A% z7L|!>49QGZ6x}W68@5U=JR~tu)YO21D-lTyz9_m{)Lghck<4U8(cNOc;ff&FERvWg zil2y41}PG*x0yIlEg$&{FsNfO)i}zG5DhBYEhZEo|4RDMbX`2zTvtl7g>^+D2lEYm4T}+ zNesRyx>{5wF2y7>Sy6Pim~Xf;%k`NgCW@k~MP=ZEO%j7Iimn!wiK{rtOjZ=#E#@1p z{c>q1iHV}>silLjuxZ(0p644jIcR%BX z>qW^7Hv8*9(zeY-q#8`p)BD{7{VggNmzGj-`2u-#LOHqUl#vB zCg9>CRVprDGMz4Jeq6pv$!R6i@uIeTE^MXZq~v=8E-rVa;_@Z$2{^eBmXgy-rsGBJ z2)IO+ij$HXgQi?uI7`LlOQzFB<>ZoDN=_@8ju*9G;9^@UPDUQ9%#zN#k^EpzT|EJCzttBa$3ogg_C^`7XVXnQu5k>i_3zk zxO~Zv2Ao_lOvz~_zb~BZinx@Rij$HvLDQ~=3yi6_e93gWsGMASOvz~_)A6GADO{9H z#YxF!0T-7lQ*rr{?+-Y+h?$bpN~Yt*xG5-1%|)qnxEMDl9fQM{*a-BvnS3lRE3F^s z`GzxDF8-)q!Q|ARm(LU?PJgxrOhg4t2Zh!NopY?$Qqs2zofD1EQqtcNI%fwVta#Qi zj?Moop>rFtRZ4m`Vztr_NJ%ddIxFyul=PuOXEj@$l0H}H9HzFWq_0D4+;H_aNq2wR zyj>W$oSV!*qrrlEg@Nn4$qcj_80cy-Zn)r^%s{h&fvy(ghAY6y473{h0p07=IdE)6SFtpSp*7L|c( z#Yqf)&8DkGW$KxN$yRKB=v)UUt|}+x#8%WdVBj)y5`!;la=^s3=VT@;YPB%&KD_oz zCW@k~MIBzaLY>5G5DhB zYEdV*TxU;avZ6W(6YDD%-;<}HuKgzweGzoC7&og^Fxc$rYEdVn zTWd4<{lCzq|4&KhN0hWJa>t;C7B>A`LT3XCVMYI!^sj_2{eMb2oh;h^KP8>txzn1# z9fx1$KUC<_|EHwS6}t5QDe3DFi~j$Yw4nbN25wg*3HO(e=xQ-;xPOt%;P?N+zzvOL z2AU0bnXVSm|EFN^`+s5JmPc|9e*Z5F+yhBw@cVyZ;HF42gWvxP19wT18T|eqqeva2F?u=GQZNSkc3-12`R{% zP8Rb`caXTtQ;S5`iutBLNZjzLMWSoPd@~#*?)}sv(Y0c}83PixfohTHS~1^D1Bp9A zwMcZWm~R$<#Lb~vB)V42Hn3LyaU`aQW8t)-|-k?^UXl~=bzG9RG-d9 zgpN?S=HWm8l#8YIxwPVq60RHZpMT0l1NdBQPNDEp;d%!D`KMg8h0nz{6$+ONS2h0g zPq}CopNkDE6n<5>GTY){GX9i{7V^2+xopsU5W;eMJjh#|x-mVvGo&a)~h#Tr>-8I$gN98K+!gkpvfQ11>sUj2mvzDVLZf!9@ds>rvt2 z#+`DBZ4z9x61esW7q|12OAUk@EImO1O$9DGU5p!U@+p^CDUlcL1+M0x#|^jsluJyN z;G)sMMW>5#vmxM0vKI;9qSwTTcCYlm7&qK8)NGSX$ITxkxJ$UWkEmQprnBAgYr>U{ z-9hC_G93xXi(V5W+WP2!F>ZPX36iWx0us<`VubYpOF_7doB2V4B!iLwE_zLjXqy}^ z3Ce>6Nwy^c3FtL3qRq2R61*KGNHQ}CNIueRDFI?PJP04i#*&?r-Kv#E(+;3G*j)HziMR$vF!@buUv=5Nf@1p2sG2d)N5^lIE zlPwONEXED@T{W6a5J|U+`b5YrSRo;nUKMpXGXnRO@mhwZQtJ+o1r(07y8=4*TWiqmO@AM;d7QY^H_`ed z@NP=yX-o54s148txDjj?TlBCR*4}P)_u6qNY6s)r)Q>YQ`+wqFg=YJ`q69 zz8`gt>py6ulT$VuF?HyI+K5x<(yUI^l=(JdvO4pgQsz#g6BUJ{_YieiVr6!Ll&r2- z3d)OqOVmv{>qq+$byrjv9ZS?hQETf8GJA>F3F7DqGW+5`T5$^tfdW^M>Sr<5c0U>E zXE9dG&tj~WpT$@$KZ~)RnWBukxy4K=nF;>gZVyu>* z#aJyri?Pu(o?E1T7GvisQa_8aF^bgBVr&MB6Zly?3?TQ#b=;HkaYwXJ^U?O}^cGzf z!{~LUz6`bMg-zGe&aj2N_}Y!LPuwHN9R%~5?#F@BAl>vFhp^%6NaQr6H+IvI-{y83 z9zjf+@XZ-Er#=F{ z=&k4-%xS&?$LE-ns}SAzO=jMI1}{5Mrvc303BLg~3Qez!6OmH9B=n|^A`CAuGDA95 zq~|y@h)g)Qfaby+-3iQbFfYR=;IfYyau;(E0}QqD8%>>tFa8Wm(|j7ung?$@!)aHy zC`bG#nh{!n`q49~l|_xBLz(#*%#i2u|4KA+tDx4=Ysq=$c0r}8n?>EA8}9-<&4G%S z6Ug%cEj@~tO~mzFn(unkrMk zfX=T!xQjF$zy5%0#zQFEP80cFgzJAVVpNb~PK^|EG(}T-q&MFiQw^?WV!lH(Uo-ld zG>51`vs@ZLE{nvXhiK6vG3OzgvzgfI5bf1`-ZXqz>M%2Fu?PQJic^lCk%7}vd~(R8 z(~1u!<_EHQX@zeVf{b4%{1~!mZ8lP+ddB##wq@U>^r|c1ioL7joY0jD)s@0{XtHfY zK0K8nbsN!JU#xB;irec?n8scYkXJ|tdXXtuPCmCM_x50Sav{&iB0j!x5=)anXj%Dch33#ZL-Od0QlzV=a(av!dS1bZLkvQx{Ete#iX6G}_*gmSf1Ij6;z z|MN5*asMWwufzLFsKW9F)pN+D^B-9H9H;5Ocvr_6)4w|kB8rZcigr1RJr<>Nn(;AQ zFSXEPS!kF7UY*8LF)7q}EL6(_%xyd?P)q3_^zu7qFo6+8cU|6VU*KP9B`7_z5ceE-d&F^Z z1Q$J<;v#)x*>jioY>O*=uWWgDS~CZC%B;PF`Fsyp@&*32ujap%K!0Y`9{ejU17A-A zJK)P@m-UF^Vm25$6yTyqQ~c|`3Kwm0F`pM*ad96mPGYB&!!CSjNj___r**eGTSXtn zUwZ>ZCmKbs!`6V&o7I4S0KG#`sLp#AD2&0)&=JdD{hcSv(itQ+WIoFv*wZq`Ew=)um#5t54bJ9zRp4a2Rz5(>=lJ z!cQ)Bdy()-!XwPJIpI^RTP>w`-br~~WiWo4Of#=Wef(z&Fg-Ixa>SPlLgDtfjOZ}b z1DCnaB9{x$IHg%qvP>|0mIHJ?0aTm$95gMVw^B_ot(_HaKmtmaBc>)!{FE=_J6VW?(tDoSO4&t z*?VVi20}raN; zFpu+si<_fetZ3v&uI++L_}hz?si8Har;UIhpKoxXk;sAuXHTU1Amv=}=Zv^w(KwJS z1Is6m1`8D@!c=owf#p-chDlD28Vx`2M|F-qA2fJ1V=P~W5`XHct_w~S*5OA%xxi_h z;kA{NKpaj#)wlraIYSxd&V8ZOb=8TY4P4t}H49$Jp=QC~0V|Z?QLG%nt)8u<++gV( zxa1x~Ecm4-?=A#=+!Sfj4VU8`j1J>Q&&{&}auf39RMqDxYcN1G8OzcIAVdCurHQ2m zHB{Jvxlc*JW=UOe_b*m8@XJe}tBgr!xh9Wp7}hkh8S<)hs4*G*EmM`(jJ6D0m6wl% zv>U~@JR`8(u;3Cr1^COP-bfyIr8xxy0LjAxbvcF+FQ=kg{1V){0!&(MHD*`KlXXK~WdHM+OR#@Xf49cZg^hYtj7l{FCZF2UTiye7e= zH59CYYfW!6cxAkDc)|w&9#=@;z=4@!>~hy<(J;O$e=zYKlW0AT$||@dXTa=i>9W;* z%IP^MhcT>HG2~9n#WvvGd8$cgf>-lZlf>9ukWX-Z7>b1}-`9Y18-9Mr^;ywL@UIIZ zYruc5|Ep!%FkqdI!8*;Y7{lF_{3s1RY=o;WH?yp~&h3Ia;Kl&#(5xFJt~&Qn!QFiy zaufIuMYvq)V(#3fuz}N^%Y+h8dA{@`bLrVTdS!PYfDC-JkJ60#tt1@LBxs_!LV~Jc({w}4gXWG;t z7z?FRnX>k9c+!+o*u9j&Hici|-ATE`D){Zn3D~`W`lR+mu1ttIR=YBmg?i)3a425Z z8Cf;C^zzd3VEI(?v8)uVgPCK96gERh8~$iI7K+z&rAp!Vgu(k7*$6mU+5r&-9LfTM z?HsU?XdB=m@CVe^q@o#sFrt8tC50>~5v<^ww(O)>VixbG&O|KO6#*egXTShX02{Hc zsL;#A+A~pJ3pW>yN5fbnN?4UxUI5BQ(_OJ7)g5b3gyPajD4dNY6J&=s2{7!xRP#El z=B>$eg~Dme2(*jm-XY4p=a`F)u3%kFth}Fjn^=W8idAo9KQRulr`I>J7Y(zPeRuuF zYSvTBPRz1w6D!)z(oO8-jqI8>Hm;2Y`&h{V*3o2sH1AhzZPSn0n(b^v1?#S5BM-3L z_F0$w{VO(>JpDee9w(*4W1;ZDcF@*od|VSxFl^v7epP#GYF3xrdE!W6k|g zYd`xHYl@V!S?*;nHv0fD?nc+cY{&WvcE0;67h86~Jr%x0IMF@X#j=OlrEZ^#Ek4Y~ znn&Nemz~=G1F&)*yK)y>(ErE}2JV06em1(FrFVfpY~oS2wEr=7S^vGPZWnvQF#E4& zBcajIxLCzM*RyjrE@Y>h6)d)qoz}z>+h?*<4zpw}JEekUvfR&CUEA5eMjmA^4m)a= z<+^9ga$huh>uqIAx7Dx@TpQWLuA}2JGnaj6cIViL1Jif!xH2O2h&y0L9K^buAhypV83u3VCNlWKVNs$eeS8#uj)zll(Q1>X_a{(x3qcNp67SF z%f_T}8Z**p6v-!bO?4fhbjjZS>JM$XWS({-duVxod3xExsNcvEjL`>C;!?O9(7Whr|Qa`p{l7nHS7HnDH5@9Sl+0Pz?QuK@An`ldbRO!hqJ zd>^Rif%?kYeLMmkTg@d`RCSrF&2!&2d!J!h=$yhj#Y6ZM)K}W51Z-p6(i0 z^~qD;W=Rjb$7N>OXV;sD$G^Pn^}2z7?q=Eky5Jw!h<;YmA7#&_%#E+qwH$11WRI>l zkDA-AocZ{bGrP@m*@-Y3A(_qXzc<5df!UvTYjkZZ>oT{$zQoUaY;E>E){|vR%(gs{ zlWJQa8ry$gxAgf&b3M!p=03a&v0~%;Sj61UzHorGLuWnGV;&v%O77}|5C6=4-l_8^ zv*sqaY&rO=FgtXudy1=e@?JCk`p5rd;Vf%&k9XBxx@qyW_|7NTmTM2YF9HWDW^Z+m z9|Ij?{eScaW_4ZEERUGJ%R=r6a37|N1I%NNa!(jz=J@~E)$Yq&SF>xjvlAhmdrA|~ z91qL{O)Ro+H+!nYJi07ho;FKoUEOfi?aOCunzgKQTIJ*(^EC4*7Be?a+dQiUa{n^+ z>+6ob{mMfZ_RVa8+biDL-PpX94c`Tc`TgtN<*w$;%#2w&vn5b@d#0HUKVW{%ecl*$ z^aQiQ%Z5WA_Z)bGZCh`8?!1Go$$q)n?0S2XIr?F9^rmgGIvA2LI(D6-7pVi%{ucuh-=&V-K?kSOYYzp^R(UOxHmi1KQJc7y}8QWJce~< z+1OpIdf#I6D+k%0@i!o`xpY zvAcWv7hbaP%HFL#tIW~nHgf`7oXsP0oXD4OAjY!A+w)W$Z9H*(|Ad!%t~Qsj5w)xb z77X}}NiUhDmC$P+gM$ZH5A^6<_Y9XMwHT%5f>cZD(v%SV^pb@jx)DVC*;m%POI-u$ zzS)6HZ%g3P-R;fbecg?GNV8!7_?PQ?Tg);u_jI5IM(RM?+|=X$GK8_^p2}{sti2cF zT?WGL3t+7|I*6I&`DQv{O(Lt?o({m}cDjU0I$7%hta9hPPPTL--Lpi0cJlU}Y)qDo zDjmYuz0qATHU9jJ!wcD2yZA6UtBJKWnXTQs*;)v}f4j`1o~!OKm-Ozr{b@d{Ujwsk zKMR$zF-Ld9+~PTVfJHs<<$zi7``Ikl)OxVxicL3cW>foMz1z)-D`4qpg|*pS2EjUe z7i-w~{O(?M@kX|G*CzJkwPxunbe!-M_L9-R2Sz^MN9jyim*PAuayF4!@S#*phm%*<4z;95yT7yUcd?#8b@=FDaii)vVrTCRoxO zwUc!p=x$ubu7S?y1Uu$M>+{9qp)V(p+ z+uPgRy44)>p}EMsoUN(7{LvQnhjp;I%9^v-Mcdi3{$KWfZPO0-3$D@3)5Ja-cc9gO z=Y?y`t6-so0dm`Nb03V5kH?u6=D4@(Sl0n|E+04_wVM6F-!dNf@l`Mrt~Nbz`-j8K z+J~+%PrJS;m#zOWhF{(7y-TT>XwYuJ=XQCA{V` zn_zCun&+F_e&p_Vjdo8u%`6A;9Sw&;_`pRFtTQ2aJrFw6DUdf@YDPS}kllns3P6P}ZF@H<>%k7kbU{=7a1>$ODkw(BuKh4HL5# zuCQ>Eh57bt(?rWa-)3tLKo@?r4o2dM2XfywFEDd^*r;7B0TW*nyQayK>Rk${J+t@i?sPdkY{1}T z!#A?kS(r80FQ7l&7oX17G|hR2O=w~*O>9E#?d&1wB=+t)_m!@iOPDWtVR@n;&mB$L@H5#mzo2zMG9bY%XF6p8S35%{KQ1qn^6>>gkKNE}i*B z*cfn~1PrpDz|O@ihwOvo=w}g_D_OG1QlEJE1#|l9-?G(xJ6P8)@bVrQS?-Br1B;*j zPwIS-*QrVO7J6uoA{QUYK;&2LHeZ;2RbsVS_aRIU9#|0g1IO@v=FA(x-SX$4gG>2D z3I6eI#qjOVH+HaYnDAh6EMxWiU_?gtbvL#@=ROrq8u+i}bQ=fw5r}pq^1pNHAPyP| zjv@X(dFo)a;DX=L)IS{QLp*@KC|3 zP97@YaR&G!bwGfh4A7erY^&P^4{EO)d`^9MeT9WhK6UO~zY#9>8+^us$EnS%0VbtO znpmLE91Bl0BVqHkCYys()4A}zx(B0i z8?P@jVMw3R&z8eP%P!~#OYgdPqizI4y=?ShI0qQDt;d?j*h&57+a|1QW(BOrmCfdN z;Q8aeJJ!PtvE%;7pEDo7vF>;l9XaK0jmD<575iANRI{cp2ax=W zLOg(c63-dWkSC81&?)1|aPnxKM#6WJ#^>;Xi=N^WPcZr02mHf%{-J}UU)uPc{99A_ zOt;cX$seh-XafuW6Xw>Zyh@bI@VdGP4mjaM_4MI=$XM$``~dP;jWGf5??nDuy!ID) zZgFp6y>OOieMrB2wzwv{A0 zUMB5r!29F}>G#=qYTp3zAE3S3%|m;KExOfx3tL!JzGaAv>p-;-I0NPCY;oO-_u<qGwTKaSoJo8AP}H|7ek39n}t6;~CN^s+5(XfbfIT`0#;j`#uO?Qz&?SGr$0Puw8??0J>K`_z7t+kpIbv|GDn$mXFK-&F4~X}^5F5P-MFtq>knls|<0qb@;+{;MkTR2NnD4%rO-D0r%`uTET# zMtPBkx3DckAP;YK%ldXM6mmmFVN_tb7x`hTzS%`3vx_{lizaRvddrYo*=_FXqVmnd z<`hlqJ;7V#MLqI&{~|%`K_2|Q#l5ho1U#-Pnph3N=^eUx$QF1{L45iai}H7PUAqOw z&4OEov=kkInr>wjkJJ(&P>piL??s-j$?hTK??8FTgC#{JypP#t9y03Z4cLI$C|8dy zB0Kx>{-b!mcJq+lp}wLNpS(ClavOX?;E%_VTTw3res&zWa{fIRd>#~qVXv3`KZJ5! zC}+)!4MqGndsrWDK$IPLZNI-4?_Y!WtFis0U)dmTh_}Vy{T{qe{k;M2e+BcfcJr{_ z6IK)rxOnH?GGq(o7sbibB<#J4_08=a8Wz#yKmDfSX*3IgU!Yv=Eo}49)-6MNht(CO zAdku3ew5pea&xz^NKr}*MNUyWHsC^r(-X9#*wT=8@ct~!dx(=YPi}V4FDlQoQ`};y z87o9#Sn*t3lp;GRy#Ktiv)R2!jd$|LdIKG7T!wZaGc7a)udO#h0sqcE4z~=sh207> z*2Jo!^4?*aDZXTP#R_5II<$lR?VMsr-yZ#M$zfIZibvG2Pp!n0@xutkN&dx@#>>LK91p%^^rgHr^55vZ}~&_%VWZk!So04J`O(vlr06)mwz-H+hcDp z{lV(5tNXp~T9`NRn(WY@oPH=@4lvC>^!KGtP~!x~Evz=PPG9?BZ13)1R&Vt`Ik1Kh`^JA?|l!R-$;X=oSJr zuUYdEP}IHwyx*wWS5s8NcNuf7J%@-8MW?3d5Ox6Bmw&Vs{h)cB+E0IdbqzMuYJaHc zkc+oHuRlp%{@qh**KN=>tvqOj{ZH|tze2hP<)MAJZp^d#g8ZbvF**a=IlqX%{0uJ! zp&tD?&kI!?ZiVqsatnhvz|IM0`z=FiAXz|%>Zd+<_?5%0o4(SFx0Lwezb4*nr|`jc*R(0)PQ^F9^g zvVHUi)t(}GKIB`AytIuWyYwf?j%SzT>5qZck=^|9m*ES=4T;1j%1|Ds10?8g7ErMFqRC~HwBu!$#gcD2xVj4QGYaB z9qW!|l4(m{X~D}wL3n4U%ZO!yu>`!@lg_2G(TEXC#Io@APAn4*M!Vq%4{o+4gYYVQ zE}S(MM^{%Tb1UP~s&qQE#^{XXUCfVW=O(%hDDp(+#-m+eBx3}FD?^zmuXH86LbWPm z2={`SR1_+O*T9mgXaW$t+?9=X1tZC5CYVTOgSiA3H^RYiTRhZm%nM~h@ww?VG$-4U zPOc7i@}@_7!qF6e|Hud=>!WRPc#A0-5y3HP7uRsN!oj4d${wpZ$*!*IG(;*LYzNn) z-LY`A8V)bR*(ChgKD%^YWUcl_mbBF*Qn~D$j!@bN)+`BTLfsI!M8pVpM8m6s?dfDL z70l(rDR{ezzZFH11Z{6R)&;Td7Qvj81`O|(S=}Teh%Mm#?uS>wV&R3!L_77lV&}z^ zp)AT;;ppyySG6+Pg%G%Tv3PWGs4EKbZ;wTSS$H2SYst@xMdJ~pCgX>jOICJ5bFGT) z^)&Jx>*8tB7K7KlVr!#8h@(sjP+v(b3E3&fX2LZvdf-Rt3#P!D4PvI zA4edvDR>uA^!K79jGkmVV1>xYrbCHL99#qmh{GDoqrBd#QW;|n4#xd z_&dOl{Dy?M!+?qDQ173<5$+6B1OsKPA z)>&l>NnVwOv6`Js!hlI&>-jw?+GupU_h00ls#M$)Xdc0$4xthjeHmr}lHh(2)i6Eb&kO>jwKVKNlqqL9*7iW)GnLszfiRW~kj_8>o1VYUm@JBuy0 zR+aW>ws2X2jBbl$g4X->xdiXiXv7nSfE#Tc8Cqwu*8UGd9uC5b^VUW(&3|malM4z* z#g2<7VvzsnGAux_MG;d*es^>x;m0^3A9;FOiZWMtA}Gm5Bijv~66QOfNKo!jgS@ly z`-kuIcx4^%qYiPHA;7f5`o(QqnJ%(OpCj}3p|Om$EWuBR$9fuJ(`DPH@La?V5zlvF zu+dsZtN{f*Cx#PdRLolFVXFrH$T#thNd#+sz;CQfM%EayWEbqf2j7v@;1dF@5Hd@b zgkgP7!`=XfsA#?Obe`ABH0%=j4ziB_2nKI3JS4!5(dxgf75jKJno@&C?#>FwYe7)+ zQh*Pw9DnYBguWu6ey9W@#K(J(uhTF}^D+$vD&LV7tY8LDcG%mC0fL)d zr^mCl6s&7)nP}F42SNTI1kW(tc^lXWJa>r^YE7t6v(c9Df)CY@q=~55c{?T+&JFNz z$e$+X@rO7VLK&FRBCr@9LuC%1qDA-f1&$9_=bYlX0|Pb7=N;(o$=2cs9^xiIw7oEC z@;1mYN$`a|WAJeufR|B@ zAC7!Rvtod&PG^i}_QIIt&wTt&;T{SMsUCod5nd?@JGUBof=?w7DsE9Ufyd1{DmZoz zS`RmQPlE9%G#7NOZFk{Z%`I9_=|a3J5`jkNKPJj8S(Ta@^L@Zo7t$Th65yxP_<08J z4Yi5lu@n2q{P009!IN~}AeR-v&N3r6ATTiE(QI^nJh@Ulrh&tJI>o0iC!|zR|tS7{I@N5%R5l~&iTPORcuvTbD8}5{ZNq?tym8l@>EFXenKq7sJAdl;${V34#Z`U=mJe(z%4eQx~3dM5h!y zQNgl-`!6+fs@b6W_h9U2Am0BGd(^8?aR}V7mdC9l4Y*f}xaH1aaEr(JIVA z9yO=xAbu-J7;?gTlv-Rd86!!jsb)x`3aP@X{buo_s) z8a$x$vpm=o!3mbNjKXs4IKNtlGFDS~T)-nSDm(c(i=zTxaRL~mXhdk@QO8`~9wV5H zM`!`@<}w|5sTbs@VSKe}vo^cd?l}y{iq^muOK|?MRA(lzCPD}BAG!oZm?gngAub(G zX24Q#H@fIppe43^L9d z)>gWTKA}Ba+5h#6re*%TANvGfboayJxN@)@)4Z`ZfHE|2UK*z3SxZ#qY5r^igX>b~ zE{9pX8cr>;*)@QSH2((zB%U8&CuZ;sfz>(cl#ic!!mN_Fy}MqL4zG; z)^@oEfhQ61tdKWaq>)DJ{D<%G!8thPhUpD+K+ZEV2eNPw2b~8eo!m`6l~{8M)X(!A z9%nLetQPLDJ-Zbg9`FNQI5-tQ`pRRVrgX=#l0O$iJ$}gI**uAlE6hU&5yy3Dbts+S zZt>Ga_%)4IaVf7}HWE1g02ItXv+|}=5q^AD1$miSa9)!X2feUK;>&k30Z(1|+ts{T zSd2FQP|NlCHo7f>OPV#d`N1Q!P7N6BYW^hzKRD|Ob;4|l{i38~$M6}w4bBmQ@H=$i zzi7zFCgEfsrrjX_`DS>O?Mlg@JBCgqh&Ylge4gZoH=@%W6=Rt>us%B8;`5xC-LMzH z%awc=TDU$M))ttuv&&Sj^kM%_m_7ZO;ohgs9Kqk-v}sM{Hp+%68Ri1 zevDi6KCg!x!D`xY*Q4w<8eMDnngKH{&qQ8ne)d)2Su=lLhi6azI0nxy;-Qb%Am#*N zoj;esgcmmWX4XjoJPY#;9t6coQ=!JMtS7B}TUNt(>S8boPVj}^Jb0uR&n$)WD_`TW zdmIxae{k1i=2XK}lxX)@|HzYz80=BNFBLgBnHO_8G+ul^WFpMF7f`ms>ZcQ*vVA$j47}_&i} zi(zafjg=<2>WCyz-*iTdxrq!sj#*RNoKPwh=HJ%9!GRhMc>~U|z4@5|F|(dU`H~X~ zuYxZCtyRZL0&of*`qfj`N zw1r}E>uVFpKE5tOid(rNrfXW=`4)tC{X+iW*a@qDay9?TN+m#EHx6DK9fdZ)ch9i7 z=Bq-GZ|Gs6;!lYx_!w*ozq+B$7vN9{zFiRs5ai#8<>L8~F0hb);H)g*e#bfugwrWF zH-YXmtQ_({UmCO#@8LUDv8&;y+YqFnwR`1W6;xwC#VY74=vThz;H=yoOz`J?`8{YX0>R#NRp?DVJ!nM3=$_sSTGx)ss9Jg@X}eX(gV_e13!zH!$uz6e6fb8cw#= zgDOu2IHHHsYyQPW7G@lknJVh4a@!Dy@KY|eHuL#e^b;S9V$&+FVIB~(gIa|6QM%P_ zg$LPr$(&yqe!<9h00o9&rMI>wuy?WECXmOGeBdcB3S(nE3>(&KAL78uaas}`1~$ZD z*|B<6w5`TEv5tsWH|PwkT^x4jt;>9f*eh&=^FH{V1YePXI+1|Kfvj~T$G@=W-w7w8 zutT+evyCCng_4G~Dv4P~9Ptz;z3M#PJ(xK)nVLi<8%l(uORQ~k{>hbGZtPBa`C(K$ zY?JKoM|8IFhc9c?sM_)t&MKIw`NOj%0S53L8UEr>GQr=*v8}nb$pOM)855}_=9z-c z4a`9Ntby09o+=BBz{U{vY9ZLviaiVL>B80~mw!c>Oz;U+9^;5mS`AU(X5^hbtH)ql z70@^M?Ep{HJeSoIDL;1LNgs*f7bePIHK|zPvfe_9@{?R>zUVdlTH8ql-iooF3dQ1W zJq-xh0BsW++{NHjH%!-#y()5@(wIMvz`)|ac^Y1Qvf3oZq7@q4b%}2__%Ux6?@|#? z{#<4qLc`*mKj*_#W^K6n9)owMwfB*&63e)p_qZ+bn8IfZ%vkGd6FwUB!DHoRehc_) zW1VL3J1~0r!0CkPFegs$<*6a_8NWGg}B7w6nZ{-xA^+g?9mM2kJ3pu78Br5~DJRwzgD)UO)&wV~GTgP`WPHk=3||03jaDG6 zCrNsj!EzoBDl!I`;P0A2*r3z+aE9MK8|vcgDEEIQXv4_id-iC&4ZdoF4Fr#Fwga9{ z!M|=J4%06jk0$tYHD@h%;pIa(h{Yc}HfjQM7l|IQ-rVDXf>Rf3nahMj2}2yL3b8=5 zcPZpj8*W3Cb$X_O{J4o*H}^G z&Eg^CGXR`Za`!Vv8>9tLyu~1&SshBjE0ge0WBHtc%G<2n0PhY1Ul=ytz&Bi7Mu6ad zNyX0fMhc%17`sNd*WF#n-=GhL7L~Nd*X=EGZwsF_H=pJY7;gf@e!AK=3?C`3PPl zsQ|$;N%;s)kyL=-bV>OL&XQDs;9N=h2-Zp}KyZnqd;|lM3J`3Tl#k$YNd*W-CFLX7 zDX9R#q@;WVvyuuBTq7wT!F7@f5WG=RK7uz%DnRfyN%;tVMN$ERUz3!NV85gS1fP(U zkKp$t6(G1vQa*w|lT?7<^OEur{I#S41YePqkKk*P3K0CGq&06EEZxRxlkm3`2XFcpen{^YX}aMagrw#&@Mk@hrmhvxwE{|B zAkqrSx_oO9eo0ZfAuW*mQTi<`d1DFJ!4I484{#m}AIjRami+~9U4~{{hMyo= zc8JHvs5L`swGvcXT0CZ=v=Z^=IcvccC=$Ywx0LY5iqpE4^in7TJ`>y_DL=s{B-KE0 zpQQW*pOaJr!FMF(C-|~LwnUDBM zQ^){UKA0Z=gFXBMK_z&ar2GW0kW>RfG7jTGSWy3xPe-KN0fHAxL(2)4ODaH6+2()J zq2Qz2_L1%LrJ+`WWDs^a1eNX90>g0eH}v;RX{b@xYP4(p8@0wstrlHN?>Cfw0ZZO* zgkMvfHjek=yQDSBhwZfkggGiVSK+iD(n^5!C(+OWsVvBZiAm z0;e^T^gfogYYvi#fo5RIwRcT1-a1W+XjVw%Oer#`6(yoI(}UXMvE`y`&=yie*NJ<-rQM~n#6w%V~5Z?M5mfUf|%lPkJhYxTb3*`MndY?+u z4Frdw8cYlXizU@Skc>M_AG+-T*&ZnkH4-F)(ES9JZEdiUA(u4dJs065Mb#s0QdC~s zEw}=2MX=<7BfLp*T4Ix4PMX$Il0?=@5iKSA@YY>YM6*I7_el}W$^hPa7E9g+!VBS7 z^YafgRv!^4?_W}UQQB@Gcq;0-jK&KQk}06_Y*UC+eyIxm4 z8JZvsE!PccOVF>e)i24`dkLN)4YlZow87^^X&;t6{)C$pS4?;va?mG-?2$CcSUU>A z6w!^4^c>a-(uzo}fUc$W327yymQUBxCdmyby%9^^T*5agu9)zxiYp;}+KHm!pzE=R zfb8FedeB^g-Phf#5Te(h`-lzNbV;`fWwMhmgE<$oSh)YZ>6h3R22HlkmKgM1MkZTfaA} zpm#}ewe(P%??@yqMFIpbLDMdybqYeN4XA>O;9?CL_=z;+KNYp$Z%kPqShS{ThP0TG zfp?E-h&&>L4hy0e>+)e~%@c?NiYq33wc<($A3)A=KBo#+pb+E)!5>S?|183n6=jc| zZYV&8ej>FR$#tIzf#8Rd(k4#>{v;d!xT%C`kTCyqZPq>55)&SxxDvvq;yi>OJz3~N5APKy z@86T~=4n_$1JelCDJoCFg8Q+WSFnV&L zkMIIT`4KiL>Q03BD9Y~oPQ3M7Ecuur{47q2z?BcC_ogyUa22Y-2;GE`EIABXa)7j9 z#w3`NhFWw(+Acvi3!ysja1tX)No1t7>?25)nX&bU{I~ZOd`RyT zY>LaMC+L-?wB?<&$a$C1MDR|j)$%QbFDvQ~2+1dxp^bUnHvM`v>G)Y_6rYR(VgcA%n0}BdD~r zupPo`|0=6*Ao!uAG%fnI%dRn^ex8klixpQ)c#Pso2;ZSNk7@-Xymva5Fkc*BBw!ag zAGH@sE8b-YS1GCsA^8K*wi_CcBAca_-!3wMx4wfVj|ky6k#pQfkm3)dZLO)gNWfnG z5!4=es<^|eCww<@e0s3!8Kih73PGd^)=0|VijYh>JSdQ%u~KVLCr3*WAHgO`wd!?g z^UOIYJzi>g2~r8|An2D;ExK)O&vGG3FP2)3x|X(z51{mJEP4D1uOBO-?ihbkd{I`{ zK=4yZ`A@h3d@v}44d6t_z!8wkECDgR#)k|~Gylc7hXmKJ{! zc}R-*2)-w&R=qAQ{!gIvcchk=Ae9h*f^SKw7TvZM{~w|B8&a!L*J`xK--|I`g(Z(a z;iJcjKPg^^Lf|*SZ%WGl6hboP5Pve%Ew!}xlSoF2_z3<`QmuMjTKw0e^hT-WB}gT- zgW!`=sztZ0#sAAFy+dj>>RMX-jS|r#E-ZQc36E7=G2t%c9G4_A_60I(G!UF7DgShY zaYfm)LN}!KNeZ>E!IC>pc(dY)2_Hnx(Qz_%GYUZ`5PVEh{_P0KltVJoh#PM0&zek~@X_>T0b!7f80f0iPHR{u9CqCGOKKrbR#at{fA^;jN~VjBuU80{XC zNKA@o9+F5xifA6D@z$MEMB91|;H~GekfEQ5!{XNVQDBx zhW?=_7shZjmY^s@h+rQYx=(5?CqvIF>J5Z{SJW`gwst~cqVyK2)k3!SD(WyoWxIuJ zkCcA5*!_MLd!Fim$6N|-UUgIr)d5me4b=e@g-7LyR$V1}(t#z#HGPE4j4QXK`k*U(KkKkjHYSin})@d>{Q)<-{ z{GOy*bwjO#g^ijFCkb|u6=-m$G~A*a*7~Ccr6W?y-;VGRMd^mL3^{_*r=Kkx;~h)* zKI9z711XL}A?R3wD<#$1j*v__d(mIwzhDpOdf~}Hj(d*K}c0Nj%O09tQT;j0nH2xZ=U|9v|HF5xn)jGGh`xs<>jppDM0|aH&UjUAf%_vOoMBaR+*d z;DDt31Rs=C1Hoq`<^M54s?T9ZR*tSr#*#;h@KuT{CftXdV}_BjDii|W3En0tEuqQe zRuthb5bjr8G2yQ(u7vQi@rLzrbc-q&HckkETLkB#9z`7fY&vAQ^YawHMIlBB`}p*II7(=%=VvC$(C2tya6%KGYg|uDAosIzdxX zUVBr8RYHVGWHoN zIz)&>4oeZOtt9e}6!8&MhBd8!qclSY9qJy6x6YIz_45!?vm7GiMG+sCJVJz*DXy6C zZsZ&zM8;O3kb{>b5|AQVTS=r*iuedB!kX8COKNEmdK+*3ON!KA zh|Qs9IYg)&MJ8j(BSd(H;))61hn!;$k+C`ya)=O#Opzj5TS;W96!8&MhBd9lDD9V8 zT7(+#R$PkIe-$A$%OOGoDDnW7JVJ!Ouef5u!zRicIwVluzhrDTDnf(^zA7pIYY54d z!#+qiq(!6{9hr=!)wPJfqntdF=bnJ1I30z+NrE>>s%5jyl*5|}x}iaxJX;#}+5MS? zw-!l}hA6^LMcK9X;;kQJX$^hE2NYLK`1}in1xV~ec3TD+`#mZ`LUC*5+$c(CrB=fhgj*G*8Y$2ry!B5kd5j2Of02-Zj?`mBiepg-Vlmr)h zBr;A~@ey1pDecgy0&i7Ikp_Z~ORDuLgwza&(YPN){(>cMJ>jlPj*;u6I1GgxTCa;} zttXLBrPDrwmC|qv!CFcA+7ObD4!J%OMNX1h4Fs1;%C8&Jay^C8*I>zGM7URR#e{#0 zoMWz&u|5=Xh?_2=#qDO){)(z2H8hw#>)q#8W+ApSsc#f0Zgk{O^c+gp8$7$e|^=h}M!- zsQrYjerufYccf*lC42GKOHysMN%-{AW5k~n|0r#1tBo$AdHot{pNduS_!BNc&f z58fIl)mEE?FH>AG;myc7#-EH;qL4%UbrG#4SEBYtS^d^H;Txr8E&hFYYpYa)!(GJp zDz2FDc#ruPf>g2+6v`?yeFmuELT}LxkT_T(NLZ{Y!c^ zC<8tb{Hmn<0|*~b)Po3rqp05_d|gqhB7u(Jt)p0SHwk~BxMIQ|Dz1d^zZK^p{BgOk z&ohV(R_Q4y1Z^Z(D=GhCgk6d{zM%jaQVwjr`#QUxF}6`sJwIrfMcP46IS8Lt6hX4?;J0o&K(_x|R_7<% z7fIXN`b&o9Ni842u~I8YhF(<^LFJ?txhP7#xr%Zvm0RUqVHPq$ZJeDWatmiL90)K7y+Dt((>rRGnA*I;mGrFi-E3>j%?QUN;fU z)BEs0&}$~WRhNrO;GLj2LNev>n$Y+uLVBvy@)N9;l$YR2N%_fkx1_uTdnD!GjPPbj zc_qZ&bXYC_fl)jcwcrQmzO;@mCQDPkN`&N#CHEsF-^*9F$Nhb*;cO+eWgT5iL=t`$ zqXJ=G4O`ZI7ssgIl!RS%+Ql2P_>j*NwL*vS6og9mUqA zYV6aDe-9g)r+N3f8_?H0x9-+7DKo;eJ@PZS;JO{Q9>HrD5jAnxU(g8oghb0vli@uyCee#o=RH4HJ^FuW7jx^Lr@Nbgx z5YbQz{#FCFk!b7GDX&4v#?Ro|&ej=-DAh>RtkcLR!g^)}+%q6;^ z02v}Jr*T1Q@5=gp1W66Xh5p0Yr1v+eS5NSA>35J|m89ygL3q2Qg4DWwin7Ovs-q^s z=ppzesntq`$a9C2!3LD>m0B$iBUD=2!6f;=NNRZru91|V{8xswoGiv%I0Z|dCxp*c zTruGb6jws{hlh)*CM=GQCkp_afb}kZ3oCUX+eg0?OnGDEoWtA zUaJ2_MN$1*6=gTH7jM0ZC6689>z`OUg^|d`UGDtdx|OV2z|236isL7DiA7pwaHs z1~hO3mb?cDe^+tEgXw)$I-s?eOe>MVU{cR$MvZKPYY*;jtB>ZG5LR#NJGD_$VsE5GMHQl|mR^`hFcDnR0j! zTsIUTL!<>$`=i$m=D>T>0UyCUy>DoGBhjVbVF@Eh_flJLccAq5rB=P&q0xBjw^F20 zH>@S=0d#-5)bbNtq$o1`%)(cqj#u7gLD&Z_oTkV^4QamVaHxQgMQ|Q5(vK%3q za#&`_(A&~bfZ#tQ)j*I8K_+k4o|4EE3BxZnAeg83=zpMBPkOUtTUzwCwAedScc6(3 z&69>&bwjPkH`Gjq8l|D2Zb;jxdaw_hu;l$q`1h)R_u3sWNHL5;kh%o#kyPXN5Rxf} z{?!fX*^E}EO2a;acS_2y*QHJVRM$+YRZnoIq=LGkpuPEIh?)%hPlAt0L(6qT%a3oU znG8K54Ylfqw2Vlj^i5LByAR>Zin3RK2ygufOWys2-&9;N;rA3*LioN)Vb$?DpDOqS z6(LOs-h_Ja)VT%WJ&Gbo)*YtC0hIm*mfU&5uT>e=hd*R#-=mP?4pcmb?QcpEEh`UU z6>nn6t0(+liYq4kzT!#P z$&|w;mkj*{J#hGyq9pRJ6!8&!SJt&$uS**Y-6(y%)bg)K_^hJHkQ>|YaB49Er6)@* zZx_OA6-CwDsi?gOf1#*P5uPBc(-z5pV8cgCEk8kO5;#fKQIj0}HqpRa(ohSvR&|lK zsuZJVrC9PrB>cr{nIwnY0;+#Wae-`F1HtPh<-Z@{w-u#K2twf#d!!nq_~NMA68sB;l~s=jqsH^}^(NLV5s82oAxAB;_TzT~e(CUyziS;0@A)R)Tj+%1iKm zNi`AtyQEr+76`x2!V>%vQuRv^`XuEg*eIzc;ez_N1aF-o zMSKLwIe3C4r{*dtWkR5bvD+Sz-RC3tO-XqP{!~&v>aO`R>b|=X-lHgj)RW*8LFyye zgHqpoRYu)MQ6D?F>u;j;U!;~lfzmmt<-Y^rTZ*#BfDBQR!q$1udb=r${4pA#G`2{) zxk?-^Rao*NOn9l{iV6Ql4KMvo6EfySAsAi+*GbC19^u1^`Ub*ZDa!8XA-pxBR@~u^ z57=&Fs75P!hF?O1%CMIpx$RJw z2U|2AOWs<-=PIt4@C3z`5H3}mhp>N|B6ypm{C6Pyo}xyf)w8iY zMuW(p!^Y&BXz(#<*h}zaX}FQ<@+!*Sj?2-&71EH8;7mz*2{ud0XE$^u-Xc->SqXx3 zq?VUpouujsMkS@~LRO&vH)F|rnD84*j?qh`c%KYF1HpGC)pEjOVS-FKd>2QCzACk} zd?t}TDdHpev80ykb!mG=GDMz2Bnf^l4F$6-$^Y$X{n}aPm*jcNw1gBp{s5}bVQ|p`P$>Y+a0725?^YuEr-tAcNozej> z!7k}QE5Wp+eB|B@l4`vf;hl=whVYw;+KZ6fa@YqRLJ~6C3{pG; z75UtZa470Q;+~F>OgZE-85$!EX}L@yCrJ?>!4a~qR=qCm*_{lLr;y78$wTP6AFQ{x zwhAkrBOUM({7h1Q-2p9|FF@&wq?VT;l`y>$JXtnwxo%qiQL>SEr4{jabdaQmcgw-J&RhWDp)u2vVRN zrpueq_6%t#NVXqRlx|2{#*UzL2}X+#R>GHI@;eSzQoINiVdf`zD(ZpX7a}B64ox9L z6Qm(+%#p}hQp88_3|UvJUY9nS$Pjr7qlqAS=s5HHuwuV-z)NtXbil7WfZ}R&T!G9C zWr!e^kb(ryk+zrXwzYigMVrrJ$%peWv_R^dD@Bf4>@@5rp^akcK_i(UHHYc55~Vw^ z-e^!+$5!1$Zus^JM(`Mo!l(7T1iVaO`9QJMy=mr3Fnan z$qksp)}qZkkH`~cTl0uoe?9^}JP6;9Cqs~?d$mI%Qp6vQH6SJg$D=SfH3K1;a+qr) zXz5a^wVbq8D(V`|kd~$$Xy_uT)v6n6)eUL!rUT6f(GZUb;l~tLO!#rdl@NYHaUQ}u z6*rOaw-r}T_=k#{MtICn(Yhhf7td1cWm$w@5}l7FWXQLNh`YP71WJk{aG~^Usntrb zMpE@Tgq_k*YYySB74;W{81 zA#5R7CaL8FDY`J|2!5!f2zE;ETL`MyFDFRp1hxqNMk+41htT0YHfqfaQmawd!YNEe zf*MSoK{k*_lmb90d4Z^|-^#jzdR^M;w=#d!!{qPU5K zCn>I+@D#;OBfQKME#lkVarS1C!_!d_rr_g?1W5X1Gz}wl3__~SVetMI>-fzH7-D0& z8?{c6hL-Dwv|0KyH1u!jw3lF+wC(>XLRFogsv9Az^G`)MOHuX!lnoQiOe|p&RD;l` zs0K8k0)Tr>Wo|NhR4JYGbs|hk%1iJeN%^QLzg855X|nVipTkvk6VbUf(#aNTt#VRZ z%~znoby)HgCj1U^kV^WCC!~0r^r(U0&n2aeGt&C96w$&)BAca%kKh}U(vsv(ymhw} z@e-sGlAYkMq?8trZ=EPY`h6^SW4RYg6>x$6r}Fd_=>q&NkiH%b;&mOC^!2B`z7a^A zgeAT&Zp^~#^RX<&(q1e>f+jQj?xqsgT-r%>p!^8r?e@BmNMU(Adk@&`W$^k&EbYY~ zuwI&>ug2As)|BJPueZr3@tW3&cD(My(r)iVTm7_{&{DnvR}5NjPQdk&b|s&qT{rUY z;q~ADm+Cte>!Ih{zjMB)O1c-<-n>I?@6S>mvXgU*1 zCJHWsa4#K=hqwZwR6J{x#u733HyiDNf7{>!?j<9kY{)2$b_Cnfp{{7KBLcc~Wt4`q z$#e!P6h&tkZi3BFS1b$_CczB+Q)<~3c2;IUI-Kn4iYDM@B)T%!9t@>JiS{VBVqKKE;FMvE>@2QuXFs-OO z6E_2NA18E!vSu9Uj?B~V!BvsU@=C;tN%&j{|Is~u{V3j`^4^m*9t*N-UL@{N zc?1RJeY~dj^V5!e{ZCMz%14I_1+LE_)ld2%;CK@;?8d+pxPT9pBqvx=7hzuVbva-E zhp12G1~QCF)bGW3-EPyb#Gmt^vWYvG_aQx^__CH?|K0bAJ5&~tAeK}=(R^9s`V`+s zQJ+fsLs=wG@uTZ&ZTfvriaS(3jMF*E+w1?bO@G=Cgd~;s*&1N4{|?lrY7YL)V;MO3 zGhxRbFT4IdHvRWd|GocE{{fr+C#e4k>f7tHUq1r+JVnTVm;KEk`o@bw@rX^| z-kw8)=pRA-1;?3xxqT=9r@byJ{uA%uypLV>UvSUPaq-i)2zJB?dCCs5e7o$Vf9@TE z9dhci^~VmPKk-qtdP<=_qpw2#TZ&tSEn{YfFutP{(l0oZSAzx(B`c=rE zY|#2t$QK*5?iBK;7_^=g@~|nSbt3NuGe*O_@5y5XWbo&MXJ_(o^l#PWqm~na`fmh5pV-TM2ru7dq&eTa@m~qx1{Mm!>=M2JoG@g%>A;$Zk z+i&pG6(_z1c(Vs9Ov80nNE^nF0B}1yZFUCppKout|A%nDLv~)W_+sOTjsK&?7a99;UqteMwRpW< zp8{{S>pqecCe%gdddcfbF+eVp=d;#_Whoc<8y?eoBofgc6^xZf)p^eDFLZx)XiP#lG8 z{uv6(1k5J#^F>5w*!YRaPqOh3B41_kBMc7)vJUOXkWVcUg4HO$75Vbnf`Ciwb3gKx z{J{V|>+r^pEnaZ^-=hd$A^GKkxD5G!*yL|Uek3fGR(uu-Vh{2cSv+1qaSg(mDDMpj zq67I(vU9H>HY5KHn;nYVE|fpAP6)2X`1~CC4cK3^(as0Rm#-AWD&)_Agz+HGFD@K} zp9y?^|E|Y+m)Lk3W?>uu99F`Q6M5V!@r#(L$UlUG2;BC|^2P#jJxLS>|7wc+IS>&<8}jwYmnQ}BG~@^Wth9K6 z`M)}K!v4Qb1%J0R5orCtz87A75 zY7qvWN1lHR#M|4K5qtpo#TJj1K|y)A66IHPi+fb>4ao1kUho&9ogK&@LB}6NlP?2* z3e0aQoIg$E|Ag`bRf2#twmv7ra|oB;fb$+qj@IW);4S~>iffYRUrKR)#eBivB?@C6 z@&o99Bid=Vcoc$y=7DQTJ|^z*^^AY+M1Dn^xW-{->_mP)4!9H0KL3u3`%{c@hzm92 zBa6oiC@5|xLO{6uz#MV!0~9&U;*~s3E5;<0-+QgNNApqz@;es_9@4}5)Y$CMG0Acp z|1`>{Z2X^*--Pz}-YAIaI4*8Qz8Ldu1_-~oPoVtHnP>+)@)?UqWhnlN z@MRlchy0&yJT3#qztMhbo)F~wF#Z`i+%U!qX#M+3#1{b1v6K|1$7A4wbez+=}u$F`qG<#=Xc7V4{)zpCEt8FAR5~{eK{T zBrAwVksl2cisKrNB&J4|0Co-vGHW*WJpNfFP>FG@FA3+VDWeX#W;jl zqI`LcAT}dE&nCYIf6_@JJ{xfVfX5TY7mzQG3c(#HKilH* z0*Y?5zm)7O6ZdeK83~(wEvjxp`SL13pqg>FO`f0Q@Xz;AelPlSzo3nmkWXPAejWM0 z0$&WziT3B^Pf@;nz7Q-$`3qp8=6SNAM-XeUW3E7cFD?kQ|7<~i|E)rv_5+)cU$H{) z*NMXTrp4n06yp&-1w5axyf1nzhQ{wt(2jw5G6v<3*z7Dqe)!44fBNMHv@g08c?0K} zU!eRdW#AWE`>B#TIe8c73C_{elLLom4 z<(D9TXtv-f{yi3tl|fN~aoYks&$kV~^r)MFwvzoNf+jlyHap`m-@c3T8*tv(j@F(d z9utb*GyOC29?X-aDF2DgejV~fFrchF_X&bO|MSmu;_-RycNm98g68uS{=B9!mDTilz0{k|0Wo$Z3Bc`1YZUR+10-!~AS5b|AE z)h!l}7f^f)+w}m-7o#A(#rqTBo#waa$bLxJqH*zen|}y8K}Ya@?^`VH{SHOO1JCEHju$)@L-{!w8t^CCYx((1G~ZCoWPR$;KCYzAQ*(J>Vm7q*){Dn2M=L9b;y|nal1ITDD7AYjd9g&z#E|rcYvTcQ8$F1KV%~t#C zkLhPLJGUEN>6sS~wHp}-T(m2=Is`8h*=^5(SAVM0(6V$e8_i_vqoIh=73~7|3w?t3 znS%WF9-fNXTqc-~w#UF~Iv5Ivqwo$cK@u{FScUe z9tHQpQSdbo>xw3Gg^l42;lec$Xm+eE2Cj)N3rknElo;liw)QzUoxs=GYg~?>rPHFMMHWcqk< z1FvU?a*^4gOw{0h23JDHz^iHL&>HKy&`C%4piNd6&4xKMn)b)mMvX3*Qj_6A-L_;Z znkb|k&BZeH0lzig6A^gpEwt)C(8-@Q_^5>>2zNxotAgS7STGFJQ(+Rz*@m~c%4#d5 zV=VEXRF#P)BD1+$S|8+%@mPlEu{RxUi}f^y;<1P(oR{a^;aGPplT1V0tic{jM4~;% zQh{Ex_i;L!&7~9Y24E~9r=mzQnh7S7*`PJlAi*NRR65H0AqogQ%p9wd>U1cU;2E2; zPq2gZ+nj1=b1`dFIx0o^?0MXbwpN20D=)Y^tF;-QcS_K*1%n@A5Xq$qvnHHOw8h$U z>8RCg-l$+FUw*n_R>_9j;<-#mp+Xz%7YZ3L8@DI0HIrGv<|A%bV3adE#B-Pq=peqBv%`-ok_vc zmhOrrkC{|*o*ryr6^jr|0tIW(+(c+)9HQo!L_EyaLg#qbHaCc^jx{{t1>CNTHOpxo zaV$&PvJ}e%Bhl{v)3_P!xCsMMH2;=JRn=}Qwb8y>EU~k02t+_O-M{adu_0g_n%50B z_IT#rGuGlut98aIyPQdDV)jjCRL(i7dFZ>YEb8Y8Wn0;z6~$5M&BtZBa}+~#{uc?D ze^`RJm-AzkjiQ*10@cjf1$jNT%@r%h&-0TeE7*~NN^>V)CELGtm9=&j23<{S zBA^?xg32t3H9I-w`19HWB@+)FHR_FXYagDQ@3z<_6O4kkUVjt62SCrwN1_*pK&c{S z1P=cU_GygENz+}_0QDd)#&BqLBeeierlEhd{kvu7@E3*SKj>qBmQFG8-2s=sAxX8= zI4MA6RGcrN+|$wWR76;6B)IDTlleE0OxRZ@LrHxlqP39}JEy5FnwgHCY=pz#sif?D z3zjzRXAo`wtY|aABBRpx>DGTJ^ap*NYwjL!?cSRTJwuv|J4`%`U_zKN>m^UllCHt~ zh&emHBz*gafV{ql^Df-`e4=kk0>leC;n3rHHb*j$5|E-+D-NB7p`rH#F7o#x*t&V` zkpcjw!FdhekK9uu{z0z`QnodC`Jf25qOFC&T&C@!7ieywQ0?E+UZg(qEBngg5i)^k z>}Bi#Fc)L0OeLnvpQLrL+%IEt%e{$AO?(xZnB6r(P1mxgqYn^~`zhm4y2pikcKrbj zm}@Rl%pv!m)Z_dIGUDGDfwsnyqx?8)Nn3pq1waT7s-yjw!N3S!~*mWp?~%sH2C4 zmZgWy$0B+ - - - - - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.gitignore b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.gitignore deleted file mode 100644 index ae3c172..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.options b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.options deleted file mode 100644 index 7a6120d..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.options +++ /dev/null @@ -1,2 +0,0 @@ -org.eclipse.tm.terminal.connector.serial/debugmode = 0 -org.eclipse.tm.terminal.connector.serial/trace/serialLinePanel = false diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.project b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.project deleted file mode 100644 index f7f32b2..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.project +++ /dev/null @@ -1,34 +0,0 @@ - - - org.eclipse.tm.terminal.connector.serial - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - org.eclipse.pde.api.tools.apiAnalysisBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - org.eclipse.pde.api.tools.apiAnalysisNature - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.settings/org.eclipse.jdt.core.prefs b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 4754bba..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,362 +0,0 @@ -#Wed Oct 19 12:10:57 CEST 2011 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=warning -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=warning -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error -org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning -org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.6 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=0 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=0 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true -org.eclipse.jdt.core.formatter.comment.indent_root_tags=true -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=100 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=4 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=4 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=true -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=true -org.eclipse.jdt.core.formatter.lineSplit=100 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=false -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=true -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.settings/org.eclipse.jdt.ui.prefs b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 0d73226..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,62 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_Target Explorer Java STD -formatter_settings_version=12 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=false -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=false -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=true -sp_cleanup.organize_imports=true -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=true -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=false -sp_cleanup.remove_unnecessary_nls_tags=true -sp_cleanup.remove_unused_imports=true -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=false -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true -sp_cleanup.use_type_arguments=false diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.settings/org.eclipse.pde.prefs b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.settings/org.eclipse.pde.prefs deleted file mode 100644 index cf80c8b..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/.settings/org.eclipse.pde.prefs +++ /dev/null @@ -1,32 +0,0 @@ -compilers.f.unresolved-features=1 -compilers.f.unresolved-plugins=1 -compilers.incompatible-environment=1 -compilers.p.build=1 -compilers.p.build.bin.includes=1 -compilers.p.build.encodings=2 -compilers.p.build.java.compiler=2 -compilers.p.build.java.compliance=1 -compilers.p.build.missing.output=2 -compilers.p.build.output.library=1 -compilers.p.build.source.library=1 -compilers.p.build.src.includes=1 -compilers.p.deprecated=1 -compilers.p.discouraged-class=1 -compilers.p.internal=1 -compilers.p.missing-packages=1 -compilers.p.missing-version-export-package=2 -compilers.p.missing-version-import-package=1 -compilers.p.missing-version-require-bundle=1 -compilers.p.no-required-att=0 -compilers.p.not-externalized-att=2 -compilers.p.unknown-attribute=1 -compilers.p.unknown-class=1 -compilers.p.unknown-element=1 -compilers.p.unknown-identifier=1 -compilers.p.unknown-resource=1 -compilers.p.unresolved-ex-points=0 -compilers.p.unresolved-import=0 -compilers.s.create-docs=false -compilers.s.doc-folder=doc -compilers.s.open-tags=1 -eclipse.preferences.version=1 diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/META-INF/MANIFEST.MF b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/META-INF/MANIFEST.MF deleted file mode 100644 index 4b027b2..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/META-INF/MANIFEST.MF +++ /dev/null @@ -1,24 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %pluginName -Bundle-SymbolicName: org.eclipse.tm.terminal.connector.serial;singleton:=true -Bundle-Version: 4.2.0.qualifier -Bundle-Activator: org.eclipse.tm.terminal.connector.serial.activator.UIPlugin -Bundle-Vendor: %providerName -Require-Bundle: org.eclipse.core.expressions;bundle-version="3.4.400", - org.eclipse.core.runtime;bundle-version="3.8.0", - org.eclipse.equinox.security;bundle-version="1.1.100", - org.eclipse.tm.terminal.view.core;bundle-version="4.0.0";resolution:=optional, - org.eclipse.tm.terminal.view.ui;bundle-version="4.1.0";resolution:=optional, - org.eclipse.tm.terminal.control;bundle-version="4.0.0", - org.eclipse.ui;bundle-version="3.8.0" -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -Bundle-ActivationPolicy: lazy -Bundle-Localization: plugin -Export-Package: org.eclipse.tm.terminal.connector.serial.activator;x-internal:=true, - org.eclipse.tm.terminal.connector.serial.connector, - org.eclipse.tm.terminal.connector.serial.controls, - org.eclipse.tm.terminal.connector.serial.interfaces, - org.eclipse.tm.terminal.connector.serial.launcher, - org.eclipse.tm.terminal.connector.serial.nls;x-internal:=true -Import-Package: gnu.io;resolution:=optional diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/about.html b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/about.html deleted file mode 100644 index 0f07cf0..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/about.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -About - - -

About This Content

- -

May 24, 2012

-

License

- -

The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise -indicated below, the Content is provided to you under the terms and conditions of the -Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available -at http://www.eclipse.org/legal/epl-v10.html. -For purposes of the EPL, "Program" will mean the Content.

- -

If you did not receive this Content directly from the Eclipse Foundation, the Content is -being redistributed by another party ("Redistributor") and different terms and conditions may -apply to your use of any object code in the Content. Check the Redistributor's license that was -provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise -indicated below, the terms and conditions of the EPL still apply to any source code in the Content -and such source code may be obtained at http://www.eclipse.org.

- - - \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/build.properties b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/build.properties deleted file mode 100644 index 3333540..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/build.properties +++ /dev/null @@ -1,16 +0,0 @@ -############################################################################### -# Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. -# This program and the accompanying materials are made available under the terms -# of the Eclipse Public License v1.0 which accompanies this distribution, and is -# available at http://www.eclipse.org/legal/epl-v10.html -# -# Contributors: -# Wind River Systems - initial API and implementation -############################################################################### -source.. = src/ -output.. = bin/ -bin.includes = META-INF/,\ - .,\ - plugin.properties,\ - plugin.xml,\ - about.html diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/plugin.properties b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/plugin.properties deleted file mode 100644 index 17f52a5..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/plugin.properties +++ /dev/null @@ -1,20 +0,0 @@ -################################################################################## -# Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. -# This program and the accompanying materials are made available under the terms -# of the Eclipse Public License v1.0 which accompanies this distribution, and is -# available at http://www.eclipse.org/legal/epl-v10.html -# -# Contributors: -# Wind River Systems - initial API and implementation -################################################################################## - -pluginName = Terminal Serial Connector -providerName = Eclipse.org - Target Management - -# ----- Terminal Launcher Delegates ----- - -SerialLauncherDelegate.label=Serial Terminal - -# ----- Terminal Connectors ----- - -SerialConnector.label = Serial diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/plugin.xml b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/plugin.xml deleted file mode 100644 index b61259b..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/plugin.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/pom.xml b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/pom.xml deleted file mode 100644 index 7a8661f..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/pom.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 4.0.0 - - - org.eclipse.tm.terminal - org.eclipse.tm.terminal.maven-build - 4.2.0-SNAPSHOT - ../../admin/pom-build.xml - - - 4.2.0-SNAPSHOT - org.eclipse.tm.terminal.connector.serial - eclipse-plugin - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/activator/UIPlugin.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/activator/UIPlugin.java deleted file mode 100644 index 8cb1247..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/activator/UIPlugin.java +++ /dev/null @@ -1,111 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.activator; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.resource.ImageRegistry; -import org.eclipse.swt.graphics.Image; -import org.eclipse.tm.terminal.view.core.tracing.TraceHandler; -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.BundleContext; - -/** - * The activator class controls the plug-in life cycle - */ -public class UIPlugin extends AbstractUIPlugin { - // The shared instance - private static UIPlugin plugin; - // The trace handler instance - private static volatile TraceHandler traceHandler; - - /** - * The constructor - */ - public UIPlugin() { - } - - /** - * Returns the shared instance - * - * @return the shared instance - */ - public static UIPlugin getDefault() { - return plugin; - } - - /** - * Convenience method which returns the unique identifier of this plugin. - */ - public static String getUniqueIdentifier() { - if (getDefault() != null && getDefault().getBundle() != null) { - return getDefault().getBundle().getSymbolicName(); - } - return "org.eclipse.tm.terminal.connector.serial"; //$NON-NLS-1$ - } - - /** - * Returns the bundles trace handler. - * - * @return The bundles trace handler. - */ - public static TraceHandler getTraceHandler() { - if (traceHandler == null) { - traceHandler = new TraceHandler(getUniqueIdentifier()); - } - return traceHandler; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) - */ - @Override - public void start(BundleContext context) throws Exception { - super.start(context); - plugin = this; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) - */ - @Override - public void stop(BundleContext context) throws Exception { - plugin = null; - super.stop(context); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeImageRegistry(org.eclipse.jface.resource.ImageRegistry) - */ - @Override - protected void initializeImageRegistry(ImageRegistry registry) { - } - - /** - * Loads the image registered under the specified key from the image - * registry and returns the Image object instance. - * - * @param key The key the image is registered with. - * @return The Image object instance or null. - */ - public static Image getImage(String key) { - return getDefault().getImageRegistry().get(key); - } - - /** - * Loads the image registered under the specified key from the image - * registry and returns the ImageDescriptor object instance. - * - * @param key The key the image is registered with. - * @return The ImageDescriptor object instance or null. - */ - public static ImageDescriptor getImageDescriptor(String key) { - return getDefault().getImageRegistry().getDescriptor(key); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/ISerialSettings.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/ISerialSettings.java deleted file mode 100644 index 5986785..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/ISerialSettings.java +++ /dev/null @@ -1,28 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.connector; - -import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; - -public interface ISerialSettings { - - String getSerialPort(); - int getBaudRate(); - int getDataBits(); - int getStopBits(); - int getParity(); - int getFlowControl(); - int getTimeout(); - String getSummary(); - void load(ISettingsStore store); - void save(ISettingsStore store); -} \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialConnectWorker.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialConnectWorker.java deleted file mode 100644 index 569273a..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialConnectWorker.java +++ /dev/null @@ -1,215 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - extracted from TerminalControl - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Martin Oberhuber (Wind River) - [207158] improve error message when port not available - * Martin Oberhuber (Wind River) - [208029] COM port not released after quick disconnect/reconnect - * Martin Oberhuber (Wind River) - [206884] Update Terminal Ownership ID to "org.eclipse.tm.terminal.serial" - * Martin Oberhuber (Wind River) - [221184] Redesign Serial Terminal Ownership Handling - * Michael Scharf (Wind River) - [262996] get rid of TerminalState.OPENED - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.connector; - -import gnu.io.CommPortIdentifier; -import gnu.io.NoSuchPortException; -import gnu.io.PortInUseException; -import gnu.io.SerialPort; - -import java.util.Arrays; -import java.util.Enumeration; - -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; -import org.eclipse.tm.internal.terminal.provisional.api.Logger; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.terminal.connector.serial.nls.Messages; - -public class SerialConnectWorker extends Thread { - /* default */ final ITerminalControl fControl; - private final SerialConnector fConn; - - /** - * UNDER CONSTRUCTION - * @param conn TODO - * @param control TODO - */ - public SerialConnectWorker(SerialConnector conn, ITerminalControl control) { - super(); - fControl = control; - fConn = conn; - } - - /** - * Adds the named port to the name of known ports to rxtx - * @param name - */ - void addPort(String name) { - // Rxtx either takes the connection from the properties OR using - // the port scan. - // Unfortunately, setting gnu.io.rxtx.SerialPorts only temporarily does not - // work, because rxtx closes connections that are unknown. - // The only solution I could come up with: add the known connections - // to the gnu.io.rxtx.SerialPorts property.... - final String GNU_IO_RXTX_SERIAL_PORTS = "gnu.io.rxtx.SerialPorts"; //$NON-NLS-1$ - String sep = System.getProperty("path.separator", ":"); //$NON-NLS-1$//$NON-NLS-2$ - // get the existing names - String names = System.getProperty(GNU_IO_RXTX_SERIAL_PORTS); - if (names == null) { - StringBuffer buffer=new StringBuffer(); - boolean sepNeeded=false; - // When we add a port to this property, rxtx forgets the - // ports it finds by scanning the system. - - // iterate over the known ports and add them to the property - Enumeration portIdEnum= CommPortIdentifier.getPortIdentifiers(); - while (portIdEnum.hasMoreElements()) { - CommPortIdentifier identifier = (CommPortIdentifier) portIdEnum.nextElement(); - if (identifier.getPortType() == CommPortIdentifier.PORT_SERIAL) { - if(sepNeeded) - buffer.append(sep); - else - sepNeeded=true; - buffer.append(identifier.getName()); - } - } - // append our new port - if(sepNeeded) - buffer.append(sep); - buffer.append(name); - - System.setProperty(GNU_IO_RXTX_SERIAL_PORTS,buffer.toString()); - } else if (!Arrays.asList(names.split(sep)).contains(name)) { - // the list does not contain the name, therefore we add it - // since there is at least one name in the list, we append it - System.setProperty(GNU_IO_RXTX_SERIAL_PORTS, names + sep + name); - } else { - // nothing to do -- should never happen... - return; - } - // Reinitialize the ports because we have changed the list of known ports - CommPortIdentifier.getPortIdentifiers(); - } - - /** - * Return the ID that this connector uses for RXTX Comm Ownership Handling. - * - * Note that this was changed in Terminal 2.0 as per - * https://bugs.eclipse.org/bugs/show_bug.cgi?id=206884 - previous versions - * of the serial terminal connector used a different string, - * "org.eclipse.tm.internal.terminal.serial". - * - * @since org.eclipse.tm.terminal.serial 2.0 - * @return ownership ID, "org.eclipse.tm.terminal.serial" - */ - public static final String getOwnershipId() { - return "org.eclipse.tm.terminal.serial"; //$NON-NLS-1$ - } - - @Override - public void run() { - String portName=null; - final String strID = getOwnershipId(); - SerialPort serialPort = null; - try { - ISerialSettings s=fConn.getSerialSettings(); - portName=s.getSerialPort(); - try { - fConn.setSerialPortIdentifier(CommPortIdentifier.getPortIdentifier(portName)); - } catch (NoSuchPortException e) { - // let's try - addPort(portName); - fConn.setSerialPortIdentifier(CommPortIdentifier.getPortIdentifier(portName)); - } - fConn.setSerialPortHandler(new SerialPortHandler(fConn,fControl)); - fConn.setSerialPortIdentifier(CommPortIdentifier.getPortIdentifier(portName)); - - //Bug 221184: Warn about serial port already in use - String currentOwner = fConn.getSerialPortIdentifier().getCurrentOwner(); - if (strID.equals(currentOwner)) { - currentOwner = Messages.SerialConnectWorker_ANOTHER_TERMINAL; - } - final int[] answer = { SWT.YES }; - final String fPortName = portName; - final String fCurrentOwner = currentOwner; - if (currentOwner != null) { - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - MessageBox mb = new MessageBox(fControl.getShell(), SWT.ICON_QUESTION | SWT.YES | SWT.NO); - mb.setText(Messages.SerialConnectWorker_PROP_TITLE); - mb.setMessage(NLS.bind(Messages.SerialConnectWorker_PORT_IN_USE, fPortName, fCurrentOwner)); - answer[0] = mb.open(); - } - }); - } - - if (answer[0] != SWT.YES) { - // don't try to steal the port - fControl.setState(TerminalState.CLOSED); - fConn.setSerialPortHandler(null); - return; - } - - // Try to steal the port -- may throw PortInUseException - int timeoutInMs = s.getTimeout() * 1000; - serialPort = (SerialPort) fConn.getSerialPortIdentifier().open(strID, timeoutInMs); - serialPort.setSerialPortParams(s.getBaudRate(), s.getDataBits(), s.getStopBits(), s.getParity()); - serialPort.setFlowControlMode(s.getFlowControl()); - serialPort.addEventListener(fConn.getSerialPortHandler()); - serialPort.notifyOnDataAvailable(true); - fConn.getSerialPortIdentifier().addPortOwnershipListener(fConn.getSerialPortHandler()); - fConn.setSerialPort(serialPort); - if (fCurrentOwner != null) { - fControl.displayTextInTerminal(NLS.bind(Messages.SerialConnectWorker_PORT_STOLEN, fPortName, fCurrentOwner)); - - } - fControl.setState(TerminalState.CONNECTED); - - } catch (PortInUseException portInUseException) { - fControl.setState(TerminalState.CLOSED); - String theOwner = portInUseException.currentOwner; - if (strID.equals(theOwner)) { - theOwner = Messages.SerialConnectWorker_ANOTHER_TERMINAL; - } - fControl.displayTextInTerminal(NLS.bind(Messages.SerialConnectWorker_PORT_NOT_STOLEN, portName, theOwner)); - } catch (NoSuchPortException e) { - fControl.setState(TerminalState.CLOSED); - String msg=e.getMessage(); - if(msg==null) - msg=portName; - fControl.displayTextInTerminal(NLS.bind(Messages.SerialConnectWorker_NO_SUCH_PORT, msg)); - - } catch (Exception exception) { - Logger.logException(exception); - if (serialPort!=null) { - //Event listener is removed as part of close(), - //but exceptions need to be caught to ensure that close() really succeeds - try { - serialPort.removeEventListener(); - Thread.sleep(50); //allow a little time for RXTX Native to catch up - makes stuff more stable - } catch(Exception e) { - Logger.logException(e); - } - serialPort.close(); - fConn.getSerialPortIdentifier().removePortOwnershipListener(fConn.getSerialPortHandler()); - } - fControl.setState(TerminalState.CLOSED); - } finally { - fConn.doneConnect(); - } - } -} \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialConnector.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialConnector.java deleted file mode 100644 index 9c3b2fc..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialConnector.java +++ /dev/null @@ -1,239 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - extracted from TerminalControl - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Martin Oberhuber (Wind River) - [206892] Don't connect if already connecting - * Martin Oberhuber (Wind River) - [208029] COM port not released after quick disconnect/reconnect - * Martin Oberhuber (Wind River) - [225853][api] Provide more default functionality in TerminalConnectorImpl - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.connector; - -import gnu.io.CommPortIdentifier; -import gnu.io.SerialPort; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; -import org.eclipse.tm.internal.terminal.provisional.api.Logger; -import org.eclipse.tm.internal.terminal.provisional.api.NullSettingsStore; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl; -import org.eclipse.tm.terminal.connector.serial.activator.UIPlugin; -import org.eclipse.tm.terminal.connector.serial.nls.Messages; - -public class SerialConnector extends TerminalConnectorImpl { - private OutputStream fOutputStream; - private InputStream fInputStream; - private SerialPort fSerialPort; - private CommPortIdentifier fSerialPortIdentifier; - private SerialPortHandler fTerminalSerialPortHandler; - private SerialSettings fSettings; - private SerialConnectWorker fConnectWorker = null; - /* default */ volatile boolean fDisconnectGoingOn = false; - - public SerialConnector() { - } - @Override - public void initialize() throws Exception { - try { - fSettings=new SerialSettings(); - } catch (NoClassDefFoundError e) { - // tell the user how to install the library - throw new CoreException(new Status(IStatus.WARNING,UIPlugin.getUniqueIdentifier(),0, Messages.SerialConnector_Error_LiberayNotInstalled,e)); - } - } - @Override - public void connect(ITerminalControl control) { - super.connect(control); - synchronized(this) { - if (fConnectWorker!=null || fDisconnectGoingOn) { - //avoid multiple background connect/disconnect threads at the same time - return; - } - fConnectWorker = new SerialConnectWorker(this, control); - } - fControl.setState(TerminalState.CONNECTING); - fConnectWorker.start(); - } - /** - * Indicate that the connectWorker is finished. - */ - void doneConnect() { - synchronized(this) { - fConnectWorker = null; - } - } - @Override - public void doDisconnect() { - synchronized(this) { - //avoid multiple background connect/disconnect threads at the same time - if (fConnectWorker!=null) { - fConnectWorker.interrupt(); - return; - } else if (fDisconnectGoingOn) { - return; - } - fDisconnectGoingOn = true; - } - - // Fix for SPR 112422. When output is being received from the serial port, the - // below call to removePortOwnershipListener() attempts to lock the serial port - // object, but that object is already locked by another Terminal view thread - // waiting for the SWT display thread to process a syncExec() call. Since this - // method is called on the display thread, the display thread is waiting to - // lock the serial port object and the thread holding the serial port object - // lock is waiting for the display thread to process a syncExec() call, so the - // two threads end up deadlocked, which hangs the Workbench GUI. - // - // The solution is to spawn a short-lived worker thread that calls - // removePortOwnershipListener(), thus preventing the display thread from - // deadlocking with the other Terminal view thread. - - new Thread("Terminal View Serial Port Disconnect Worker") //$NON-NLS-1$ - { - @Override - public void run() { - try { - if (getSerialPortIdentifier() != null) { - try { - getSerialPortIdentifier() - .removePortOwnershipListener(getSerialPortHandler()); - } catch(Exception e) { - Logger.logException(e); - } - } - - if (getSerialPort() != null) { - //Event listener is removed as part of close(), - //but exceptions need to be caught to ensure that close() really succeeds - try { - getSerialPort().removeEventListener(); - Thread.sleep(50); //allow a little time for RXTX Native to catch up - makes stuff more stable - } catch(Exception e) { - Logger.logException(e); - } - Logger.log("Calling close() on serial port ..."); //$NON-NLS-1$ - getSerialPort().close(); - } - - if (getInputStream() != null) { - try { - getInputStream().close(); - } catch (Exception exception) { - Logger.logException(exception); - } - } - - if (getTerminalToRemoteStream() != null) { - try { - getTerminalToRemoteStream().close(); - } catch (Exception exception) { - Logger.logException(exception); - } - } - - setSerialPortIdentifier(null); - cleanSerialPort(); - setSerialPortHandler(null); - } catch(Exception e) { - Logger.logException(e); - } finally { - fDisconnectGoingOn = false; - } - } - - }.start(); - } - public InputStream getInputStream() { - return fInputStream; - } - @Override - public OutputStream getTerminalToRemoteStream() { - return fOutputStream; - } - private void setInputStream(InputStream inputStream) { - fInputStream = inputStream; - } - private void setOutputStream(OutputStream outputStream) { - fOutputStream = outputStream; - } - @Override - public void setTerminalSize(int newWidth, int newHeight) { - // TODO - } - protected SerialPort getSerialPort() { - return fSerialPort; - } - - /** - * sets the socket to null - */ - void cleanSerialPort() { - fSerialPort=null; - setInputStream(null); - setOutputStream(null); - } - - protected void setSerialPort(SerialPort serialPort) throws IOException { - cleanSerialPort(); - if(serialPort!=null) { - fSerialPort = serialPort; - setOutputStream(serialPort.getOutputStream()); - setInputStream(serialPort.getInputStream()); - } - } - protected CommPortIdentifier getSerialPortIdentifier() { - return fSerialPortIdentifier; - } - protected void setSerialPortIdentifier(CommPortIdentifier serialPortIdentifier) { - //System.out.println("setSerialPortId: "+Thread.currentThread().getName()+ " - "+serialPortIdentifier + " - "+System.currentTimeMillis()); - fSerialPortIdentifier = serialPortIdentifier; - } - void setSerialPortHandler(SerialPortHandler serialPortHandler) { - fTerminalSerialPortHandler=serialPortHandler; - } - SerialPortHandler getSerialPortHandler() { - return fTerminalSerialPortHandler; - } - /** - * Return the Serial Settings. - * - * @return the settings for a concrete connection. - */ - public ISerialSettings getSerialSettings() { - return fSettings; - } - @Override - public void setDefaultSettings() { - fSettings.load(new NullSettingsStore()); - } - @Override - public String getSettingsSummary() { - return fSettings.getSummary(); - } - @Override - public void load(ISettingsStore store) { - fSettings.load(store); - } - @Override - public void save(ISettingsStore store) { - fSettings.save(store); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialPortHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialPortHandler.java deleted file mode 100644 index 4f7719c..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialPortHandler.java +++ /dev/null @@ -1,116 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - extracted from TerminalControl - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Martin Oberhuber (Wind River) - [168197] Replace JFace MessagDialog by SWT MessageBox - * Martin Oberhuber (Wind River) - [221184] Redesign Serial Terminal Ownership Handling - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.connector; - -import gnu.io.CommPortOwnershipListener; -import gnu.io.SerialPortEvent; -import gnu.io.SerialPortEventListener; - -import java.io.IOException; - -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.widgets.Display; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; -import org.eclipse.tm.internal.terminal.provisional.api.Logger; -import org.eclipse.tm.terminal.connector.serial.nls.Messages; - -/** - * UNDER CONSTRUCTION - */ -public class SerialPortHandler implements SerialPortEventListener, CommPortOwnershipListener { - - /* default */ final ITerminalControl fControl; - /* default */ final SerialConnector fConn; - protected byte[] bytes = new byte[2048]; - - /** - * UNDER CONSTRUCTION - * @param control TODO - */ - public SerialPortHandler(SerialConnector conn,ITerminalControl control) { - super(); - fControl = control; - fConn=conn; - } - - // Message handlers - - /** - * UNDER CONSTRUCTION - */ - public void onSerialDataAvailable(Object data) { - try { - while (fConn.getInputStream() != null && fConn.getInputStream().available() > 0) { - int nBytes = fConn.getInputStream().read(bytes); - fControl.getRemoteToTerminalOutputStream().write(bytes, 0, nBytes); - } - } catch (IOException ex) { - fControl.displayTextInTerminal(ex.getMessage()); - } catch (Exception exception) { - Logger.logException(exception); - } - } - - public void onSerialOwnershipRequested(Object data) { - //Bug 221184: We immediately release the port on any ownership request - try { - throw new Exception(); - } catch (Exception e) { - StackTraceElement[] elems = e.getStackTrace(); - final String requester = elems[elems.length - 4].getClassName(); - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - fConn.disconnect(); - String req = requester; - String myPackage = this.getClass().getPackage().getName(); - if (req.startsWith(myPackage)) { - req = Messages.SerialConnectWorker_ANOTHER_TERMINAL; - } - fControl.displayTextInTerminal(NLS.bind(Messages.SerialConnectWorker_OWNERSHIP_GRANTED, req)); - } - }); - fConn.disconnect(); - } - } - - // SerialPortEventListener interface - @Override - public void serialEvent(SerialPortEvent event) { - switch (event.getEventType()) { - case SerialPortEvent.DATA_AVAILABLE: - onSerialDataAvailable(null); - break; - } - } - - // CommPortOwnershipListener interface - - /** - * UNDER CONSTRUCTION - */ - @Override - public void ownershipChange(int nType) { - switch (nType) { - case CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED: - onSerialOwnershipRequested(null); - break; - } - } -} \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialProperties.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialProperties.java deleted file mode 100644 index 1e6af9d..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialProperties.java +++ /dev/null @@ -1,163 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - extracted from TerminalProperties - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.connector; - -import gnu.io.CommPortIdentifier; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; -import java.util.List; - -public class SerialProperties { - protected List fSerialPortTable; - protected List fBaudRateTable; - protected List fDataBitsTable; - protected List fStopBitsTable; - protected List fParityTable; - protected List fFlowControlTable; - protected String fDefaultConnType; - protected String fDefaultSerialPort; - protected String fDefaultBaudRate; - protected String fDefaultDataBits; - protected String fDefaultStopBits; - protected String fDefaultParity; - protected String fDefaultFlowControl; - - public SerialProperties() { - setupProperties(); - } - public List getSerialPortTable() { - return fSerialPortTable; - } - - public List getBaudRateTable() { - return fBaudRateTable; - } - - public List getDataBitsTable() { - return fDataBitsTable; - } - - public List getStopBitsTable() { - return fStopBitsTable; - } - - public List getParityTable() { - return fParityTable; - } - - public List getFlowControlTable() { - return fFlowControlTable; - } - public String getDefaultConnType() { - return fDefaultConnType; - } - - public String getDefaultSerialPort() { - return fDefaultSerialPort; - } - - public String getDefaultBaudRate() { - return fDefaultBaudRate; - } - - public String getDefaultDataBits() { - return fDefaultDataBits; - } - - public String getDefaultStopBits() { - return fDefaultStopBits; - } - - public String getDefaultParity() { - return fDefaultParity; - } - - public String getDefaultFlowControl() { - return fDefaultFlowControl; - } - public String getDefaultTimeout() { - return "5"; //$NON-NLS-1$ - } - protected void setupProperties() { - fSerialPortTable = new ArrayList(); - fBaudRateTable = new ArrayList(); - fDataBitsTable = new ArrayList(); - fStopBitsTable = new ArrayList(); - fParityTable = new ArrayList(); - fFlowControlTable = new ArrayList(); - fDefaultConnType = ""; //$NON-NLS-1$ - fDefaultSerialPort = ""; //$NON-NLS-1$ - fDefaultBaudRate = ""; //$NON-NLS-1$ - fDefaultDataBits = ""; //$NON-NLS-1$ - fDefaultStopBits = ""; //$NON-NLS-1$ - fDefaultParity = ""; //$NON-NLS-1$ - fDefaultFlowControl = ""; //$NON-NLS-1$ - - fBaudRateTable.add("300"); //$NON-NLS-1$ - fBaudRateTable.add("1200"); //$NON-NLS-1$ - fBaudRateTable.add("2400"); //$NON-NLS-1$ - fBaudRateTable.add("4800"); //$NON-NLS-1$ - fBaudRateTable.add("9600"); //$NON-NLS-1$ - fBaudRateTable.add("19200"); //$NON-NLS-1$ - fBaudRateTable.add("38400"); //$NON-NLS-1$ - fBaudRateTable.add("57600"); //$NON-NLS-1$ - fBaudRateTable.add("115200"); //$NON-NLS-1$ - - fDataBitsTable.add("5"); //$NON-NLS-1$ - fDataBitsTable.add("6"); //$NON-NLS-1$ - fDataBitsTable.add("7"); //$NON-NLS-1$ - fDataBitsTable.add("8"); //$NON-NLS-1$ - - fStopBitsTable.add("1"); //$NON-NLS-1$ - fStopBitsTable.add("1_5"); //$NON-NLS-1$ - fStopBitsTable.add("2"); //$NON-NLS-1$ - - fParityTable.add("None"); //$NON-NLS-1$ - fParityTable.add("Even"); //$NON-NLS-1$ - fParityTable.add("Odd"); //$NON-NLS-1$ - fParityTable.add("Mark"); //$NON-NLS-1$ - fParityTable.add("Space"); //$NON-NLS-1$ - - fFlowControlTable.add("None"); //$NON-NLS-1$ - fFlowControlTable.add("RTS/CTS"); //$NON-NLS-1$ - fFlowControlTable.add("Xon/Xoff"); //$NON-NLS-1$ - - fDefaultBaudRate = fBaudRateTable.get(4); - fDefaultDataBits = fDataBitsTable.get(3); - fDefaultStopBits = fStopBitsTable.get(0); - fDefaultParity = fParityTable.get(0); - fDefaultFlowControl = fFlowControlTable.get(0); - - Enumeration portIdEnum= CommPortIdentifier.getPortIdentifiers(); - while (portIdEnum.hasMoreElements()) { - CommPortIdentifier identifier = portIdEnum.nextElement(); - String strName = identifier.getName(); - int nPortType = identifier.getPortType(); - - if (nPortType == CommPortIdentifier.PORT_SERIAL) - fSerialPortTable.add(strName); - } - - Collections.sort(fSerialPortTable); - - if (!fSerialPortTable.isEmpty()) { - fDefaultSerialPort = fSerialPortTable.get(0); - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialSettings.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialSettings.java deleted file mode 100644 index 6a03cb7..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/connector/SerialSettings.java +++ /dev/null @@ -1,203 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - extracted from TerminalSettings - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.connector; - -import gnu.io.SerialPort; - -import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; - -public class SerialSettings implements ISerialSettings { - protected String fSerialPort; - protected String fBaudRate; - protected String fDataBits; - protected String fStopBits; - protected String fParity; - protected String fFlowControl; - protected String fTimeout; - final private SerialProperties fProperties=new SerialProperties(); - - @Override - public String getSerialPort() { - return fSerialPort; - } - - public void setSerialPort(String strSerialPort) { - fSerialPort = strSerialPort; - } - - public String getBaudRateString() { - return fBaudRate; - } - - @Override - public int getBaudRate() { - int nBaudRate; - - try { - nBaudRate = Integer.parseInt(fBaudRate); - } catch (NumberFormatException numberFormatException) { - nBaudRate = 9600; - } - - return nBaudRate; - } - - public void setBaudRate(String strBaudRate) { - fBaudRate = strBaudRate; - } - - public String getDataBitsString() { - return fDataBits; - } - - @Override - public int getDataBits() { - if (fDataBits.equals("5")) { //$NON-NLS-1$ - return SerialPort.DATABITS_5; - } else if (fDataBits.equals("6")) { //$NON-NLS-1$ - return SerialPort.DATABITS_6; - } else if (fDataBits.equals("7")) { //$NON-NLS-1$ - return SerialPort.DATABITS_7; - } else { - return SerialPort.DATABITS_8; - } - } - - public void setDataBits(String strDataBits) { - fDataBits = strDataBits; - } - - public String getStopBitsString() { - return fStopBits; - } - - @Override - public int getStopBits() { - if (fStopBits.equals("1_5")) { //$NON-NLS-1$ - return SerialPort.STOPBITS_1_5; - } else if (fStopBits.equals("2")) { //$NON-NLS-1$ - return SerialPort.STOPBITS_2; - } else { // 1 - return SerialPort.STOPBITS_1; - } - } - - public void setStopBits(String strStopBits) { - fStopBits = strStopBits; - } - - public String getParityString() { - return fParity; - } - - @Override - public int getParity() { - if (fParity.equals("Even")) //$NON-NLS-1$ - { - return SerialPort.PARITY_EVEN; - } else if (fParity.equals("Odd")) //$NON-NLS-1$ - { - return SerialPort.PARITY_ODD; - } else if (fParity.equals("Mark")) //$NON-NLS-1$ - { - return SerialPort.PARITY_MARK; - } else if (fParity.equals("Space")) //$NON-NLS-1$ - { - return SerialPort.PARITY_SPACE; - } else // None - { - return SerialPort.PARITY_NONE; - } - } - - public void setParity(String strParity) { - fParity = strParity; - } - - public String getFlowControlString() { - return fFlowControl; - } - - @Override - public int getFlowControl() { - if (fFlowControl.equals("RTS/CTS")) //$NON-NLS-1$ - { - return SerialPort.FLOWCONTROL_RTSCTS_IN; - } else if (fFlowControl.equals("Xon/Xoff")) //$NON-NLS-1$ - { - return SerialPort.FLOWCONTROL_XONXOFF_IN; - } else // None - { - return SerialPort.FLOWCONTROL_NONE; - } - } - - public void setFlowControl(String strFlow) { - fFlowControl = strFlow; - } - - @Override - public String getSummary() { - return getSerialPort() + ", " + //$NON-NLS-1$ - getBaudRateString() + ", " + //$NON-NLS-1$ - getDataBitsString() + ", " + //$NON-NLS-1$ - getStopBitsString() + ", " + //$NON-NLS-1$ - getParityString() + ", " + //$NON-NLS-1$ - getFlowControlString(); - } - - @Override - public void load(ISettingsStore store) { - fSerialPort = store.get("SerialPort", fProperties.getDefaultSerialPort());//$NON-NLS-1$ - fBaudRate = store.get("BaudRate", fProperties.getDefaultBaudRate());//$NON-NLS-1$ - fDataBits = store.get("DataBits", fProperties.getDefaultDataBits());//$NON-NLS-1$ - fStopBits = store.get("StopBits", fProperties.getDefaultStopBits());//$NON-NLS-1$ - fParity = store.get("Parity", fProperties.getDefaultParity());//$NON-NLS-1$ - fFlowControl = store.get("FlowControl", fProperties.getDefaultFlowControl());//$NON-NLS-1$ - fTimeout = store.get("Timeout",fProperties.getDefaultTimeout()); //$NON-NLS-1$ - } - - @Override - public void save(ISettingsStore store) { - store.put("SerialPort", fSerialPort); //$NON-NLS-1$ - store.put("BaudRate", fBaudRate); //$NON-NLS-1$ - store.put("DataBits", fDataBits); //$NON-NLS-1$ - store.put("StopBits", fStopBits); //$NON-NLS-1$ - store.put("Parity", fParity); //$NON-NLS-1$ - store.put("FlowControl", fFlowControl); //$NON-NLS-1$ - } - - public SerialProperties getProperties() { - return fProperties; - } - - @Override - public int getTimeout() { - try { - return Integer.parseInt(fTimeout); - } catch (NumberFormatException numberFormatException) { - return 10; - } - } - public String getTimeoutString() { - return fTimeout; - } - - public void setTimeout(String timeout) { - fTimeout = timeout; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/controls/SerialConfigurationPanel.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/controls/SerialConfigurationPanel.java deleted file mode 100644 index b1f6b66..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/controls/SerialConfigurationPanel.java +++ /dev/null @@ -1,133 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.controls; - -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; -import org.eclipse.tm.terminal.view.ui.panels.AbstractExtendedConfigurationPanel; - -/** - * Serial wizard configuration panel implementation. - */ -public class SerialConfigurationPanel extends AbstractExtendedConfigurationPanel { - - private SerialLinePanel serialSettingsPage; - - /** - * Constructor. - * - * @param container The configuration panel container or null. - */ - public SerialConfigurationPanel(IConfigurationPanelContainer container) { - super(container); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#setupPanel(org.eclipse.swt.widgets.Composite) - */ - @Override - public void setupPanel(Composite parent) { - Composite panel = new Composite(parent, SWT.NONE); - panel.setLayout(new GridLayout()); - GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); - panel.setLayoutData(data); - - // Create the host selection combo - if (isWithoutSelection()) createHostsUI(panel, true); - - serialSettingsPage = new SerialLinePanel(getContainer()); - serialSettingsPage.setupPanel(panel); - - // Create the encoding selection combo - createEncodingUI(panel, true); - - setControl(panel); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#extractData(java.util.Map) - */ - @Override - public void extractData(Map data) { - // set the terminal connector id for serial - data.put(ITerminalsConnectorConstants.PROP_TERMINAL_CONNECTOR_ID, "org.eclipse.tm.terminal.connector.serial.SerialConnector"); //$NON-NLS-1$ - - serialSettingsPage.extractData(data); - data.put(ITerminalsConnectorConstants.PROP_ENCODING, getEncoding()); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractExtendedConfigurationPanel#fillSettingsForHost(java.lang.String) - */ - @Override - protected void fillSettingsForHost(String host){ - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractExtendedConfigurationPanel#saveSettingsForHost(boolean) - */ - @Override - protected void saveSettingsForHost(boolean add){ - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#isValid() - */ - @Override - public boolean isValid(){ - return serialSettingsPage.isValid(); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractExtendedConfigurationPanel#doSaveWidgetValues(org.eclipse.jface.dialogs.IDialogSettings, java.lang.String) - */ - @Override - public void doSaveWidgetValues(IDialogSettings settings, String idPrefix) { - Assert.isNotNull(settings); - serialSettingsPage.doSaveWidgetValues(settings, idPrefix); - // Save the encodings widget values - doSaveEncodingsWidgetValues(settings, idPrefix); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractExtendedConfigurationPanel#doRestoreWidgetValues(org.eclipse.jface.dialogs.IDialogSettings, java.lang.String) - */ - @Override - public void doRestoreWidgetValues(IDialogSettings settings, String idPrefix) { - Assert.isNotNull(settings); - serialSettingsPage.doRestoreWidgetValues(settings, idPrefix); - // Restore the encodings widget values - doRestoreEncodingsWidgetValues(settings, idPrefix); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractExtendedConfigurationPanel#getHostFromSettings() - */ - @Override - protected String getHostFromSettings() { - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractExtendedConfigurationPanel#isWithHostList() - */ - @Override - public boolean isWithHostList() { - return false; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/controls/SerialLinePanel.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/controls/SerialLinePanel.java deleted file mode 100644 index fe760cb..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/controls/SerialLinePanel.java +++ /dev/null @@ -1,787 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.controls; - -import gnu.io.CommPortIdentifier; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.dialogs.IInputValidator; -import org.eclipse.jface.dialogs.IMessageProvider; -import org.eclipse.jface.dialogs.InputDialog; -import org.eclipse.jface.window.Window; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.BusyIndicator; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; -import org.eclipse.tm.terminal.connector.serial.activator.UIPlugin; -import org.eclipse.tm.terminal.connector.serial.interfaces.ITraceIds; -import org.eclipse.tm.terminal.connector.serial.nls.Messages; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; -import org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel; -import org.eclipse.ui.PlatformUI; - -/** - * Serial line terminal launcher configuration panel implementation. - */ -public class SerialLinePanel extends AbstractConfigurationPanel { - public static final String fcDefaultTTYSpeed = "9600"; //$NON-NLS-1$ - public static final String fcDefaultTTYDeviceWin32 = "COM1"; //$NON-NLS-1$ - public static final String fcDefaultTTYDeviceSolaris = "/dev/cua/a"; //$NON-NLS-1$ - public static final String fcDefaultTTYDeviceLinux = "/dev/ttyS0"; //$NON-NLS-1$ - public static final String fcDefaultTTYDatabits = "8"; //$NON-NLS-1$ - public static final String fcDefaultTTYParity = "None"; //$NON-NLS-1$ - public static final String fcDefaultTTYStopbits = "1"; //$NON-NLS-1$ - public static final String fcDefaultTTYFlowControl = "None"; //$NON-NLS-1$ - public static final String fcDefaultTTYTimeout = "5"; //$NON-NLS-1$ - public static final String fcEditableTTYOther = "Other..."; //$NON-NLS-1$ - - private static final String[] fcTTYSpeedRates = { "600", //$NON-NLS-1$ - "1200", //$NON-NLS-1$ - "2400", //$NON-NLS-1$ - "4800", //$NON-NLS-1$ - "9600", //$NON-NLS-1$ - "14400", //$NON-NLS-1$ - "19200", //$NON-NLS-1$ - "38400", //$NON-NLS-1$ - "57600", //$NON-NLS-1$ - "115200" //$NON-NLS-1$ - }; - - private static final String[] fcTTYDatabits = { - "8", "7" //$NON-NLS-1$ //$NON-NLS-2$ - }; - - private static final String[] fcTTYParity = { - "None", "Odd", "Even" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - }; - - private static final String[] fcTTYStopbits = { - "1", "2" //$NON-NLS-1$ //$NON-NLS-2$ - }; - - private static final String[] fcTTYFlowControl = { - "None", "Hardware", "Software" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - }; - - Label hostTTYDeviceLabel; - Combo hostTTYDeviceCombo; - Label hostTTYSpeedLabel; - Combo hostTTYSpeedCombo; - Label hostTTYBitsLabel; - Combo hostTTYBitsCombo; - Label hostTTYParityLabel; - Combo hostTTYParityCombo; - Label hostTTYStopbitsLabel; - Combo hostTTYStopbitsCombo; - Label hostTTYFlowControlLabel; - Combo hostTTYFlowControlCombo; - Label hostTTYTimeoutLabel; - Text hostTTYTimeoutText; - - // Keep the fInputValidator protected! - protected IInputValidator inputValidatorBaud; - - int lastSelected = -1; - int lastSelectedBaud = -1; - - /** - * Constructor. - * - * @param container The configuration panel container or null. - */ - public SerialLinePanel(IConfigurationPanelContainer container) { - super(container); - } - - protected class CustomSerialBaudRateInputValidator implements IInputValidator { - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.IInputValidator#isValid(java.lang.String) - */ - @Override - public String isValid(String newText) { - if (newText != null && newText.trim().length() > 0) { - if (!newText.matches("[0-9]*")) { //$NON-NLS-1$ - return Messages.SerialLinePanel_error_invalidCharactesBaudRate; - } - } else if (newText != null) { - // Empty string is an error without message (see interface)! - return ""; //$NON-NLS-1$ - } - return null; - } - } - - /** - * Returns the input validator to be used for checking the custom serial - * baud rate for basic plausibility. - */ - protected IInputValidator getCustomSerialBaudRateInputValidator() { - if (inputValidatorBaud == null) { - inputValidatorBaud = new CustomSerialBaudRateInputValidator(); - } - return inputValidatorBaud; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#setupPanel(org.eclipse.swt.widgets.Composite) - */ - @Override - public void setupPanel(Composite parent) { - Assert.isNotNull(parent); - - Composite panel = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(); - layout.marginHeight = 0; layout.marginWidth = 0; - panel.setLayout(layout); - panel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - panel.setBackground(parent.getBackground()); - - setControl(panel); - - final Composite client = new Composite(parent, SWT.NONE); - Assert.isNotNull(client); - client.setLayout(new GridLayout(2, false)); - client.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - client.setBackground(panel.getBackground()); - - // Host TTY settings - hostTTYDeviceLabel = new Label(client, SWT.NONE); - hostTTYDeviceLabel.setText(Messages.SerialLinePanel_hostTTYDevice_label); - - hostTTYDeviceCombo = new Combo(client, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY); - hostTTYDeviceCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - hostTTYDeviceCombo.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - // if the user selected the special editable device, show a dialog asking for the device name - if (fcEditableTTYOther.equals(hostTTYDeviceCombo.getText())) { - List tty = new ArrayList(); - List tcp = new ArrayList(); - String selected = hostTTYDeviceCombo.getItem(lastSelected); - for (String device : hostTTYDeviceCombo.getItems()) { - if (!device.equalsIgnoreCase(fcEditableTTYOther)) { - if (device.toUpperCase().startsWith("TCP:")) { //$NON-NLS-1$ - tcp.add(device); - } - else { - tty.add(device); - } - } - } - SerialPortAddressDialog dialog = new SerialPortAddressDialog(client.getShell(), selected, tty, tcp); - if (dialog.open() == Window.OK) { - // retrieve the custom serial device name and set it to the combobox drop - String device = dialog.getData(); - if (device != null && device.trim().length() > 0) { - hostTTYDeviceCombo.add(device.trim()); - hostTTYDeviceCombo.setText(device.trim()); - } else if (lastSelected != -1) { - hostTTYDeviceCombo.setText(hostTTYDeviceCombo.getItem(lastSelected)); - } - } else if (lastSelected != -1){ - hostTTYDeviceCombo.setText(hostTTYDeviceCombo.getItem(lastSelected)); - } - } - lastSelected = hostTTYDeviceCombo.getSelectionIndex(); - - IConfigurationPanelContainer container = SerialLinePanel.this.getContainer(); - if (container != null) container.validate(); - } - }); - - hostTTYSpeedLabel = new Label(client, SWT.NONE); - hostTTYSpeedLabel.setText(Messages.SerialLinePanel_hostTTYSpeed_label); - - hostTTYSpeedCombo = new Combo(client, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY); - hostTTYSpeedCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - hostTTYSpeedCombo.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - // if the user selected the special editable baud rate, show a dialog asking for the baud rate - if (fcEditableTTYOther.equals(hostTTYSpeedCombo.getText())) { - InputDialog dialog = new InputDialog(getControl().getShell(), - Messages.SerialLinePanel_customSerialBaudRate_title, - Messages.SerialLinePanel_customSerialBaudRate_message, - "", //$NON-NLS-1$ - getCustomSerialBaudRateInputValidator()); - if (dialog.open() == Window.OK) { - // retrieve the custom serial device name and set it to the combobox drop - String device = dialog.getValue(); - if (device != null && device.trim().length() > 0) { - int index = hostTTYSpeedCombo.indexOf(fcEditableTTYOther); - if (index != -1 && index == hostTTYSpeedCombo.getItemCount() - 1) { - hostTTYSpeedCombo.add(device.trim()); - } else if (index != -1) { - hostTTYSpeedCombo.setItem(index + 1, device.trim()); - } - hostTTYSpeedCombo.setText(device.trim()); - } else if (lastSelectedBaud != -1) { - hostTTYSpeedCombo.setText(hostTTYSpeedCombo.getItem(lastSelectedBaud)); - } - } else if (lastSelectedBaud != -1){ - hostTTYSpeedCombo.setText(hostTTYSpeedCombo.getItem(lastSelectedBaud)); - } - } - lastSelectedBaud = hostTTYSpeedCombo.getSelectionIndex(); - - IConfigurationPanelContainer container = SerialLinePanel.this.getContainer(); - if (container != null) container.validate(); - } - }); - - // Query the list of available serial port interfaces. - UIPlugin.getTraceHandler().trace("SerialLinePanel: Start quering the available comm ports.", ITraceIds.TRACE_SERIAL_LINE_PANEL, this); //$NON-NLS-1$ - - // Query the serial devices now. - BusyIndicator.showWhile(getControl().getDisplay(), new Runnable() { - @Override - public void run() { - queryAvailableSerialDevices(); - } - }); - - // add a special device which is being the editable one if requested at the end of the list - hostTTYDeviceCombo.add(fcEditableTTYOther); - - if (hostTTYDeviceCombo.indexOf(getDefaultHostTTYDevice()) != -1) { - hostTTYDeviceCombo.setText(getDefaultHostTTYDevice()); - } else { - if ("".equals(hostTTYDeviceCombo.getText()) && hostTTYDeviceCombo.getItemCount() > 0) { //$NON-NLS-1$ - // USI: For SWT-GTK we need the special empty entry as well. Otherwise we will have problems - // getting the selection changed event! - if (hostTTYDeviceCombo.getItemCount() == 1 - && fcEditableTTYOther.equals(hostTTYDeviceCombo.getItem(0))) { - hostTTYDeviceCombo.add("", 0); //$NON-NLS-1$ - } - hostTTYDeviceCombo.setText(hostTTYDeviceCombo.getItem(0)); - } - } - - if (hostTTYDeviceCombo.getItemCount() > 0) { - hostTTYDeviceCombo.setEnabled(true); - } else { - hostTTYDeviceCombo.setEnabled(false); - } - lastSelected = hostTTYDeviceCombo.getSelectionIndex(); - - for (String fcTTYSpeedRate : fcTTYSpeedRates) { - hostTTYSpeedCombo.add(fcTTYSpeedRate); - } - hostTTYSpeedCombo.add(fcEditableTTYOther); - - hostTTYSpeedCombo.setText(fcDefaultTTYSpeed); - lastSelectedBaud = hostTTYSpeedCombo.getSelectionIndex(); - - // add the advanced serial options - hostTTYBitsLabel = new Label(client, SWT.NONE); - hostTTYBitsLabel.setText(Messages.SerialLinePanel_hostTTYDatabits_label); - hostTTYBitsCombo = new Combo(client, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY); - hostTTYBitsCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - hostTTYBitsCombo.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - IConfigurationPanelContainer container = SerialLinePanel.this.getContainer(); - if (container != null) container.validate(); - } - }); - - for (String fcTTYDatabit : fcTTYDatabits) { - hostTTYBitsCombo.add(fcTTYDatabit); - } - hostTTYBitsCombo.setText(fcDefaultTTYDatabits); - - hostTTYParityLabel = new Label(client, SWT.NONE); - hostTTYParityLabel.setText(Messages.SerialLinePanel_hostTTYParity_label); - hostTTYParityCombo = new Combo(client, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY); - hostTTYParityCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - hostTTYParityCombo.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - IConfigurationPanelContainer container = SerialLinePanel.this.getContainer(); - if (container != null) container.validate(); - } - }); - - for (String element : fcTTYParity) { - hostTTYParityCombo.add(element); - } - hostTTYParityCombo.setText(fcDefaultTTYParity); - - hostTTYStopbitsLabel = new Label(client, SWT.NONE); - hostTTYStopbitsLabel.setText(Messages.SerialLinePanel_hostTTYStopbits_label); - hostTTYStopbitsCombo = new Combo(client, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY); - hostTTYStopbitsCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - hostTTYStopbitsCombo.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - IConfigurationPanelContainer container = SerialLinePanel.this.getContainer(); - if (container != null) container.validate(); - } - }); - - for (String fcTTYStopbit : fcTTYStopbits) { - hostTTYStopbitsCombo.add(fcTTYStopbit); - } - hostTTYStopbitsCombo.setText(fcDefaultTTYStopbits); - - hostTTYFlowControlLabel = new Label(client, SWT.NONE); - hostTTYFlowControlLabel.setText(Messages.SerialLinePanel_hostTTYFlowControl_label); - hostTTYFlowControlCombo = new Combo(client, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY); - hostTTYFlowControlCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - hostTTYFlowControlCombo.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - IConfigurationPanelContainer container = SerialLinePanel.this.getContainer(); - if (container != null) container.validate(); - } - }); - - for (String element : fcTTYFlowControl) { - hostTTYFlowControlCombo.add(element); - } - hostTTYFlowControlCombo.setText(fcDefaultTTYFlowControl); - - hostTTYTimeoutLabel = new Label(client, SWT.NONE); - hostTTYTimeoutLabel.setText(Messages.SerialLinePanel_hostTTYTimeout_label); - hostTTYTimeoutText = new Text(client, SWT.SINGLE | SWT.BORDER); - hostTTYTimeoutText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - hostTTYTimeoutText.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - IConfigurationPanelContainer container = SerialLinePanel.this.getContainer(); - if (container != null) container.validate(); - } - }); - hostTTYTimeoutText.setText(fcDefaultTTYTimeout); - } - - /** - * Query the list of serial devices. - */ - protected void queryAvailableSerialDevices() { - // Avoid printing the library version output to stdout if the platform - // is not in debug mode. - String prop = System.getProperty("gnu.io.rxtx.NoVersionOutput"); //$NON-NLS-1$ - if (prop == null && !Platform.inDebugMode()) { - System.setProperty("gnu.io.rxtx.NoVersionOutput", "true"); //$NON-NLS-1$ //$NON-NLS-2$ - } - - // java.lang.UnsatisfiedLinkError: ../plugins/gnu.io.rxtx.solaris.sparc_2.1.7.200702281917/os/solaris/sparc/librxtxSerial.so: - // Can't load Sparc 32-bit .so on a Sparc 32-bit platform - // May happen in CommPortIdentifier static constructor! - try { - Enumeration ttyPortIds = CommPortIdentifier.getPortIdentifiers(); - if (!ttyPortIds.hasMoreElements()) { - UIPlugin.getTraceHandler().trace("SerialLinePanel: NO comm ports available at all!", ITraceIds.TRACE_SERIAL_LINE_PANEL, this); //$NON-NLS-1$ - } - final List ports = new ArrayList(); - while (ttyPortIds.hasMoreElements()) { - CommPortIdentifier port = ttyPortIds.nextElement(); - String type = "unknown"; //$NON-NLS-1$ - if (port.getPortType() == CommPortIdentifier.PORT_PARALLEL) { - type = "parallel"; //$NON-NLS-1$ - } - if (port.getPortType() == CommPortIdentifier.PORT_SERIAL) { - type = "serial"; //$NON-NLS-1$ - } - UIPlugin.getTraceHandler().trace("SerialLinePanel: Found comm port: name='" + port.getName() + "', type='" + type, ITraceIds.TRACE_SERIAL_LINE_PANEL, this); //$NON-NLS-1$ //$NON-NLS-2$ - // only add serial ports - if (port.getPortType() == CommPortIdentifier.PORT_SERIAL) { - UIPlugin.getTraceHandler().trace("SerialLinePanel: Adding found serial comm port to combo!", ITraceIds.TRACE_SERIAL_LINE_PANEL, this); //$NON-NLS-1$ - if (!ports.contains(port.getName())) { - ports.add(port.getName()); - } - } - } - if (!ports.isEmpty()) { - Collections.sort(ports); - // This method may executed in a separate thread. We must spawn back - // into the UI thread to execute the adding of the ports to the control. - PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() { - @Override - public void run() { - for (String port : ports) { - hostTTYDeviceCombo.add(port); - } - } - }); - } - } catch (UnsatisfiedLinkError e) { - IStatus status = new Status(IStatus.WARNING, UIPlugin.getUniqueIdentifier(), - Messages.SerialLinePanel_warning_FailedToLoadSerialPorts, e); - UIPlugin.getDefault().getLog().log(status); - } catch (NoClassDefFoundError e) { - // The NoClassDefFoundError happens the second time if the load of the library - // failed once! We do ignore this error completely! - } - } - - /** - * Enables or disables the configuration panels controls. - * - * @param enabled Specify true to enable the controls, false otherwise. - */ - @Override - public void setEnabled(boolean enabled) { - hostTTYDeviceLabel.setEnabled(enabled); - hostTTYDeviceCombo.setEnabled(enabled); - hostTTYSpeedLabel.setEnabled(enabled); - hostTTYSpeedCombo.setEnabled(enabled); - hostTTYBitsLabel.setEnabled(enabled); - hostTTYBitsCombo.setEnabled(enabled); - hostTTYParityLabel.setEnabled(enabled); - hostTTYParityCombo.setEnabled(enabled); - hostTTYStopbitsLabel.setEnabled(enabled); - hostTTYStopbitsCombo.setEnabled(enabled); - hostTTYFlowControlLabel.setEnabled(enabled); - hostTTYFlowControlCombo.setEnabled(enabled); - } - - /** - * The name of the serial ports differ between the host platforms, so we have to - * detect the default host TTY device based on the host platform. - */ - public String getDefaultHostTTYDevice() { - String osName = System.getProperty("os.name"); //$NON-NLS-1$ - // Linux ? - if (osName.equalsIgnoreCase("Linux")) { //$NON-NLS-1$ - return fcDefaultTTYDeviceLinux; - } - // Solaris ? - if (osName.equalsIgnoreCase("SunOS")) { //$NON-NLS-1$ - return fcDefaultTTYDeviceSolaris; - } - // Windows ? - if (osName.toLowerCase().startsWith("windows")) { //$NON-NLS-1$ - return fcDefaultTTYDeviceWin32; - } - return ""; //$NON-NLS-1$ - } - - /** - * Returns the default value for the serial port speed setting in bit/s - */ - public String getDefaultHostTTYSpeed() { - return fcDefaultTTYSpeed; - } - - /** - * Returns the default value for the serial port data bits setting - */ - public String getDefaultHostTTYDatabits() { - return fcDefaultTTYDatabits; - } - - /** - * Returns the default value for the serial port parity setting - */ - public String getDefaultHostTTYParity() { - return fcDefaultTTYParity; - } - - /** - * Returns the default value for the serial port stop bits setting - */ - public String getDefaultHostTTYStopbits() { - return fcDefaultTTYStopbits; - } - - /** - * Returns the default value for the serial port flow control setting - */ - public String getDefaultHostTTYFlowControl() { - return fcDefaultTTYFlowControl; - } - - /** - * Returns the default value for the serial port timeout setting. - */ - public String getDefaultHostTTYTimeout() { - return fcDefaultTTYTimeout; - } - - /** - * Set the text to the combo if available as selectable option. - * - * @param combo The combo box control. Must not be null. - * @param value The value to set. Must not be null. - */ - protected void doSetTextInCombo(Combo combo, String value) { - Assert.isNotNull(combo); - Assert.isNotNull(value); - if (combo.indexOf(value) != 1) { - combo.setText(value); - } - } - - /** - * Select the given tty device if available. - * - * @param value The tty device to select. Must not be null. - */ - public void setSelectedTTYDevice(String value) { - doSetTextInCombo(hostTTYDeviceCombo, value); - } - - /** - * Select the given tty device if available. The method - * will do nothing if the specified index is invalid. - * - * @param index The index of the tty device to select. - */ - public void setSelectedTTYDevice(int index) { - if (index >= 0 && index < hostTTYDeviceCombo.getItemCount()) { - hostTTYDeviceCombo.setText(hostTTYDeviceCombo.getItem(index)); - } - } - - /** - * Select the given tty device speed if available. - * - * @param value The tty device speed to select. Must not be null. - */ - public void setSelectedTTYSpeed(String value) { - doSetTextInCombo(hostTTYSpeedCombo, value); - } - - /** - * Select the given tty device data bit configuration if available. - * - * @param value The tty device data bit configuration to select. Must not be null. - */ - public void setSelectedTTYDatabits(String value) { - doSetTextInCombo(hostTTYBitsCombo, value); - } - - /** - * Select the given tty device parity configuration if available. - * - * @param value The tty device parity configuration to select. Must not be null. - */ - public void setSelectedTTYParity(String value) { - doSetTextInCombo(hostTTYParityCombo, value); - } - - /** - * Select the given tty device stop bit configuration if available. - * - * @param value The tty device stop bit configuration to select. Must not be null. - */ - public void setSelectedTTYStopbits(String value) { - doSetTextInCombo(hostTTYStopbitsCombo, value); - } - - /** - * Select the given tty device flow control configuration if available. - * - * @param value The tty device flow control configuration to select. Must not be null. - */ - public void setSelectedTTYFlowControl(String value) { - doSetTextInCombo(hostTTYFlowControlCombo, value); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#isValid() - */ - @Override - public boolean isValid() { - String selectedTTYDevice = hostTTYDeviceCombo.getText(); - if (selectedTTYDevice == null || selectedTTYDevice.trim().length() == 0) { - setMessage(Messages.SerialLinePanel_error_emptyHostTTYDevice, IMessageProvider.ERROR); - return false; - } - - if (fcEditableTTYOther.equals(selectedTTYDevice)) { - setMessage(Messages.SerialLinePanel_info_editableTTYDeviceSelected, IMessageProvider.INFORMATION); - return false; - } - - String selectedTTYSpeedRate = hostTTYSpeedCombo.getText(); - if (selectedTTYSpeedRate == null || selectedTTYSpeedRate.trim().length() == 0) { - setMessage(Messages.SerialLinePanel_error_emptyHostTTYSpeedRate, IMessageProvider.ERROR); - return false; - } - - if (fcEditableTTYOther.equals(selectedTTYSpeedRate)) { - setMessage(Messages.SerialLinePanel_info_editableTTYBaudRateSelected, IMessageProvider.INFORMATION); - return false; - } - - String option = hostTTYBitsCombo.getText(); - if (option == null || option.trim().length() == 0) { - setMessage(Messages.SerialLinePanel_error_emptyHostTTYDatabits, IMessageProvider.ERROR); - return false; - } - - option = hostTTYParityCombo.getText(); - if (option == null || option.trim().length() == 0) { - setMessage(Messages.SerialLinePanel_error_emptyHostTTYParity, IMessageProvider.ERROR); - return false; - } - - option = hostTTYStopbitsCombo.getText(); - if (option == null || option.trim().length() == 0) { - setMessage(Messages.SerialLinePanel_error_emptyHostTTYStopbits, IMessageProvider.ERROR); - return false; - } - - option = hostTTYFlowControlCombo.getText(); - if (option == null || option.trim().length() == 0) { - setMessage(Messages.SerialLinePanel_error_emptyHostTTYFlowControl, IMessageProvider.ERROR); - return false; - } - - option = hostTTYTimeoutText.getText(); - if (option == null || option.trim().length() == 0) { - setMessage(Messages.SerialLinePanel_error_emptyHostTTYFlowControl, IMessageProvider.ERROR); - return false; - } - - return true; - } - - private final String fcSelectedTTYDeviceSlotId = "SerialLinePanel.selectedTTYDevice." + System.getProperty("os.name"); //$NON-NLS-1$ //$NON-NLS-2$ - private final String fcSelectedTTYSpeedRateSlotId = "SerialLinePanel.selectedTTYSpeedRate." + System.getProperty("os.name"); //$NON-NLS-1$ //$NON-NLS-2$ - private final String fcSelectedTTYDatabitsSlotId = "SerialLinePanel.selectedTTYDatabits." + System.getProperty("os.name"); //$NON-NLS-1$ //$NON-NLS-2$ - private final String fcSelectedTTYParitySlotId = "SerialLinePanel.selectedTTYParity." + System.getProperty("os.name"); //$NON-NLS-1$ //$NON-NLS-2$ - private final String fcSelectedTTYStopbitsSlotId = "SerialLinePanel.selectedTTYStopbits." + System.getProperty("os.name"); //$NON-NLS-1$ //$NON-NLS-2$ - private final String fcSelectedTTYFlowControlSlotId = "SerialLinePanel.selectedTTYFlowControl." + System.getProperty("os.name"); //$NON-NLS-1$ //$NON-NLS-2$ - private final String fcSelectedTTYTimeoutSlotId = "SerialLinePanel.selectedTTYTimeout." + System.getProperty("os.name"); //$NON-NLS-1$ //$NON-NLS-2$ - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#doRestoreWidgetValues(org.eclipse.jface.dialogs.IDialogSettings, java.lang.String) - */ - @Override - public void doRestoreWidgetValues(IDialogSettings settings, String idPrefix) { - Assert.isNotNull(settings); - - String selectedTTYDevice = settings.get(prefixDialogSettingsSlotId(fcSelectedTTYDeviceSlotId, idPrefix)); - if (selectedTTYDevice != null && selectedTTYDevice.trim().length() > 0) { - if (hostTTYDeviceCombo.indexOf(selectedTTYDevice) != -1) { - hostTTYDeviceCombo.setText(selectedTTYDevice); - } - } - - String selectedTTYSpeedRate = settings.get(prefixDialogSettingsSlotId(fcSelectedTTYSpeedRateSlotId, idPrefix)); - if (selectedTTYSpeedRate != null && selectedTTYSpeedRate.trim().length() > 0) { - if (hostTTYSpeedCombo.indexOf(selectedTTYSpeedRate) != -1) { - hostTTYSpeedCombo.setText(selectedTTYSpeedRate); - } - } - - String option = settings.get(prefixDialogSettingsSlotId(fcSelectedTTYDatabitsSlotId, idPrefix)); - if (option != null && option.trim().length() > 0 && hostTTYBitsCombo.indexOf(option) != -1) { - hostTTYBitsCombo.setText(option); - } - - option = settings.get(prefixDialogSettingsSlotId(fcSelectedTTYParitySlotId, idPrefix)); - if (option != null && option.trim().length() > 0 && hostTTYParityCombo.indexOf(option) != -1) { - hostTTYParityCombo.setText(option); - } - - option = settings.get(prefixDialogSettingsSlotId(fcSelectedTTYStopbitsSlotId, idPrefix)); - if (option != null && option.trim().length() > 0 && hostTTYStopbitsCombo.indexOf(option) != -1) { - hostTTYStopbitsCombo.setText(option); - } - - option = settings.get(prefixDialogSettingsSlotId(fcSelectedTTYFlowControlSlotId, idPrefix)); - if (option != null && option.trim().length() > 0 && hostTTYFlowControlCombo.indexOf(option) != -1) { - hostTTYFlowControlCombo.setText(option); - } - - option = settings.get(prefixDialogSettingsSlotId(fcSelectedTTYTimeoutSlotId, idPrefix)); - if (option != null && option.trim().length() > 0 && !option.equals(hostTTYTimeoutText.getText())) { - hostTTYTimeoutText.setText(option); - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#doSaveWidgetValues(org.eclipse.jface.dialogs.IDialogSettings, java.lang.String) - */ - @Override - public void doSaveWidgetValues(IDialogSettings settings, String idPrefix) { - Assert.isNotNull(settings); - - settings.put(prefixDialogSettingsSlotId(fcSelectedTTYDeviceSlotId, idPrefix), hostTTYDeviceCombo.getText()); - settings.put(prefixDialogSettingsSlotId(fcSelectedTTYSpeedRateSlotId, idPrefix), hostTTYSpeedCombo.getText()); - - settings.put(prefixDialogSettingsSlotId(fcSelectedTTYDatabitsSlotId, idPrefix), hostTTYBitsCombo.getText()); - settings.put(prefixDialogSettingsSlotId(fcSelectedTTYParitySlotId, idPrefix), hostTTYParityCombo.getText()); - settings.put(prefixDialogSettingsSlotId(fcSelectedTTYStopbitsSlotId, idPrefix), hostTTYStopbitsCombo.getText()); - settings.put(prefixDialogSettingsSlotId(fcSelectedTTYFlowControlSlotId, idPrefix), hostTTYFlowControlCombo.getText()); - settings.put(prefixDialogSettingsSlotId(fcSelectedTTYTimeoutSlotId, idPrefix), hostTTYTimeoutText.getText()); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#setupData(java.util.Map) - */ - @Override - public void setupData(Map data) { - if (data == null) return; - - hostTTYDeviceCombo.setText((String)data.get(ITerminalsConnectorConstants.PROP_SERIAL_DEVICE)); - hostTTYSpeedCombo.setText((String)data.get(ITerminalsConnectorConstants.PROP_SERIAL_BAUD_RATE)); - - hostTTYBitsCombo.setText((String)data.get(ITerminalsConnectorConstants.PROP_SERIAL_DATA_BITS)); - hostTTYParityCombo.setText((String)data.get(ITerminalsConnectorConstants.PROP_SERIAL_PARITY)); - hostTTYStopbitsCombo.setText((String)data.get(ITerminalsConnectorConstants.PROP_SERIAL_STOP_BITS)); - hostTTYFlowControlCombo.setText((String)data.get(ITerminalsConnectorConstants.PROP_SERIAL_FLOW_CONTROL)); - - Object value = data.get(ITerminalsConnectorConstants.PROP_TIMEOUT); - if (value instanceof Integer) { - hostTTYTimeoutText.setText(((Integer)value).toString()); - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#extractData(java.util.Map) - */ - @Override - public void extractData(Map data) { - if (data == null) return; - - data.put(ITerminalsConnectorConstants.PROP_SERIAL_DEVICE, hostTTYDeviceCombo.getText()); - data.put(ITerminalsConnectorConstants.PROP_SERIAL_BAUD_RATE, hostTTYSpeedCombo.getText()); - - data.put(ITerminalsConnectorConstants.PROP_SERIAL_DATA_BITS, hostTTYBitsCombo.getText()); - data.put(ITerminalsConnectorConstants.PROP_SERIAL_PARITY, hostTTYParityCombo.getText()); - data.put(ITerminalsConnectorConstants.PROP_SERIAL_STOP_BITS, hostTTYStopbitsCombo.getText()); - data.put(ITerminalsConnectorConstants.PROP_SERIAL_FLOW_CONTROL, hostTTYFlowControlCombo.getText()); - - if (hostTTYTimeoutText.getText() != null) { - Integer timeout = null; - try { - timeout = Integer.decode(hostTTYTimeoutText.getText()); - } catch (NumberFormatException e) { /* ignored on purpose */ } - if (timeout != null) data.put(ITerminalsConnectorConstants.PROP_TIMEOUT, timeout); - else data.remove(ITerminalsConnectorConstants.PROP_TIMEOUT); - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/controls/SerialPortAddressDialog.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/controls/SerialPortAddressDialog.java deleted file mode 100644 index 52ff590..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/controls/SerialPortAddressDialog.java +++ /dev/null @@ -1,689 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.controls; - -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.dialogs.IMessageProvider; -import org.eclipse.jface.dialogs.TitleAreaDialog; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.ScrolledComposite; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.VerifyEvent; -import org.eclipse.swt.events.VerifyListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.tm.terminal.connector.serial.activator.UIPlugin; -import org.eclipse.tm.terminal.connector.serial.nls.Messages; -import org.eclipse.ui.PlatformUI; - -/** - * Serial line port or address dialog. - */ -public class SerialPortAddressDialog extends TitleAreaDialog implements IMessageProvider { - private String contextHelpId = null; - - private String message; - private int messageType; - private String errorMessage; - private String title; - - // The default message is shown to the user if no other message is set - private String defaultMessage; - private int defaultMessageType; - - Button ttyControlSelector; - Combo ttyControl; - Button tcpControlSelector; - Combo addressControl; - Combo portControl; - Label portLabel; - - List ttyHistory; - List tcpHistory; - - String data = null; - - // regular expressions for validator - /* default */ static final String IP_CHARACTERS_REGEX = "[0-9][0-9\\.]*"; //$NON-NLS-1$ - /* default */ static final String IP_FRAGMENT_REGEX = "([0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])"; //$NON-NLS-1$ - /* default */ static final String IP_REGEX = IP_FRAGMENT_REGEX + "(\\." + IP_FRAGMENT_REGEX + "){3}[ ]*"; //$NON-NLS-1$ //$NON-NLS-2$ - - // RFC 1034 - ftp://ftp.rfc-editor.org/in-notes/std/std13.txt - /* default */ static final String NAME_CHARACTERS_REGEX = "[a-zA-Z][0-9a-zA-Z\\-_\\.]*"; //$NON-NLS-1$ - // characters that can be set at the beginning - /* default */ static final String NAME_START_REGEX = "[a-zA-Z]"; //$NON-NLS-1$ - // characters that can be set after the starting character - /* default */ static final String NAME_FOLLOW_REGEX = "[a-zA-Z0-9-_]"; //$NON-NLS-1$ - // characters that can be set at the end - /* default */ static final String NAME_END_REGEX = "[a-zA-Z0-9]"; //$NON-NLS-1$ - // single name fragment - /* default */ static final String NAME_FRAGMENT_REGEX = "(" + NAME_START_REGEX + "(" + NAME_FOLLOW_REGEX + "*" + NAME_END_REGEX + ")?)"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - - /* default */ static final String NAME_REGEX = NAME_FRAGMENT_REGEX + "(\\." + NAME_FRAGMENT_REGEX + ")*[ ]*"; //$NON-NLS-1$ //$NON-NLS-2$ - - /** - * Constructor. - * @param parentShell - */ - public SerialPortAddressDialog(Shell parentShell, String selected, List ttyHistory, List tcpHistory) { - super(parentShell); - this.ttyHistory = ttyHistory; - this.tcpHistory = tcpHistory; - this.data = selected; - - this.contextHelpId = UIPlugin.getUniqueIdentifier() + ".SerialPortAddressDialog"; //$NON-NLS-1$ - setHelpAvailable(true); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#isResizable() - */ - @Override - protected boolean isResizable() { - return true; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#create() - */ - @Override - public void create() { - super.create(); - - // If the dialog got set a message, make sure the message is really shown - // to the user from the beginning. - if (isMessageSet()) { - if (errorMessage != null) { - super.setErrorMessage(errorMessage); - } - else { - super.setMessage(message, messageType); - } - } else if (defaultMessage != null) { - // Default message set - super.setMessage(defaultMessage, defaultMessageType); - } - - // If the dialog got set a title, make sure the title is shown - if (title != null) { - super.setTitle(title); - } - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) - */ - @Override - protected final Control createDialogArea(Composite parent) { - if (contextHelpId != null) { - PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, contextHelpId); - } - - // Let the super implementation create the dialog area control - Control control = super.createDialogArea(parent); - // Setup the inner panel as scrollable composite - if (control instanceof Composite) { - ScrolledComposite sc = new ScrolledComposite((Composite)control, SWT.V_SCROLL); - - GridLayout layout = new GridLayout(1, true); - layout.marginHeight = 0; layout.marginWidth = 0; - layout.verticalSpacing = 0; layout.horizontalSpacing = 0; - - sc.setLayout(layout); - sc.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL)); - - sc.setExpandHorizontal(true); - sc.setExpandVertical(true); - - Composite composite = new Composite(sc, SWT.NONE); - composite.setLayout(new GridLayout()); - - // Setup the dialog area content - createDialogAreaContent(composite); - - sc.setContent(composite); - sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); - - // Return the scrolled composite as new dialog area control - control = sc; - } - - return control; - } - - /** - * Creates the dialog area content. - * - * @param parent The parent composite. Must not be null. - */ - protected void createDialogAreaContent(Composite parent) { - Assert.isNotNull(parent); - - setDialogTitle(Messages.SerialPortAddressDialog_dialogtitle); - setTitle(Messages.SerialPortAddressDialog_title); - - Composite ttyComp = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(); - ttyComp.setLayout(layout); - GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); - layoutData.widthHint = 250; - ttyComp.setLayoutData(layoutData); - - Composite panel = new Composite(ttyComp, SWT.NONE); - layout = new GridLayout(2, false); - layout.marginHeight = 0; layout.marginWidth = 0; - panel.setLayout(layout); - layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); - panel.setLayoutData(layoutData); - - ttyControlSelector = new Button(panel, SWT.RADIO); - ttyControlSelector.setText(Messages.SerialLinePanel_hostTTYDevice_label); - layoutData = new GridData(SWT.LEAD, SWT.CENTER, false, false); - ttyControlSelector.setLayoutData(layoutData); - ttyControlSelector.setSelection(true); - ttyControlSelector.addSelectionListener(new SelectionAdapter(){ - @Override - public void widgetSelected(SelectionEvent e) { - boolean selected = ttyControlSelector.getSelection(); - setTTYControlEnabled(selected); - setTCPControlEnabled(!selected); - onModify(); - } - }); - - ttyControl = new Combo(panel, SWT.DROP_DOWN); - layoutData = new GridData(SWT.FILL, SWT.FILL, true, true); - ttyControl.setLayoutData(layoutData); - ttyControl.addModifyListener(new ModifyListener(){ - @Override - public void modifyText(ModifyEvent e) { - onModify(); - } - }); - - parent.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - boolean enable = ttyHistory != null && ttyHistory.contains(data); - setTTYControlEnabled(enable); - setTCPControlEnabled(!enable); - onModify(); - } - }); - - Composite tcpComp = new Composite(parent, SWT.NONE); - layout = new GridLayout(2, true); - tcpComp.setLayout(layout); - layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); - tcpComp.setLayoutData(layoutData); - - Composite tcpAddrComp = new Composite(tcpComp, SWT.NONE); - layout = new GridLayout(2, false); - layout.marginWidth = 0; layout.marginHeight = 0; - tcpAddrComp.setLayout(layout); - layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); - tcpAddrComp.setLayoutData(layoutData); - - tcpControlSelector = new Button(tcpAddrComp, SWT.RADIO); - tcpControlSelector.setText(Messages.SerialPortAddressDialog_address); - layoutData = new GridData(SWT.LEAD, SWT.CENTER, false, false); - tcpControlSelector.setLayoutData(layoutData); - tcpControlSelector.setSelection(false); - tcpControlSelector.addSelectionListener(new SelectionAdapter(){ - @Override - public void widgetSelected(SelectionEvent e) { - boolean selected = tcpControlSelector.getSelection(); - setTTYControlEnabled(!selected); - setTCPControlEnabled(selected); - onModify(); - } - }); - - addressControl = new Combo(tcpAddrComp, SWT.DROP_DOWN); - layoutData = new GridData(SWT.FILL, SWT.FILL, true, true); - addressControl.setLayoutData(layoutData); - addressControl.addModifyListener(new ModifyListener(){ - @Override - public void modifyText(ModifyEvent e) { - onModify(); - } - }); - - Composite tcpPortComp = new Composite(tcpComp, SWT.NONE); - layout = new GridLayout(2, false); - layout.marginWidth = 0; layout.marginHeight = 0; - tcpPortComp.setLayout(layout); - layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); - tcpPortComp.setLayoutData(layoutData); - - portLabel = new Label(tcpPortComp, SWT.HORIZONTAL); - portLabel.setText(Messages.SerialPortAddressDialog_port); - layoutData = new GridData(SWT.LEAD, SWT.CENTER, false, false); - portLabel.setLayoutData(layoutData); - - portControl = new Combo(tcpPortComp, SWT.DROP_DOWN); - layoutData = new GridData(SWT.FILL, SWT.FILL, true, true); - portControl.setLayoutData(layoutData); - portControl.addVerifyListener(new VerifyListener() { - @Override - public void verifyText(VerifyEvent e) { - StringBuilder buffer = new StringBuilder(((Combo)e.widget).getText()); - - try { - if (e.end > e.start) { - buffer.replace(e.start, e.end, e.text); - } else if (e.end >= 0) { - buffer.insert(e.end, e.text); - } - } catch (StringIndexOutOfBoundsException exc) { /* ignored on purpose */ } - - String fulltext = buffer.toString(); - e.doit = fulltext.matches("([0-9]{0,5})|(0((x|X)[0-9a-fA-F]{0,4})?)"); //$NON-NLS-1$ - - if (e.doit && fulltext.length() > 0 && !fulltext.equalsIgnoreCase("0x")) { //$NON-NLS-1$ - try { - int value = Integer.decode(fulltext).intValue(); - if (value < 0 || value > 65535) { - e.doit = false; - } - } - catch (Exception ex) { - e.doit = false; - } - } - } - }); - portControl.addModifyListener(new ModifyListener(){ - @Override - public void modifyText(ModifyEvent e) { - onModify(); - } - }); - - // Trigger the runnable after having created all controls! - parent.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - boolean enable = tcpHistory != null && tcpHistory.contains(data); - setTTYControlEnabled(!enable); - setTCPControlEnabled(enable); - onModify(); - } - }); - - applyDialogFont(ttyComp); - applyDialogFont(tcpComp); - - setupData(); - } - - private void setupData() { - setTTYControlEnabled(true); - setTCPControlEnabled(false); - if (ttyHistory != null && !ttyHistory.isEmpty()) { - for (String tty : ttyHistory) { - if (tty != null && tty.trim().length() > 0 && ttyControl.indexOf(tty) == -1) { - ttyControl.add(tty.trim()); - } - if (tty != null && tty.equals(data)) { - ttyControl.setText(tty.trim()); - } - } - } - if (tcpHistory != null && !tcpHistory.isEmpty()) { - for (String tcp : tcpHistory) { - String[] data = tcp.split(":"); //$NON-NLS-1$ - if (data.length > 1) { - if (data[1] != null && data[1].trim().length() > 0 && ttyControl.indexOf(data[1]) == -1) { - addressControl.add(data[1].trim()); - } - } - if (data.length > 2) { - if (data[2] != null && data[2].trim().length() > 0 && ttyControl.indexOf(data[2]) == -1) { - addressControl.add(data[2].trim()); - } - } - if (tcp.equals(this.data)) { - setTTYControlEnabled(false); - setTCPControlEnabled(true); - if (data.length > 1) { - addressControl.setText(data[1]); - } - if (data.length > 2) { - portControl.setText(data[2]); - } - } - } - } - onModify(); - } - - void setTTYControlEnabled(boolean enable) { - ttyControlSelector.setSelection(enable); - ttyControl.setEnabled(enable); - } - - void setTCPControlEnabled(boolean enable) { - tcpControlSelector.setSelection(enable); - addressControl.setEnabled(enable); - portControl.setEnabled(enable); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite) - */ - @Override - protected Control createButtonBar(Composite parent) { - Control control = super.createButtonBar(parent); - setButtonEnabled(OK, false); - return control; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#okPressed() - */ - @Override - protected void okPressed() { - if (ttyControlSelector.getSelection()) { - data = ttyControl.getText(); - } - else { - data = "tcp:" + addressControl.getText() + ":" + portControl.getText(); //$NON-NLS-1$ //$NON-NLS-2$ - } - super.okPressed(); - } - - /** - * Called from the single controls if the content of the controls changed. - */ - protected void onModify() { - setMessage(null); - - boolean valid = false; - - if (ttyControlSelector.getSelection()) { - valid = isTtyControlValid(); - } else { - valid = isAddressControlValid(); - valid &= isPortControlValid(); - } - - if (getMessage() == null) { - setDefaultMessage(Messages.SerialPortAddressDialog_message, IMessageProvider.INFORMATION); - } - - setButtonEnabled(OK, valid); - } - - private static final Pattern validCharacters = Platform.OS_WIN32.equals(Platform.getOS()) ? Pattern.compile("[\\w]+") : Pattern.compile("[\\w/]+"); //$NON-NLS-1$ //$NON-NLS-2$ - - /** - * Validates the tty device control. - * - * @return True if the control is valid, false otherwise. - */ - protected boolean isTtyControlValid() { - if (ttyControl == null || ttyControl.isDisposed()) return false; - - boolean valid = true; - - String m = null; - int mt = IMessageProvider.NONE; - - String newText = ttyControl.getText(); - Assert.isNotNull(newText); - if (newText.trim().length() > 0) { - Matcher matcher = validCharacters.matcher(newText); - if (!matcher.matches()) { - m = Messages.SerialLinePanel_error_invalidCharactes; - mt = IMessageProvider.ERROR; - } - } - else { - m = Messages.SerialLinePanel_error_emptyHostTTYDevice; - mt = IMessageProvider.INFORMATION; - } - - valid = mt != IMessageProvider.ERROR; - if (mt > getMessageType()) setMessage(m, mt); - - return valid; - } - - /** - * Validates the address control. - * - * @return True if the control is valid, false otherwise. - */ - protected boolean isAddressControlValid() { - if (addressControl == null || addressControl.isDisposed()) return false; - - boolean valid = true; - - String m = null; - int mt = IMessageProvider.NONE; - - String ipOrHostName = addressControl.getText(); - - // info message when value is empty - if (ipOrHostName == null || ipOrHostName.trim().length() == 0) { - m = Messages.SerialPortAddressDialog_Information_MissingTargetNameAddress; - mt = IMessageProvider.INFORMATION; - } else { - ipOrHostName = ipOrHostName.trim(); - // check IP address when only numeric values and '.' are entered - if (ipOrHostName.matches(IP_CHARACTERS_REGEX)) { - if (!ipOrHostName.matches(IP_REGEX)) { - m = Messages.SerialPortAddressDialog_Error_InvalidTargetIpAddress; - mt = IMessageProvider.ERROR; - } - } - else if (ipOrHostName.matches(NAME_CHARACTERS_REGEX)) { - if (!ipOrHostName.matches(NAME_REGEX)) { - m = Messages.SerialPortAddressDialog_Error_InvalidTargetNameAddress; - mt = IMessageProvider.ERROR; - } - } - else { - m = Messages.SerialPortAddressDialog_Error_InvalidTargetNameAddress; - mt = IMessageProvider.ERROR; - } - } - - valid = mt != IMessageProvider.ERROR; - if (mt > getMessageType()) setMessage(m, mt); - - return valid; - } - - /** - * Validates the port control. - * - * @return True if the control is valid, false otherwise. - */ - protected boolean isPortControlValid() { - if (portControl == null || portControl.isDisposed()) return false; - - boolean valid = true; - - String m = null; - int mt = IMessageProvider.NONE; - - String newText = portControl.getText(); - Assert.isNotNull(newText); - if (newText.trim().length() > 0) { - if (!newText.matches("([0-9]{0,5})|(0((x|X)[0-9a-fA-F]{0,4})?)")) { //$NON-NLS-1$ - m = Messages.SerialPortAddressDialog_Error_InvalidPort; - mt = IMessageProvider.ERROR; - } else { - try { - int value = Integer.decode(newText).intValue(); - if (value < 0 || value > 65535) { - m = Messages.SerialPortAddressDialog_Error_InvalidPortRange; - mt = IMessageProvider.ERROR; - } - } - catch (Exception ex) { /* ignored on purpose */ } - } - } - else { - m = Messages.SerialPortAddressDialog_Information_MissingPort; - mt = IMessageProvider.INFORMATION; - } - - valid = mt != IMessageProvider.ERROR; - if (mt > getMessageType()) setMessage(m, mt); - - return valid; - } - - /** - * Return the new name after OK was pressed. - * Unless OK was pressed, the old name is returned. - */ - public String getData() { - return data; - } - - /** - * Cleanup when dialog is closed. - */ - protected void dispose() { - message = null; - messageType = IMessageProvider.NONE; - errorMessage = null; - title = null; - defaultMessage = null; - defaultMessageType = IMessageProvider.NONE; - } - - /** - * Cleanup the Dialog and close it. - */ - @Override - public boolean close() { - dispose(); - return super.close(); - } - - /** - * Set the enabled state of the dialog button specified by the given id (@see IDialogConstants) - * to the given state. - * - * @param buttonId The button id for the button to change the enabled state for. - * @param enabled The new enabled state to set for the button. - */ - public void setButtonEnabled(int buttonId, boolean enabled) { - Button button = getButton(buttonId); - if (button != null) { - button.setEnabled(enabled); - } - } - - /** - * Sets the title for this dialog. - * - * @param title The title. - */ - public void setDialogTitle(String title) { - if (getShell() != null && !getShell().isDisposed()) { - getShell().setText(title); - } - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.TitleAreaDialog#setTitle(java.lang.String) - */ - @Override - public void setTitle(String newTitle) { - title = newTitle; - super.setTitle(newTitle); - } - - /** - * Set the default message. The default message is shown within the - * dialogs message area if no other message is set. - * - * @param message The default message or null. - * @param type The default message type. See {@link IMessageProvider}. - */ - public void setDefaultMessage(String message, int type) { - defaultMessage = message; - defaultMessageType = type; - // Push the default message to the dialog if no other message is set - if (!isMessageSet() && getContents() != null) { - super.setMessage(defaultMessage, defaultMessageType); - } - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.TitleAreaDialog#setMessage(java.lang.String, int) - */ - @Override - public void setMessage(String newMessage, int newType) { - // To be able to implement IMessageProvider, we have to remember the - // set message ourselfs. There is no access to these information by the - // base class. - message = newMessage; messageType = newType; - // Only pass on to super implementation if the control has been created yet - if (getContents() != null) { - super.setMessage(message != null ? message : defaultMessage, message != null ? messageType : defaultMessageType); - } - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.TitleAreaDialog#setErrorMessage(java.lang.String) - */ - @Override - public void setErrorMessage(String newErrorMessage) { - // See setMessage(...) - errorMessage = newErrorMessage; - super.setErrorMessage(newErrorMessage); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.IMessageProvider#getMessage() - */ - @Override - public String getMessage() { - return errorMessage != null ? errorMessage : message; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.IMessageProvider#getMessageType() - */ - @Override - public int getMessageType() { - return errorMessage != null ? IMessageProvider.ERROR : messageType; - } - - /** - * Returns if or if not an message is set to the dialog. - * - * @return True if a message has been set, false otherwise. - */ - public boolean isMessageSet() { - return errorMessage != null || message != null; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/interfaces/ITraceIds.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/interfaces/ITraceIds.java deleted file mode 100644 index acfd6da..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/interfaces/ITraceIds.java +++ /dev/null @@ -1,22 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.interfaces; - -/** - * Trace slot identifiers. - */ -public interface ITraceIds { - - /** - * If activated, trace information about serial device discovery is printed out. - */ - public static final String TRACE_SERIAL_LINE_PANEL = "trace/serialLinePanel"; //$NON-NLS-1$ - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/interfaces/IWireTypeSerial.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/interfaces/IWireTypeSerial.java deleted file mode 100644 index c8d0485..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/interfaces/IWireTypeSerial.java +++ /dev/null @@ -1,51 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.interfaces; - -/** - * The properties specific to the wire type "serial". - */ -public interface IWireTypeSerial { - - /** - * The data container. - */ - public static String PROPERTY_CONTAINER_NAME = "serial"; //$NON-NLS-1$ - - /** - * The serial device name. - */ - public static final String PROPERTY_SERIAL_DEVICE = "device"; //$NON-NLS-1$ - - /** - * The baud rate. - */ - public static final String PROPERTY_SERIAL_BAUD_RATE = "baudrate"; //$NON-NLS-1$ - - /** - * The data bits - */ - public static final String PROPERTY_SERIAL_DATA_BITS = "databits"; //$NON-NLS-1$ - - /** - * The parity - */ - public static final String PROPERTY_SERIAL_PARITY = "parity"; //$NON-NLS-1$ - - /** - * The stop bits - */ - public static final String PROPERTY_SERIAL_STOP_BITS = "stopbits"; //$NON-NLS-1$ - - /** - * The flow control - */ - public static final String PROPERTY_SERIAL_FLOW_CONTROL = "flowcontrol"; //$NON-NLS-1$ -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/launcher/SerialLauncherDelegate.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/launcher/SerialLauncherDelegate.java deleted file mode 100644 index 7e947b8..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/launcher/SerialLauncherDelegate.java +++ /dev/null @@ -1,159 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.launcher; - -import java.text.DateFormat; -import java.util.Date; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.osgi.util.NLS; -import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalConnectorExtension; -import org.eclipse.tm.terminal.connector.serial.connector.SerialSettings; -import org.eclipse.tm.terminal.connector.serial.controls.SerialConfigurationPanel; -import org.eclipse.tm.terminal.connector.serial.nls.Messages; -import org.eclipse.tm.terminal.view.core.TerminalServiceFactory; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalService; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel; -import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; -import org.eclipse.tm.terminal.view.ui.interfaces.IMementoHandler; -import org.eclipse.tm.terminal.view.ui.internal.SettingsStore; -import org.eclipse.tm.terminal.view.ui.launcher.AbstractLauncherDelegate; - -/** - * Serial launcher delegate implementation. - */ -@SuppressWarnings("restriction") -public class SerialLauncherDelegate extends AbstractLauncherDelegate { - // The serial terminal connection memento handler - private final IMementoHandler mementoHandler = new SerialMementoHandler(); - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate#needsUserConfiguration() - */ - @Override - public boolean needsUserConfiguration() { - return true; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate#getPanel(org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer) - */ - @Override - public IConfigurationPanel getPanel(IConfigurationPanelContainer container) { - return new SerialConfigurationPanel(container); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate#execute(java.util.Map, org.eclipse.tm.terminal.view.core.interfaces.ITerminalService.Done) - */ - @Override - public void execute(Map properties, ITerminalService.Done done) { - Assert.isNotNull(properties); - - // Set the terminal tab title - String terminalTitle = getTerminalTitle(properties); - if (terminalTitle != null) { - properties.put(ITerminalsConnectorConstants.PROP_TITLE, terminalTitle); - } - - // Get the terminal service - ITerminalService terminal = TerminalServiceFactory.getService(); - // If not available, we cannot fulfill this request - if (terminal != null) { - terminal.openConsole(properties, done); - } - } - - /** - * Returns the terminal title string. - *

- * The default implementation constructs a title like "Serial <port> (Start time) ". - * - * @return The terminal title string or null. - */ - private String getTerminalTitle(Map properties) { - // Try to see if the user set a title explicitly via the properties map. - String title = getDefaultTerminalTitle(properties); - if (title != null) return title; - - String device = (String)properties.get(ITerminalsConnectorConstants.PROP_SERIAL_DEVICE); - - if (device != null) { - DateFormat format = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); - String date = format.format(new Date(System.currentTimeMillis())); - return NLS.bind(Messages.SerialLauncherDelegate_terminalTitle, new String[]{device, date}); - } - - return Messages.SerialLauncherDelegate_terminalTitle_default; - } - - /* (non-Javadoc) - * @see org.eclipse.core.runtime.PlatformObject#getAdapter(java.lang.Class) - */ - @Override - public Object getAdapter(Class adapter) { - if (IMementoHandler.class.equals(adapter)) { - return mementoHandler; - } - return super.getAdapter(adapter); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate#createTerminalConnector(java.util.Map) - */ - @Override - public ITerminalConnector createTerminalConnector(Map properties) { - Assert.isNotNull(properties); - - // Check for the terminal connector id - String connectorId = (String)properties.get(ITerminalsConnectorConstants.PROP_TERMINAL_CONNECTOR_ID); - if (connectorId == null) connectorId = "org.eclipse.tm.terminal.connector.serial.SerialConnector"; //$NON-NLS-1$ - - String port = (String)properties.get(ITerminalsConnectorConstants.PROP_SERIAL_DEVICE); - String baud = (String)properties.get(ITerminalsConnectorConstants.PROP_SERIAL_BAUD_RATE); - Object value = properties.get(ITerminalsConnectorConstants.PROP_TIMEOUT); - String timeout = value instanceof Integer ? ((Integer)value).toString() : null; - String databits = (String)properties.get(ITerminalsConnectorConstants.PROP_SERIAL_DATA_BITS); - String stopbits = (String)properties.get(ITerminalsConnectorConstants.PROP_SERIAL_STOP_BITS); - String parity = (String)properties.get(ITerminalsConnectorConstants.PROP_SERIAL_PARITY); - String flowcontrol = (String)properties.get(ITerminalsConnectorConstants.PROP_SERIAL_FLOW_CONTROL); - - // Construct the terminal settings store - ISettingsStore store = new SettingsStore(); - - // Construct the serial settings - SerialSettings serialSettings = new SerialSettings(); - serialSettings.setSerialPort(port); - serialSettings.setBaudRate(baud); - serialSettings.setTimeout(timeout); - serialSettings.setDataBits(databits); - serialSettings.setStopBits(stopbits); - serialSettings.setParity(parity); - serialSettings.setFlowControl(flowcontrol); - - // And save the settings to the store - serialSettings.save(store); - - // Construct the terminal connector instance - ITerminalConnector connector = TerminalConnectorExtension.makeTerminalConnector(connectorId); - if (connector != null) { - // Apply default settings - connector.setDefaultSettings(); - // And load the real settings - connector.load(store); - } - - return connector; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/launcher/SerialMementoHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/launcher/SerialMementoHandler.java deleted file mode 100644 index 5af0ef8..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/launcher/SerialMementoHandler.java +++ /dev/null @@ -1,64 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.launcher; - -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.interfaces.IMementoHandler; -import org.eclipse.ui.IMemento; - -/** - * Serial terminal connection memento handler implementation. - */ -public class SerialMementoHandler implements IMementoHandler { - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IMementoHandler#saveState(org.eclipse.ui.IMemento, java.util.Map) - */ - @Override - public void saveState(IMemento memento, Map properties) { - Assert.isNotNull(memento); - Assert.isNotNull(properties); - - // Do not write the terminal title to the memento -> needs to - // be recreated at the time of restoration. - memento.putString(ITerminalsConnectorConstants.PROP_SERIAL_DEVICE, (String)properties.get(ITerminalsConnectorConstants.PROP_SERIAL_DEVICE)); - memento.putString(ITerminalsConnectorConstants.PROP_SERIAL_BAUD_RATE, (String)properties.get(ITerminalsConnectorConstants.PROP_SERIAL_BAUD_RATE)); - memento.putString(ITerminalsConnectorConstants.PROP_SERIAL_DATA_BITS, (String)properties.get(ITerminalsConnectorConstants.PROP_SERIAL_DATA_BITS)); - memento.putString(ITerminalsConnectorConstants.PROP_SERIAL_PARITY, (String)properties.get(ITerminalsConnectorConstants.PROP_SERIAL_PARITY)); - memento.putString(ITerminalsConnectorConstants.PROP_SERIAL_STOP_BITS, (String)properties.get(ITerminalsConnectorConstants.PROP_SERIAL_STOP_BITS)); - memento.putString(ITerminalsConnectorConstants.PROP_SERIAL_FLOW_CONTROL, (String)properties.get(ITerminalsConnectorConstants.PROP_SERIAL_FLOW_CONTROL)); - Object value = properties.get(ITerminalsConnectorConstants.PROP_TIMEOUT); - memento.putInteger(ITerminalsConnectorConstants.PROP_TIMEOUT, value instanceof Integer ? ((Integer)value).intValue() : -1); - memento.putString(ITerminalsConnectorConstants.PROP_ENCODING, (String)properties.get(ITerminalsConnectorConstants.PROP_ENCODING)); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IMementoHandler#restoreState(org.eclipse.ui.IMemento, java.util.Map) - */ - @Override - public void restoreState(IMemento memento, Map properties) { - Assert.isNotNull(memento); - Assert.isNotNull(properties); - - // Restore the terminal properties from the memento - properties.put(ITerminalsConnectorConstants.PROP_SERIAL_DEVICE, memento.getString(ITerminalsConnectorConstants.PROP_SERIAL_DEVICE)); - properties.put(ITerminalsConnectorConstants.PROP_SERIAL_BAUD_RATE, memento.getString(ITerminalsConnectorConstants.PROP_SERIAL_BAUD_RATE)); - properties.put(ITerminalsConnectorConstants.PROP_SERIAL_DATA_BITS, memento.getString(ITerminalsConnectorConstants.PROP_SERIAL_DATA_BITS)); - properties.put(ITerminalsConnectorConstants.PROP_SERIAL_PARITY, memento.getString(ITerminalsConnectorConstants.PROP_SERIAL_PARITY)); - properties.put(ITerminalsConnectorConstants.PROP_SERIAL_STOP_BITS, memento.getString(ITerminalsConnectorConstants.PROP_SERIAL_STOP_BITS)); - properties.put(ITerminalsConnectorConstants.PROP_SERIAL_FLOW_CONTROL, memento.getString(ITerminalsConnectorConstants.PROP_SERIAL_FLOW_CONTROL)); - Integer timeout = memento.getInteger(ITerminalsConnectorConstants.PROP_TIMEOUT); - if (timeout != null && timeout.intValue() != -1) properties.put(ITerminalsConnectorConstants.PROP_TIMEOUT, timeout); - properties.put(ITerminalsConnectorConstants.PROP_ENCODING, memento.getString(ITerminalsConnectorConstants.PROP_ENCODING)); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/nls/Messages.java b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/nls/Messages.java deleted file mode 100644 index 19de4b7..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/nls/Messages.java +++ /dev/null @@ -1,79 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.connector.serial.nls; - -import org.eclipse.osgi.util.NLS; - -/** - * Externalized strings management. - */ -public class Messages extends NLS { - - // The plug-in resource bundle name - private static final String BUNDLE_NAME = "org.eclipse.tm.terminal.connector.serial.nls.Messages"; //$NON-NLS-1$ - - /** - * Static constructor. - */ - static { - // Load message values from bundle file - NLS.initializeMessages(BUNDLE_NAME, Messages.class); - } - - // **** Declare externalized string id's down here ***** - - public static String SerialLauncherDelegate_terminalTitle; - public static String SerialLauncherDelegate_terminalTitle_default; - - public static String SerialLinePanel_hostTTYDevice_label; - public static String SerialLinePanel_hostTTYSpeed_label; - public static String SerialLinePanel_hostTTYDatabits_label; - public static String SerialLinePanel_hostTTYParity_label; - public static String SerialLinePanel_hostTTYStopbits_label; - public static String SerialLinePanel_hostTTYFlowControl_label; - public static String SerialLinePanel_hostTTYTimeout_label; - public static String SerialLinePanel_customSerialBaudRate_title; - public static String SerialLinePanel_customSerialBaudRate_message; - public static String SerialLinePanel_error_invalidCharactes; - public static String SerialLinePanel_error_invalidCharactesBaudRate; - public static String SerialLinePanel_error_emptyHostTTYDevice; - public static String SerialLinePanel_error_emptyHostTTYSpeedRate; - public static String SerialLinePanel_error_emptyHostTTYDatabits; - public static String SerialLinePanel_error_emptyHostTTYParity; - public static String SerialLinePanel_error_emptyHostTTYStopbits; - public static String SerialLinePanel_error_emptyHostTTYFlowControl; - public static String SerialLinePanel_error_emptyHostTTYTimeout; - public static String SerialLinePanel_info_editableTTYDeviceSelected; - public static String SerialLinePanel_info_editableTTYBaudRateSelected; - public static String SerialLinePanel_warning_FailedToLoadSerialPorts; - - public static String SerialPortAddressDialog_dialogtitle; - public static String SerialPortAddressDialog_title; - public static String SerialPortAddressDialog_message; - public static String SerialPortAddressDialog_address; - public static String SerialPortAddressDialog_port; - public static String SerialPortAddressDialog_Information_MissingTargetNameAddress; - public static String SerialPortAddressDialog_Error_InvalidTargetNameAddress; - public static String SerialPortAddressDialog_Error_InvalidTargetIpAddress; - public static String SerialPortAddressDialog_Information_MissingPort; - public static String SerialPortAddressDialog_Error_InvalidPort; - public static String SerialPortAddressDialog_Error_InvalidPortRange; - - public static String SerialConnector_Error_LiberayNotInstalled; - - public static String SerialConnectWorker_PROP_TITLE; - public static String SerialConnectWorker_PORT_IN_USE; - public static String SerialConnectWorker_ANOTHER_TERMINAL; - public static String SerialConnectWorker_PORT_STOLEN; - public static String SerialConnectWorker_PORT_NOT_STOLEN; - public static String SerialConnectWorker_NO_SUCH_PORT; - public static String SerialConnectWorker_OWNERSHIP_GRANTED; - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/nls/Messages.properties b/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/nls/Messages.properties deleted file mode 100644 index 37a9473..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.connector.serial/src/org/eclipse/tm/terminal/connector/serial/nls/Messages.properties +++ /dev/null @@ -1,71 +0,0 @@ -############################################################################### -# Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. -# This program and the accompanying materials are made available under the terms -# of the Eclipse Public License v1.0 which accompanies this distribution, and is -# available at http://www.eclipse.org/legal/epl-v10.html -# -# Contributors: -# Wind River Systems - initial API and implementation -############################################################################### - -SerialLauncherDelegate_terminalTitle=Serial {0} ({1}) -SerialLauncherDelegate_terminalTitle_default=Serial Terminal - -SerialLinePanel_hostTTYDevice_label=Port: -SerialLinePanel_hostTTYSpeed_label=Baud Rate: -SerialLinePanel_hostTTYDatabits_label=Data Bits: -SerialLinePanel_hostTTYParity_label=Parity: -SerialLinePanel_hostTTYStopbits_label=Stop Bits: -SerialLinePanel_hostTTYFlowControl_label=Flow Control: -SerialLinePanel_hostTTYTimeout_label=Timeout (sec): -SerialLinePanel_customSerialBaudRate_title=Configure Custom Serial Baud Rate -SerialLinePanel_customSerialBaudRate_message=Please enter the custom serial baud rate: -SerialLinePanel_error_invalidCharactes=The device name you've entered contains invalid characters. -SerialLinePanel_error_invalidCharactesBaudRate=The baud rate you've entered contains invalid characters. -SerialLinePanel_error_emptyHostTTYDevice=Please select a valid host serial device. -SerialLinePanel_error_emptyHostTTYSpeedRate=Please select a valid serial device speed. -SerialLinePanel_error_emptyHostTTYDatabits=Please select a valid number of data bits. -SerialLinePanel_error_emptyHostTTYParity=Please select a valid parity. -SerialLinePanel_error_emptyHostTTYStopbits=Please select a valid number of stop bits. -SerialLinePanel_error_emptyHostTTYFlowControl=Please select a valid flow control. -SerialLinePanel_error_emptyHostTTYTimeout=Please select a valid timeout. -SerialLinePanel_info_editableTTYDeviceSelected=Please re-select ''Other...'' again to activate the custom serial device input dialog. -SerialLinePanel_info_editableTTYBaudRateSelected=Please re-select ''Other...'' again to activate the custom serial baud rate input dialog. -SerialLinePanel_warning_FailedToLoadSerialPorts=Failed to enumerate the systems serial ports. - -SerialPortAddressDialog_dialogtitle=Other... -SerialPortAddressDialog_title=Configure Custom Serial Device -SerialPortAddressDialog_message=Select the type of the custom serial device and configure the device properties. -SerialPortAddressDialog_address=Address: -SerialPortAddressDialog_port=Port: -SerialPortAddressDialog_Information_MissingTargetNameAddress=Please enter a valid target name or IP address. -SerialPortAddressDialog_Error_InvalidTargetNameAddress=Target name or IP address is not valid. -SerialPortAddressDialog_Error_InvalidTargetIpAddress=Target IP address is not valid. -SerialPortAddressDialog_Information_MissingPort=Please enter a valid port number. -SerialPortAddressDialog_Error_InvalidPort=Target port number must be a valid number in the range of 0 to 65535. -SerialPortAddressDialog_Error_InvalidPortRange=Target port number must be in the range of 0 to 65535. - - -SerialConnector_Error_LiberayNotInstalled = The RXTX library has not been installed properly! \n\ -\n\ -Installation:\n\ --------------\n\ -* Either (a) Use Help > Software Updates, Add Site and install from:\n\ -\ \ \ http://rxtx.qbang.org/eclipse/\n\ -* Or (b) Download and install RXTX for Eclipse from:\n\ -\ \ \ http://rxtx.qbang.org/eclipse/downloads/\n\ -\n\ -For other Platforms, more info and help see\n\ -\ \ \ http://www.rxtx.org/\n\ -\ \ \ https://bugs.eclipse.org/bugs/show_bug.cgi?id=175336#c6\n\ -\n\ -This message is also available in your Error Log for Copy & Paste. - -# Port Ownership Handling -SerialConnectWorker_PROP_TITLE = Terminal -SerialConnectWorker_PORT_IN_USE = Serial port \''{0}\'' is currently in use by {1}\!\nDo you want to try and steal the port? -SerialConnectWorker_ANOTHER_TERMINAL = another Terminal View -SerialConnectWorker_PORT_STOLEN = Port \''{0}\'' successfully obtained from {1}\r\n -SerialConnectWorker_PORT_NOT_STOLEN = Connection Error!\r\n \''{0}\'' is already in use by {1}.\r\n -SerialConnectWorker_NO_SUCH_PORT = No such port: \''{0}\''\r\n -SerialConnectWorker_OWNERSHIP_GRANTED = Connection canceled due to ownership request from {0}.\r\n diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/.classpath b/rtosTMTerminal/org.eclipse.tm.terminal.control/.classpath deleted file mode 100644 index 25d360e..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/.cvsignore b/rtosTMTerminal/org.eclipse.tm.terminal.control/.cvsignore deleted file mode 100644 index ba077a4..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -bin diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/.gitignore b/rtosTMTerminal/org.eclipse.tm.terminal.control/.gitignore deleted file mode 100644 index ae3c172..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/.options b/rtosTMTerminal/org.eclipse.tm.terminal.control/.options deleted file mode 100644 index 7e591a4..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/.options +++ /dev/null @@ -1,3 +0,0 @@ -org.eclipse.tm.terminal.control/debug/log = false -org.eclipse.tm.terminal.control/debug/log/char = false -org.eclipse.tm.terminal.control/debug/log/VT100Backend = false diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/.project b/rtosTMTerminal/org.eclipse.tm.terminal.control/.project deleted file mode 100644 index 11e18c3..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/.project +++ /dev/null @@ -1,34 +0,0 @@ - - - org.eclipse.tm.terminal.control - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - org.eclipse.pde.api.tools.apiAnalysisBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - org.eclipse.pde.api.tools.apiAnalysisNature - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/.settings/org.eclipse.core.resources.prefs b/rtosTMTerminal/org.eclipse.tm.terminal.control/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 775bde2..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java=UTF-8 diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/.settings/org.eclipse.jdt.core.prefs b/rtosTMTerminal/org.eclipse.tm.terminal.control/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index eb9982c..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,100 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=warning -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=warning -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error -org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning -org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/HelpContexts.xml b/rtosTMTerminal/org.eclipse.tm.terminal.control/HelpContexts.xml deleted file mode 100644 index 761da67..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/HelpContexts.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - The Terminal View supports direct connections to remote systems via serial or network connections. - - - \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/META-INF/MANIFEST.MF b/rtosTMTerminal/org.eclipse.tm.terminal.control/META-INF/MANIFEST.MF deleted file mode 100644 index 834c287..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/META-INF/MANIFEST.MF +++ /dev/null @@ -1,25 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %pluginName -Bundle-SymbolicName: org.eclipse.tm.terminal.control; singleton:=true -Bundle-Version: 4.2.0.qualifier -Bundle-Activator: org.eclipse.tm.internal.terminal.control.impl.TerminalPlugin -Bundle-Vendor: %providerName -Bundle-Localization: plugin -Require-Bundle: org.eclipse.core.runtime, - org.eclipse.ui -Bundle-ActivationPolicy: lazy -Eclipse-LazyStart: true -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -Bundle-ClassPath: . -Export-Package: org.eclipse.tm.internal.terminal.connector;x-internal:=true, - org.eclipse.tm.internal.terminal.control, - org.eclipse.tm.internal.terminal.control.actions, - org.eclipse.tm.internal.terminal.control.impl;x-internal:=true, - org.eclipse.tm.internal.terminal.emulator;x-internal:=true, - org.eclipse.tm.internal.terminal.model;x-internal:=true, - org.eclipse.tm.internal.terminal.preferences, - org.eclipse.tm.internal.terminal.provisional.api, - org.eclipse.tm.internal.terminal.provisional.api.provider, - org.eclipse.tm.internal.terminal.textcanvas;x-internal:=true, - org.eclipse.tm.terminal.model diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/README.txt b/rtosTMTerminal/org.eclipse.tm.terminal.control/README.txt deleted file mode 100644 index c88bc69..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/README.txt +++ /dev/null @@ -1,18 +0,0 @@ -Terminal README -=============== - -The Terminal is a UI-less model of a grid of characters, -plus an SWT widget that's updated asynchronously for -maximum performance. The widget can be hooked up to various -ITerminalConnectors providing an InputStream, OutputStream, -and a method for setting the Terminal Size. - -The widget processes ANSI control characters, including NUL, -backspace, carriage return, linefeed, and a subset of ANSI -escape sequences sufficient to allow use of screen-oriented -applications, such as vi, Emacs, and any GNU readline-enabled -application (Bash, bc, ncftp, etc.). - -This is not yet a fully compliant vt100 / vt102 terminal -emulator! - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/about.html b/rtosTMTerminal/org.eclipse.tm.terminal.control/about.html deleted file mode 100644 index d4cc693..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/about.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -About - - -

About This Content

- -

June 5, 2007

-

License

- -

The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise -indicated below, the Content is provided to you under the terms and conditions of the -Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available -at http://www.eclipse.org/legal/epl-v10.html. -For purposes of the EPL, "Program" will mean the Content.

- -

If you did not receive this Content directly from the Eclipse Foundation, the Content is -being redistributed by another party ("Redistributor") and different terms and conditions may -apply to your use of any object code in the Content. Check the Redistributor's license that was -provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise -indicated below, the terms and conditions of the EPL still apply to any source code in the Content -and such source code may be obtained at http://www.eclipse.org.

- - - \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/about.ini b/rtosTMTerminal/org.eclipse.tm.terminal.control/about.ini deleted file mode 100644 index 3adc27a..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/about.ini +++ /dev/null @@ -1,27 +0,0 @@ -# about.ini -# contains information about a feature -# java.io.Properties file (ISO 8859-1 with "\" escapes) -# "%key" are externalized strings defined in about.properties -# This file does not need to be translated. - -# Property "aboutText" contains blurb for "About" dialog (translated) -aboutText=%blurb - -# Property "windowImage" contains path to window icon (16x16) -# needed for primary features only - -# Property "featureImage" contains path to feature image (32x32) -featureImage=tm32.png - -# Property "aboutImage" contains path to product image (500x330 or 115x164) -# needed for primary features only - -# Property "appName" contains name of the application (not translated) -# needed for primary features only - -# Property "welcomePage" contains path to welcome page (special XML-based format) -# optional - -# Property "welcomePerspective" contains the id of the perspective in which the -# welcome page is to be opened. -# optional \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/about.properties b/rtosTMTerminal/org.eclipse.tm.terminal.control/about.properties deleted file mode 100644 index ad76531..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/about.properties +++ /dev/null @@ -1,24 +0,0 @@ -################################################################################ -# Copyright (c) 2006, 2016 Wind River Systems, Inc. and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/epl-v10.html -# -# Contributors: -# Martin Oberhuber - initial API and implementation -################################################################################ -# about.properties -# contains externalized strings for about.ini -# java.io.Properties file (ISO 8859-1 with "\" escapes) -# fill-ins are supplied by about.mappings -# This file should be translated. -# -# Do not translate any values surrounded by {} - -blurb=Target Management Terminal Widget\n\ -\n\ -Version: {featureVersion}\n\ -\n\ -(c) Copyright Wind River Systems, Inc. and others 2003, 2016. All rights reserved.\n\ -Visit http://www.eclipse.org/tm diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/build.properties b/rtosTMTerminal/org.eclipse.tm.terminal.control/build.properties deleted file mode 100644 index 6d04269..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/build.properties +++ /dev/null @@ -1,36 +0,0 @@ -############################################################################### -# Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/epl-v10.html -# -# Initial Contributors: -# The following Wind River employees contributed to the Terminal component -# that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, -# Helmut Haigermoser and Ted Williams. -# -# Contributors: -# Michael Scharf (Wind River) - split into core, view and connector plugins -# Martin Oberhuber (Wind River) - fixed copyright headers and beautified -# Anna Dushistova (MontaVista) - added icons -############################################################################### -bin.includes = .,\ - META-INF/,\ - plugin.xml,\ - plugin.properties,\ - .options,\ - README.txt,\ - about.html,\ - about.ini,\ - about.properties,\ - tm32.png,\ - icons/,\ - HelpContexts.xml,\ - css/ - -source.. = src/ -output.. = bin/ -src.includes = schema/,\ - about.html - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/css/org.eclipse.tm.terminal.stylesheet.dark.css b/rtosTMTerminal/org.eclipse.tm.terminal.control/css/org.eclipse.tm.terminal.stylesheet.dark.css deleted file mode 100644 index ab89d9e..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/css/org.eclipse.tm.terminal.stylesheet.dark.css +++ /dev/null @@ -1,15 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 vogella GmbH and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Lars Vogel - initial API and implementation - ******************************************************************************/ - -IEclipsePreferences#org-eclipse-tm-terminal-control { - preferences: - "TerminalPrefInvertColors=true" -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/icons/clcl16/clear_co.gif b/rtosTMTerminal/org.eclipse.tm.terminal.control/icons/clcl16/clear_co.gif deleted file mode 100644 index af30a42f83d2f91801206463e1f4601a747dd38e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmZ?wbhEHb6krfwc*el+;Qr&!Uw{Aj`RCh@zn{MT*?;oxyHCG9ef|CO*PkChf49xr z*E9dn%Iz0#-hcJ>)9(*oeotO@Y}T67i#DHMvE%ZZJy-8O|Ni97&*$%czWwy;^S9r3 zo`1jp^2fthKi+)${p!QdZ$ExNd-wC(&%YnO{{Hms_tzi4zyJI_W5&cyo7UdHe|Of* z{<*XJmMv^wG_UL6rjotu%lB?5-?_GG%gWmI%NmdGpZDg~qvKl(k8UnLx~2Hg#?qZ@ zs#Y&v%S5&t*x!DuCAn{q`0`asHmv0urNPAKQAvYB_$;} zIXNyaE;cqcGBPqWG&DFkI4CG6FfcG6Ai&?>-_OtQ|Ns9C0}2#>vM@3*gfi%WTmgy` z2KEgNp{C6(&7tib?WP<(y|$*E9cHRboKu+W?9C^J>Z%9|aC6C9+u2x5)MuAemSmLN zAgMReQb|NuXu%?WgNcR`5^M(!OBhcylH0yhfQMJnWTKUV_?0Uxu3jz-u0F1z+G3{` zuzEW)`F=drwRH^dde6KTp?5HjDwPt!%ua0$DEtSh$2VJr-3M iJ8pc$DH7Bta2KY#wb zefxI%_U+rYZQHbI)0#DFRqv0~ApMGF@$oHuXY?Afzt&YU@8#*FFH zr%#(U?f?J(3={yxpDc_F4B8AjATvOIVqoh$Ae!bOv##%ivfAOCFau8&wgXGj^h7d5 zgbic_SR0;xy2Hivydi4sR4$3$c5$5yZN&+Ub^IH-l?#g4`GgtjB!mRJx|kGH)9(*oeotO@Y}T67i#DHMvE%ZZJy-8O|Ni97&*$%czWwy;^S9r3 zo`1jp^2fthKi+)${p!QdZ$ExNd-wC(&%YnO{{Hms_tzi4zyJI_W5&cyo7UdHe|Of* z{<*XJmMv^wG_UL6rjotu%lB?5-?_GG%gWmI%NmdGpZDg~qvKl(k8UnLx~2Hg#?qZ@ zs#Y&v%S5&t*x!DuCAn{q`0`asHmv0urNPAKQAvYB_$;} zIXNyaE;cqcGBPqWG&DFkI4CG6FfcG6Ai&?>-_OtQ|Ns9C0}2#>vM@3*gfi%WTmgy` z2KEgNp{C6(&7tib?WP<(y|$*E9cHRboKu+W?9C^J>Z%9|aC6C9+u2x5)MuAemSmLN zAgMReQb|NuXu%?WgNcR`5^M(!OBhcylH0yhfQMJnWTKUV_?0Uxu3jz-u0F1z+G3{` zuzEW)`F=drwRH^dde6KTp?5HjDwPt!%ua0$DEtSh$2VJr-3M iJ8pc$DH7Bta - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %terminal.font.description - - - - - - - - - - - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/pom.xml b/rtosTMTerminal/org.eclipse.tm.terminal.control/pom.xml deleted file mode 100644 index 08f92a4..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/pom.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 4.0.0 - - - org.eclipse.tm.terminal - org.eclipse.tm.terminal.maven-build - 4.2.0-SNAPSHOT - ../../admin/pom-build.xml - - - 4.2.0-SNAPSHOT - org.eclipse.tm.terminal.control - eclipse-plugin - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/schema/connectors.exsd b/rtosTMTerminal/org.eclipse.tm.terminal.control/schema/connectors.exsd deleted file mode 100644 index 58681ba..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/schema/connectors.exsd +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A class extending TerminalConnectorImpl - - - - - - - - - - Uniquely identify this connector for programmatic access. Clients will use this ID in order to find and instantiate it. - - - - - - - The name of the connection (used in the UI) - - - - - - - - - - When set to "true", the terminal connector will not be visible to the user in connector selections. - - - - - - - - - - - - - - - - Copyright (c) 2006 - 2015 Wind River Systems, Inc. and others. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Public License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/legal/epl-v10.html - -Contributors: -Michael Scharf (Wind River) - initial API and implementation -Martin Oberhuber (Wind River) - fixed copyright headers and beautified -Uwe Stieber (Wind River) - [282996] [terminal][api] Add "hidden" attribute to terminal connector extension point - - - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/connector/TerminalConnector.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/connector/TerminalConnector.java deleted file mode 100644 index cfbdabe..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/connector/TerminalConnector.java +++ /dev/null @@ -1,223 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Michael Scharf (Wind River) - [200541] Extract from TerminalConnectorExtension.TerminalConnectorProxy - * Martin Oberhuber (Wind River) - [225853][api] Provide more default functionality in TerminalConnectorImpl - * Uwe Stieber (Wind River) - [282996] [terminal][api] Add "hidden" attribute to terminal connector extension point - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.connector; - -import java.io.OutputStream; - -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.Platform; -import org.eclipse.tm.internal.terminal.control.impl.TerminalMessages; -import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; -import org.eclipse.tm.internal.terminal.provisional.api.Logger; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalConnectorExtension; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl; - -/** - * An {@link ITerminalConnector} instance, also known as terminal connection - * type, for maintaining a single terminal connection. - * - * It provides all terminal connector functions that can be provided by static - * markup without loading the actual implementation class. The actual - * {@link TerminalConnectorImpl} implementation class is lazily loaded by the - * provided {@link TerminalConnector.Factory} interface when needed. class, and - * delegates to the actual implementation when needed. The following methods can - * be called without initializing the contributed implementation class: - * {@link #getId()}, {@link #getName()}, {@link #getSettingsSummary()},{@link #load(ISettings)}, - * {@link #setTerminalSize(int, int)}, {@link #save(ISettings)}, - * {@link #getAdapter(Class)} - * - * @noextend This class is not intended to be subclassed by clients. - * @noinstantiate This class is not intended to be instantiated by clients. - * Clients can get terminal connector instances through the - * {@link TerminalConnectorExtension} class. - * @since org.eclipse.tm.terminal 2.0 - */ -public class TerminalConnector implements ITerminalConnector { - /** - * Creates an instance of TerminalConnectorImpl. This is used to lazily load - * classed defined in extensions. - * - * @since org.eclipse.tm.terminal 2.0 - */ - public interface Factory { - /** - * Factory method to create the actual terminal connector implementation - * when needed. - * - * @return a Connector - * @throws Exception - */ - TerminalConnectorImpl makeConnector() throws Exception; - } - /** - * The factory for creating impl instances. - */ - private final TerminalConnector.Factory fTerminalConnectorFactory; - /** - * The (display) name of the TerminalConnector - */ - private final String fName; - /** - * The unique id the connector - */ - private final String fId; - /** - * Flag to mark the connector as hidden. - */ - private final boolean fHidden; - /** - * The connector - */ - private TerminalConnectorImpl fConnector; - /** - * If the initialization of the class specified in the extension fails, - * this variable contains the error - */ - private Exception fException; - /** - * The store might be set before the real connector is initialized. - * This keeps the value until the connector is created. - */ - private ISettingsStore fStore; - /** - * Constructor for the terminal connector. - * - * @param terminalConnectorFactory Factory for lazily instantiating the - * TerminalConnectorImpl when needed. - * @param id terminal connector ID. The connector is publicly known under - * this ID. - * @param name translatable name to display the connector in the UI. - */ - public TerminalConnector(TerminalConnector.Factory terminalConnectorFactory, String id, String name, boolean hidden) { - fTerminalConnectorFactory = terminalConnectorFactory; - fId = id; - fName = name; - fHidden = hidden; - } - public String getInitializationErrorMessage() { - getConnectorImpl(); - if(fException!=null) - return fException.getLocalizedMessage(); - return null; - } - public String getId() { - return fId; - } - public String getName() { - return fName; - } - public boolean isHidden() { - return fHidden; - } - private TerminalConnectorImpl getConnectorImpl() { - if(!isInitialized()) { - try { - fConnector=fTerminalConnectorFactory.makeConnector(); - fConnector.initialize(); - } catch (Exception e) { - fException=e; - fConnector=new TerminalConnectorImpl(){ - public void connect(ITerminalControl control) { - // super.connect(control); - control.setState(TerminalState.CLOSED); - control.setMsg(getInitializationErrorMessage()); - } - public OutputStream getTerminalToRemoteStream() { - return null; - } - public String getSettingsSummary() { - return null; - }}; - // that's the place where we log the exception - Logger.logException(e); - } - if(fConnector!=null && fStore!=null) - fConnector.load(fStore); - } - return fConnector; - } - - public boolean isInitialized() { - return fConnector!=null || fException!=null; - } - public void connect(ITerminalControl control) { - getConnectorImpl().connect(control); - } - public void disconnect() { - getConnectorImpl().disconnect(); - } - public OutputStream getTerminalToRemoteStream() { - return getConnectorImpl().getTerminalToRemoteStream(); - } - public String getSettingsSummary() { - if(fConnector!=null) - return getConnectorImpl().getSettingsSummary(); - else - return TerminalMessages.NotInitialized; - } - public boolean isLocalEcho() { - return getConnectorImpl().isLocalEcho(); - } - public void load(ISettingsStore store) { - if(fConnector==null) { - fStore=store; - } else { - getConnectorImpl().load(store); - } - } - @Override - public void setDefaultSettings() { - getConnectorImpl().setDefaultSettings(); - } - public void save(ISettingsStore store) { - // no need to save the settings: it cannot have changed - // because we are not initialized.... - if(fConnector!=null) - getConnectorImpl().save(store); - } - public void setTerminalSize(int newWidth, int newHeight) { - // we assume that setTerminalSize is called also after - // the terminal has been initialized. Else we would have to cache - // the values.... - if(fConnector!=null) { - fConnector.setTerminalSize(newWidth, newHeight); - } - } - public Object getAdapter(Class adapter) { - TerminalConnectorImpl connector=null; - if(isInitialized()) - connector=getConnectorImpl(); - // if we cannot create the connector then we cannot adapt... - if(connector!=null) { - // maybe the connector is adaptable - if(connector instanceof IAdaptable) { - Object result =((IAdaptable)connector).getAdapter(adapter); - // Not sure if the next block is needed.... - if(result==null) - //defer to the platform - result= Platform.getAdapterManager().getAdapter(connector, adapter); - if(result!=null) - return result; - } - // maybe the real adapter is what we need.... - if(adapter.isInstance(connector)) - return connector; - } - // maybe we have to be adapted.... - return Platform.getAdapterManager().getAdapter(this, adapter); - } -} \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/connector/TerminalToRemoteInjectionOutputStream.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/connector/TerminalToRemoteInjectionOutputStream.java deleted file mode 100644 index e73568d..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/connector/TerminalToRemoteInjectionOutputStream.java +++ /dev/null @@ -1,163 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.connector; - -import java.io.ByteArrayOutputStream; -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -class TerminalToRemoteInjectionOutputStream extends FilterOutputStream { - /** - * This class handles bytes written to the {@link TerminalToRemoteInjectionOutputStream}. - */ - static abstract public class Interceptor { - protected OutputStream fOriginal; - /** - * @param original the injection into the original stream begins - * @throws IOException - */ - public void begin(OutputStream original) throws IOException { - fOriginal=original; - } - /** - * @param b a byte was written to the {@link TerminalToRemoteInjectionOutputStream}. - * @throws IOException - */ - public void write(int b) throws IOException { - } - /** - * @param b bytes written to the {@link TerminalToRemoteInjectionOutputStream}. - * @param off the start offset in the data. - * @param len the number of bytes to write. - * @throws IOException - */ - public void write(byte[] b, int off, int len) throws IOException { - } - /** - * The injection into the normal stream ends. - * @throws IOException - */ - public void close() throws IOException { - } - public void flush() { - } - } - static public class BufferInterceptor extends Interceptor { - private final ByteArrayOutputStream fBuffer=new ByteArrayOutputStream(); - public void close() throws IOException { - fOriginal.write(fBuffer.toByteArray()); - } - public void write(byte[] b, int off, int len) throws IOException { - fBuffer.write(b, off, len); - } - public void write(int b) throws IOException { - fBuffer.write(b); - } - } - private class TerminalFilterOutputStream extends OutputStream { - final private Object fLock=TerminalToRemoteInjectionOutputStream.this; - public void close() throws IOException { - synchronized(fLock) { - if(fInjection==this) { - flush(); - ungrabOutput(); - } - } - } - public void write(byte[] b, int off, int len) throws IOException { - synchronized(fLock) { - checkStream(); - out.write(b, off, len); - } - } - public void write(byte[] b) throws IOException { - synchronized(fLock) { - checkStream(); - out.write(b); - } - } - public void flush() throws IOException { - synchronized(fLock) { - checkStream(); - out.flush(); - } - } - public void write(int b) throws IOException { - synchronized(fLock) { - checkStream(); - out.write(b); - } - } - private void checkStream() throws IOException { - if(fInjection!=this) - throw new IOException("Stream is closed"); //$NON-NLS-1$ - } - } - private Interceptor fInterceptor; - private TerminalFilterOutputStream fInjection; - public TerminalToRemoteInjectionOutputStream(OutputStream out) { - super(out); - } - synchronized protected void ungrabOutput() throws IOException { - if(fInterceptor!=null) { - fInterceptor.close(); - fInterceptor=null; - fInjection=null; - } - } - /** - * There can only be one injection stream active at a time. You must call close on the - * returned output stream to end the injection. - * @param interceptor This is used handle bytes sent while the injection stream is active. - * @return a output stream that can be used to write to the decorated stream. - * @throws IOException - */ - public synchronized OutputStream grabOutput(Interceptor interceptor) throws IOException { - if(fInjection!=null) { - throw new IOException("Buffer in use"); //$NON-NLS-1$ - } - fInterceptor=interceptor; - fInterceptor.begin(out); - fInjection=new TerminalFilterOutputStream(); - return fInjection; - } - /** See {@link #grabOutput(TerminalToRemoteInjectionOutputStream.Interceptor)}. - * @return injection output stream - * @throws IOException - */ - public synchronized OutputStream grabOutput() throws IOException { - return grabOutput(new BufferInterceptor()); - } - synchronized public void close() throws IOException { - if(fInjection!=null) { - fInjection.close(); - } - super.close(); - } - synchronized public void flush() throws IOException { - if(fInterceptor!=null) - fInterceptor.flush(); - out.flush(); - } - synchronized public void write(byte[] b, int off, int len) throws IOException { - if(fInterceptor!=null) - fInterceptor.write(b, off, len); - else - out.write(b, off, len); - } - synchronized public void write(int b) throws IOException { - if(fInterceptor!=null) - fInterceptor.write(b); - else - out.write(b); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/CommandInputFieldWithHistory.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/CommandInputFieldWithHistory.java deleted file mode 100644 index ffcdc4a..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/CommandInputFieldWithHistory.java +++ /dev/null @@ -1,322 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial implementation - * Michael Scharf (Wing River) - [211659] Add field assist to terminal input field - * Michael Scharf (Wing River) - [196447] The optional terminal input line should be resizeable - * Martin Oberhuber (Wind River) - [168197] Fix Terminal for CDC-1.1/Foundation-1.1 - * Michael Scharf (Wing River) - [236458] Fix 168197 lost the last entry - * Anton Leherbauer (Wind River) - [220971] The optional terminal input line has redraw problems when resizing - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.StringTokenizer; - -import org.eclipse.jface.fieldassist.IContentProposal; -import org.eclipse.jface.fieldassist.IContentProposalProvider; -import org.eclipse.jface.fieldassist.TextContentAdapter; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.KeyListener; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Sash; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter; - - - -/** - * Manages the Command History for the command line input - * of the terminal control. - *
  • - *
      Navigate with ARROW_UP,ARROW_DOWN,PAGE_UP,PAGE_DOWN - *
        ESC to cancel history editing - *
          History can be edited (by moving up and edit) but changes are - * not persistent (like in bash). - *
            If the same command is entered multiple times in a row, - * only one entry is kept in the history. - * - * - */ -public class CommandInputFieldWithHistory implements ICommandInputField { - private class FieldAssist implements IContentProposalProvider { - - public IContentProposal[] getProposals(String contents, int position) { - String prefix=contents.substring(0, position); - List result=new ArrayList(); - // show an entry only once - Set seen=new HashSet(); - for (Iterator iterator = fHistory.iterator(); iterator.hasNext();) { - String history = iterator.next(); - if(history.startsWith(prefix) && !seen.contains(history)) { - // the content is the rest of the history item - String content=history.substring(prefix.length()); - result.add(new Proposal(content,history)); - // don't add this proposal again - seen.add(history); - } - } - return result.toArray(new IContentProposal[result.size()]); - } - - } - private static class Proposal implements IContentProposal { - - private final String fContent; - private final String fLabel; - Proposal(String content, String label) { - fContent= content; - fLabel= label; - } - public String getContent() { - return fContent; - } - - public String getLabel() { - return fLabel; - } - - public String getDescription() { - return null; - } - - public int getCursorPosition() { - return fContent.length(); - } - } - - final List fHistory=new ArrayList(); - /** - * Keeps a modifiable history while in history editing mode - */ - List fEditedHistory; - /** - * The current position in the edit history - */ - private int fEditHistoryPos=0; - /** - * The limit of the history. - */ - private final int fMaxSize; - /** - * The input text field. - */ - private Text fInputField; - private Sash fSash; - private Composite fPanel; - public CommandInputFieldWithHistory(int maxHistorySize) { - fMaxSize=maxHistorySize; - } - /** - * Add a line to the history. - * @param line The line to be added to the history. - */ - protected void pushLine(String line) { - endHistoryMode(); - // anything to remember? - if(line==null || line.trim().length()==0) - return; - fHistory.add(0,line); - // ignore if the same as last - if(fHistory.size()>1 && line.equals(fHistory.get(1))) - fHistory.remove(0); - // limit the history size. - if(fHistory.size()>=fMaxSize) - fHistory.remove(fHistory.size()-1); - } - /** - * Sets the history - * @param history or null - */ - public void setHistory(String history) { - endHistoryMode(); - fHistory.clear(); - if(history==null) - return; - // add history entries separated by '\n' - // fHistory.addAll(Arrays.asList(history.split("\n"))); //$NON-NLS-1$ - // - StringTokenizer tok=new StringTokenizer(history,"\n"); //$NON-NLS-1$ - while(tok.hasMoreElements()) - fHistory.add((String) tok.nextElement()); - // - } - /** - * @return the current content of the history buffer and new line separated list - */ - public String getHistory() { - StringBuffer buff=new StringBuffer(); - boolean sep=false; - for (Iterator iterator = fHistory.iterator(); iterator.hasNext();) { - String line=iterator.next(); - if(line.length()>0) { - if(sep) - buff.append("\n"); //$NON-NLS-1$ - else - sep=true; - buff.append(line); - } - } - return buff.toString(); - } - /** - * @param currLine Line of text to be moved in history - * @param count (+1 or -1) for forward and backward movement. -1 goes back - * @return the new string to be displayed in the command line or null, - * if the limit is reached. - */ - public String move(String currLine, int count) { - if(!inHistoryMode()) { - fEditedHistory=new ArrayList(fHistory.size()+1); - fEditedHistory.add(currLine); - fEditedHistory.addAll(fHistory); - fEditHistoryPos=0; - } - fEditedHistory.set(fEditHistoryPos,currLine); - if(fEditHistoryPos+count>=fEditedHistory.size()) - return null; - if(fEditHistoryPos+count<0) - return null; - fEditHistoryPos+=count; - return (String) fEditedHistory.get(fEditHistoryPos); - } - private boolean inHistoryMode() { - return fEditedHistory!=null; - } - - /** - * Exit the history movements and go to position 0; - * @return the string to be shown in the command line - */ - protected String escape() { - if(!inHistoryMode()) - return null; - String line= (String) fEditedHistory.get(0); - endHistoryMode(); - return line; - } - /** - * End history editing - */ - private void endHistoryMode() { - fEditedHistory=null; - fEditHistoryPos=0; - } - public void createControl(final Composite parent,final ITerminalViewControl terminal) { -// fSash = new Sash(parent,SWT.HORIZONTAL|SWT.SMOOTH); - fSash = new Sash(parent,SWT.HORIZONTAL); - final GridData gd_sash = new GridData(SWT.FILL, SWT.CENTER, true, false); - gd_sash.heightHint=5; - fSash.setLayoutData(gd_sash); - fSash.addListener (SWT.Selection, new Listener () { - public void handleEvent (Event e) { - if (e.detail == SWT.DRAG) { - // don't redraw during drag, it causes paint errors - bug 220971 - return; - } - // no idea why this is needed - GridData gdata = (GridData) fInputField.getLayoutData(); - Rectangle sashRect = fSash.getBounds (); - Rectangle containerRect = parent.getClientArea (); - - int h=fInputField.getLineHeight(); - // make sure the input filed height is a multiple of the line height - gdata.heightHint = Math.max(((containerRect.height-e.y-sashRect.height)/h)*h,h); - // do not show less then one line - e.y=Math.min(e.y,containerRect.height-h); - fInputField.setLayoutData(gdata); - parent.layout(); - // else the content assist icon will be replicated - parent.redraw(); - } - }); - fPanel = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(); - layout.marginWidth = 0; layout.marginHeight = 0; layout.marginTop = 0; layout.marginBottom = 2; - fPanel.setLayout(layout); - fPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - fInputField=new Text(fPanel, SWT.MULTI|SWT.BORDER|SWT.WRAP|SWT.V_SCROLL); - GridData data=new GridData(SWT.FILL, SWT.FILL, true, false); - boolean installDecoration=true; - if(installDecoration) { - // The ContentAssistCommandAdapter says: "The client is responsible for - // ensuring that adequate space is reserved for the decoration." - // TODO: what is the "adequate space"??? - data.horizontalIndent=6; - } - fInputField.setLayoutData(data); - fInputField.setFont(terminal.getFont()); - // Register field assist *before* the key listener. - // Else the ENTER key is sent *first* to the input field - // and then to the field assist popup. - // (https://bugs.eclipse.org/bugs/show_bug.cgi?id=211659) - new ContentAssistCommandAdapter( - fInputField, - new TextContentAdapter(), - new FieldAssist(), - null, - null, - installDecoration); - fInputField.addKeyListener(new KeyListener(){ - public void keyPressed(KeyEvent e) { - // if the field assist has handled the key already then - // ignore it (https://bugs.eclipse.org/bugs/show_bug.cgi?id=211659) - if(!e.doit) - return; - if(e.character==SWT.CR || e.character==SWT.LF) { - e.doit=false; - String line=fInputField.getText(); - if(!terminal.pasteString(line+'\r')) - return; - pushLine(line); - setCommand("");//$NON-NLS-1$ - } else if(e.keyCode==SWT.ARROW_UP || e.keyCode==SWT.PAGE_UP) { - e.doit=false; - setCommand(move(fInputField.getText(),1)); - } else if(e.keyCode==SWT.ARROW_DOWN || e.keyCode==SWT.PAGE_DOWN) { - e.doit=false; - setCommand(move(fInputField.getText(),-1)); - } else if(e.keyCode==SWT.ESC) { - e.doit=false; - setCommand(escape()); - } - } - private void setCommand(String line) { - if(line==null) - return; - fInputField.setText(line); - fInputField.setSelection(fInputField.getCharCount()); - } - public void keyReleased(KeyEvent e) { - } - }); - } - public void setFont(Font font) { - fInputField.setFont(font); - fInputField.getParent().layout(true); - } - public void dispose() { - fSash.dispose(); - fSash=null; - fPanel.dispose(); - fPanel=null; - fInputField.dispose(); - fInputField=null; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ICommandInputField.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ICommandInputField.java deleted file mode 100644 index a65a61c..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ICommandInputField.java +++ /dev/null @@ -1,35 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial implementation - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control; - -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.widgets.Composite; - -/** - * Interface to create a command input control. - * - */ -public interface ICommandInputField { - /** - * @param parent - * @param terminal - */ - void createControl(Composite parent, ITerminalViewControl terminal); - - void dispose(); - /** - * Sets the font of a control created with {@link #createControl(Composite, ITerminalViewControl)} - * @param control - * @param font the new text font - */ - void setFont(Font font); - -} \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalListener.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalListener.java deleted file mode 100644 index 587abfd..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalListener.java +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control; - -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; - -/** - * Provided by a view implementation. - * @author Michael Scharf - * - */ -public interface ITerminalListener { - /** - * Called when the state of the connection has changed. - * @param state - */ - void setState(TerminalState state); - - /** - * Set the title of the terminal. - * @param title - */ - void setTerminalTitle(String title); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalListener2.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalListener2.java deleted file mode 100644 index 76bc56d..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalListener2.java +++ /dev/null @@ -1,27 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control; - -/** - * Terminal listener allowing to listen to terminal selection changes. - * - * @since 4.1 - */ -public interface ITerminalListener2 extends ITerminalListener { - - /** - * selection has been changed internally e.g. select all - * clients might want to react on that - * NOTE: this does not include mouse selections - * those are handled in separate MouseListeners - * TODO should be unified - */ - void setTerminalSelectionChanged(); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalMouseListener.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalMouseListener.java deleted file mode 100644 index d72c26c..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalMouseListener.java +++ /dev/null @@ -1,43 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 CWI. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Davy Landman (CWI) - [475267][api] Initial definition of interface - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control; - -import org.eclipse.tm.terminal.model.ITerminalTextDataReadOnly; - -/** - * Terminal specific version of {@link org.eclipse.swt.events.MouseListener} - * @since 4.1 - */ -public interface ITerminalMouseListener { - /** - * Invoked when a double-click has happend inside the terminal control.
            - *
            - * Important: the event fires for every click, even outside the text region. - * @param terminalText a read-only view of the current terminal text - * @param button see {@link org.eclipse.swt.events.MouseEvent#button} for the meaning of the button values - */ - void mouseDoubleClick(ITerminalTextDataReadOnly terminalText, int line, int column, int button); - /** - * Invoked when a mouse button is pushed down inside the terminal control.
            - *
            - * Important: the event fires for every mouse down, even outside the text region. - * @param terminalText a read-only view of the current terminal text - * @param button see {@link org.eclipse.swt.events.MouseEvent#button} for the meaning of the button values - */ - void mouseDown(ITerminalTextDataReadOnly terminalText, int line, int column, int button); - /** - * Invoked when a mouse button is released inside the terminal control.
            - *
            - * Important: the event fires for every mouse up, even outside the text region. - * @param terminalText a read-only view of the current terminal text - * @param button see {@link org.eclipse.swt.events.MouseEvent#button} for the meaning of the button values - */ - void mouseUp(ITerminalTextDataReadOnly terminalText, int line, int column, int button); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java deleted file mode 100644 index 904897c..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java +++ /dev/null @@ -1,133 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Martin Oberhuber (Wind River) - [204796] Terminal should allow setting the encoding to use - * Martin Oberhuber (Wind River) - [265352][api] Allow setting fonts programmatically - * Davy Landman (CWI) - [475267][api] Allow custom mouse listeners - ******************************************************************************/ -package org.eclipse.tm.internal.terminal.control; - -import java.io.UnsupportedEncodingException; - -import org.eclipse.swt.dnd.Clipboard; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.widgets.Control; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; - -/** - * @author Michael Scharf - * - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - */ -public interface ITerminalViewControl { - /** - * Set the encoding that the Terminal uses to decode byte streams into - * characters. - * - * @see ITerminalControl#setEncoding(String) - * @since org.eclipse.tm.terminal 2.0 - */ - void setEncoding(String encoding) throws UnsupportedEncodingException; - - /** - * Get the Terminal's current encoding. - * - * @return the current Encoding of the Terminal. - * @see ITerminalControl#getEncoding() - * @since org.eclipse.tm.terminal 2.0 - */ - String getEncoding(); - - boolean isEmpty(); - /** - * Sets the Terminal font - * @deprecated use {@link #setFont(String)} in order to support bold and italic variants of the given font - * @param font - */ - void setFont(Font font); - /** - * Sets the font for the Terminal, using a JFace symbolic font name, such - * that bold and italic variants can be leveraged. - * @since 3.2 - * @param fontName - */ - void setFont(String fontName); - void setInvertedColors(boolean invert); - Font getFont(); - /** - * @return the text control - */ - Control getControl(); - /** - * @return the root of all controls - */ - Control getRootControl(); - boolean isDisposed(); - void selectAll(); - void clearTerminal(); - void copy(); - void paste(); - String getSelection(); - TerminalState getState(); - Clipboard getClipboard(); - void disconnectTerminal(); - void disposeTerminal(); - String getSettingsSummary(); - ITerminalConnector[] getConnectors(); - void setFocus(); - ITerminalConnector getTerminalConnector(); - void setConnector(ITerminalConnector connector); - void connectTerminal(); - /** - * @param write a single character to terminal - */ - void sendKey(char arg0); - /** - * @param string write string to terminal - */ - public boolean pasteString(String string); - - boolean isConnected(); - - /** - * @param inputField null means no input field is shown - */ - void setCommandInputField(ICommandInputField inputField); - /** - * @return null or the current input field - */ - ICommandInputField getCommandInputField(); - - /** - * @return the maximum number of lines to display - * in the terminal view. -1 means unlimited. - */ - public int getBufferLineLimit(); - - /** - * @param bufferLineLimit the maximum number of lines to show - * in the terminal view. -1 means unlimited. - */ - public void setBufferLineLimit(int bufferLineLimit); - boolean isScrollLock(); - void setScrollLock(boolean on); - - /** - * @since 4.1 - */ - void addMouseListener(ITerminalMouseListener listener); - /** - * @since 4.1 - */ - void removeMouseListener(ITerminalMouseListener listener); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/TerminalViewControlFactory.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/TerminalViewControlFactory.java deleted file mode 100644 index 9ccbdaa..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/TerminalViewControlFactory.java +++ /dev/null @@ -1,44 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Martin Oberhuber (Wind River) - [378691][api] push Preferences into the Widget - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control; - -import org.eclipse.swt.widgets.Composite; -import org.eclipse.tm.internal.terminal.emulator.VT100TerminalControl; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; - -public class TerminalViewControlFactory { - /** - * Instantiate a Terminal widget. - * @param target Callback for notifying the owner of Terminal state changes. - * @param wndParent The Window parent to embed the Terminal in. - * @param connectors Provided connectors. - */ - public static ITerminalViewControl makeControl(ITerminalListener target, Composite wndParent, ITerminalConnector[] connectors) { - return makeControl(target, wndParent, connectors, false); - } - - /** - * Instantiate a Terminal widget. - * @param target Callback for notifying the owner of Terminal state changes. - * @param wndParent The Window parent to embed the Terminal in. - * @param connectors Provided connectors. - * @param useCommonPrefs If true, the Terminal widget will pick up settings - * from the org.eclipse.tm.terminal.TerminalPreferencePage Preference page. - * Otherwise, clients need to maintain settings themselves. - * @since 3.2 - */ - public static ITerminalViewControl makeControl(ITerminalListener target, Composite wndParent, ITerminalConnector[] connectors, boolean useCommonPrefs) { - return new VT100TerminalControl(target, wndParent, connectors, useCommonPrefs); - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/AbstractTerminalAction.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/AbstractTerminalAction.java deleted file mode 100644 index 08561b8..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/AbstractTerminalAction.java +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - split into core, view and connector plugins - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Anna Dushistova (MontaVista) - Adapted from TerminalAction - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control.actions; - -import org.eclipse.jface.action.Action; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.resource.ImageRegistry; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.control.impl.TerminalPlugin; - -public abstract class AbstractTerminalAction extends Action { - private final ITerminalViewControl fTarget; - - public AbstractTerminalAction(String strId) { - this(null, strId, 0); - } - - public AbstractTerminalAction(ITerminalViewControl target, - String strId) { - this(target, strId, 0); - } - - public AbstractTerminalAction(ITerminalViewControl target, - String strId, int style) { - super("", style); //$NON-NLS-1$ - - fTarget = target; - - setId(strId); - } - - abstract public void run(); - - protected void setupAction(String strText, String strToolTip, - String strImage, String strEnabledImage, String strDisabledImage, - boolean bEnabled) { - setupAction(strText, strToolTip, strImage, strEnabledImage, - strDisabledImage, bEnabled, TerminalPlugin.getDefault() - .getImageRegistry()); - } - - protected void setupAction(String strText, String strToolTip, - String strHoverImage, String strEnabledImage, - String strDisabledImage, boolean bEnabled, - ImageRegistry imageRegistry) { - setupAction(strText, strToolTip, imageRegistry - .getDescriptor(strHoverImage), imageRegistry - .getDescriptor(strEnabledImage), imageRegistry - .getDescriptor(strDisabledImage), bEnabled); - } - - protected void setupAction(String strText, String strToolTip, - ImageDescriptor hoverImage, ImageDescriptor enabledImage, - ImageDescriptor disabledImage, boolean bEnabled) { - setText(strText); - setToolTipText(strToolTip); - setEnabled(bEnabled); - if (enabledImage != null) { - setImageDescriptor(enabledImage); - } - if (disabledImage != null) { - setDisabledImageDescriptor(disabledImage); - } - if (hoverImage != null) { - setHoverImageDescriptor(hoverImage); - } - } - - /** - * Return the terminal instance on which the action should operate. - * - * @return the terminal instance on which the action should operate. - */ - protected ITerminalViewControl getTarget() { - return fTarget; - } - - /** - * Subclasses can update their action - * - * @param aboutToShow true before the menu is shown -- false when the menu - * gets hidden - */ - public void updateAction(boolean aboutToShow) { - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/ActionMessages.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/ActionMessages.java deleted file mode 100644 index ddcc65b..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/ActionMessages.java +++ /dev/null @@ -1,34 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - split into core, view and connector plugins - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Anna Dushistova (MontaVista) - [227537] moved actions from terminal.view to terminal plugin - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control.actions; - -import org.eclipse.osgi.util.NLS; - -public class ActionMessages extends NLS { - static { - NLS.initializeMessages(ActionMessages.class.getName(), - ActionMessages.class); - } - - public static String COPY; - public static String CUT; - public static String PASTE; - public static String SELECTALL; - public static String CLEARALL; - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/ActionMessages.properties b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/ActionMessages.properties deleted file mode 100644 index 558ab80..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/ActionMessages.properties +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################### -# Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/epl-v10.html -# -# Initial Contributors: -# The following Wind River employees contributed to the Terminal component -# that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, -# Helmut Haigermoser and Ted Williams. -# -# Contributors: -# Michael Scharf (Wind River) - split into core, view and connector plugins -# Martin Oberhuber (Wind River) - fixed copyright headers and beautified -# Anna Dushistova (MontaVista) - [227537] moved actions from terminal.view to terminal plugin -############################################################################### - -# NLS_MESSAGEFORMAT_NONE - -COPY = Copy -CUT = Cut -PASTE = Paste -SELECTALL = Select All -CLEARALL = Clear Terminal diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/ImageConsts.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/ImageConsts.java deleted file mode 100644 index eda9eff..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/ImageConsts.java +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - extracted from TerminalConsts - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Anna Dushistova (MontaVista) - [227537] moved actions from terminal.view to terminal plugin - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control.actions; - -public interface ImageConsts { - public final static String IMAGE_DIR_ROOT = "icons/"; //$NON-NLS-1$ - public final static String IMAGE_DIR_LOCALTOOL = IMAGE_DIR_ROOT + "clcl16/"; // basic colors - size 16x16 //$NON-NLS-1$ - public final static String IMAGE_DIR_DLCL = IMAGE_DIR_ROOT + "dlcl16/"; // disabled - size 16x16 //$NON-NLS-1$ - public final static String IMAGE_DIR_ELCL = IMAGE_DIR_ROOT+ "elcl16/"; // enabled - size 16x16 //$NON-NLS-1$ - - public static final String IMAGE_CLCL_CLEAR_ALL = "ImageClclClearAll"; //$NON-NLS-1$ - - public static final String IMAGE_DLCL_CLEAR_ALL = "ImageDlclClearAll"; //$NON-NLS-1$ - - public static final String IMAGE_ELCL_CLEAR_ALL = "ImageElclClearAll"; //$NON-NLS-1$ -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionClearAll.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionClearAll.java deleted file mode 100644 index 85650f6..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionClearAll.java +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - split into core, view and connector plugins - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Anna Dushistova (MontaVista) - [227537] moved actions from terminal.view to terminal plugin - * Uwe Stieber (Wind River) - [260372] [terminal] Certain terminal actions are enabled if no target terminal control is available - ********************************************************************************/ -package org.eclipse.tm.internal.terminal.control.actions; - -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; - -public class TerminalActionClearAll extends AbstractTerminalAction { - public TerminalActionClearAll() { - super(TerminalActionClearAll.class.getName()); - - setupAction(ActionMessages.CLEARALL, ActionMessages.CLEARALL, - ImageConsts.IMAGE_CLCL_CLEAR_ALL, - ImageConsts.IMAGE_ELCL_CLEAR_ALL, - ImageConsts.IMAGE_DLCL_CLEAR_ALL, false); - } - - public TerminalActionClearAll(ITerminalViewControl target) { - super(target, TerminalActionClearAll.class.getName()); - - setupAction(ActionMessages.CLEARALL, ActionMessages.CLEARALL, - ImageConsts.IMAGE_CLCL_CLEAR_ALL, - ImageConsts.IMAGE_ELCL_CLEAR_ALL, - ImageConsts.IMAGE_DLCL_CLEAR_ALL, false); - } - - public void run() { - ITerminalViewControl target = getTarget(); - if (target != null) { - target.clearTerminal(); - } - } - - public void updateAction(boolean aboutToShow) { - ITerminalViewControl target = getTarget(); - setEnabled(target != null && !target.isEmpty()); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionCopy.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionCopy.java deleted file mode 100644 index 49260c1..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionCopy.java +++ /dev/null @@ -1,67 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - split into core, view and connector plugins - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Anna Dushistova (MontaVista) - [227537] moved actions from terminal.view to terminal plugin - * Uwe Stieber (Wind River) - [260372] [terminal] Certain terminal actions are enabled if no target terminal control is available - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control.actions; - -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.ui.ISharedImages; -import org.eclipse.ui.PlatformUI; - -public class TerminalActionCopy extends AbstractTerminalAction { - public TerminalActionCopy() { - super(TerminalActionCopy.class.getName()); - setActionDefinitionId("org.eclipse.tm.terminal.copy"); //$NON-NLS-1$ - ISharedImages si = PlatformUI.getWorkbench().getSharedImages(); - setupAction(ActionMessages.COPY, ActionMessages.COPY, si - .getImageDescriptor(ISharedImages.IMG_TOOL_COPY), si - .getImageDescriptor(ISharedImages.IMG_TOOL_COPY), si - .getImageDescriptor(ISharedImages.IMG_TOOL_COPY_DISABLED), true); - } - - public TerminalActionCopy(ITerminalViewControl target) { - super(target, TerminalActionCopy.class.getName()); - setActionDefinitionId("org.eclipse.tm.terminal.copy"); //$NON-NLS-1$ - ISharedImages si = PlatformUI.getWorkbench().getSharedImages(); - setupAction(ActionMessages.COPY, ActionMessages.COPY, si - .getImageDescriptor(ISharedImages.IMG_TOOL_COPY), si - .getImageDescriptor(ISharedImages.IMG_TOOL_COPY), si - .getImageDescriptor(ISharedImages.IMG_TOOL_COPY_DISABLED), true); - } - - public void run() { - ITerminalViewControl target = getTarget(); - if (target != null) { - String selection = target.getSelection(); - - if (!selection.equals("")) {//$NON-NLS-1$ - target.copy(); - } else { - target.sendKey('\u0003'); - } - } - } - - public void updateAction(boolean aboutToShow) { - ITerminalViewControl target = getTarget(); - boolean bEnabled = target != null; - if (aboutToShow && bEnabled) { - bEnabled = target.getSelection().length() > 0; - } - setEnabled(bEnabled); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionCut.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionCut.java deleted file mode 100644 index 63532bd..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionCut.java +++ /dev/null @@ -1,54 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - split into core, view and connector plugins - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Uwe Stieber (Wind River) - [260372] [terminal] Certain terminal actions are enabled if no target terminal control is available - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control.actions; - -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.ui.ISharedImages; -import org.eclipse.ui.PlatformUI; - -public class TerminalActionCut extends AbstractTerminalAction { - public TerminalActionCut() { - super(TerminalActionCut.class.getName()); - ISharedImages si = PlatformUI.getWorkbench().getSharedImages(); - setupAction(ActionMessages.CUT, ActionMessages.CUT, si - .getImageDescriptor(ISharedImages.IMG_TOOL_CUT), si - .getImageDescriptor(ISharedImages.IMG_TOOL_CUT), si - .getImageDescriptor(ISharedImages.IMG_TOOL_CUT_DISABLED), true); - } - - public TerminalActionCut(ITerminalViewControl target) { - super(target, TerminalActionCut.class.getName()); - ISharedImages si = PlatformUI.getWorkbench().getSharedImages(); - setupAction(ActionMessages.CUT, ActionMessages.CUT, si - .getImageDescriptor(ISharedImages.IMG_TOOL_CUT), si - .getImageDescriptor(ISharedImages.IMG_TOOL_CUT), si - .getImageDescriptor(ISharedImages.IMG_TOOL_CUT_DISABLED), true); - } - - public void run() { - ITerminalViewControl target = getTarget(); - if (target != null) { - target.sendKey('\u0018'); - } - } - - public void updateAction(boolean aboutToShow) { - // Cut is always disabled - setEnabled(false); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionPaste.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionPaste.java deleted file mode 100644 index ca1011c..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionPaste.java +++ /dev/null @@ -1,69 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - split into core, view and connector plugins - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Anna Dushistova (MontaVista) - [227537] moved actions from terminal.view to terminal plugin - * Uwe Stieber (Wind River) - [260372] [terminal] Certain terminal actions are enabled if no target terminal control is available - * Uwe Stieber (Wind River) - [294719] [terminal] SWT Widget disposed in TerminalActionPaste - * Martin Oberhuber (Wind River) - [296212] Cannot paste text into terminal on some Linux hosts - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control.actions; - -import org.eclipse.swt.dnd.TextTransfer; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.ui.ISharedImages; -import org.eclipse.ui.PlatformUI; - -public class TerminalActionPaste extends AbstractTerminalAction { - public TerminalActionPaste() { - super(TerminalActionPaste.class.getName()); - setActionDefinitionId("org.eclipse.tm.terminal.paste"); //$NON-NLS-1$ - ISharedImages si = PlatformUI.getWorkbench().getSharedImages(); - setupAction(ActionMessages.PASTE, ActionMessages.PASTE, - si.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE), - si.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE), - si.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED), - false); - } - - public TerminalActionPaste(ITerminalViewControl target) { - super(target, TerminalActionPaste.class.getName()); - setActionDefinitionId("org.eclipse.tm.terminal.paste"); //$NON-NLS-1$ - ISharedImages si = PlatformUI.getWorkbench().getSharedImages(); - setupAction(ActionMessages.PASTE, ActionMessages.PASTE, - si.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE), - si.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE), - si.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED), - false); - } - - public void run() { - ITerminalViewControl target = getTarget(); - if (target != null) { - target.paste(); - } - } - - public void updateAction(boolean aboutToShow) { - ITerminalViewControl target = getTarget(); - boolean bEnabled = target != null && target.getClipboard() != null && !target.getClipboard().isDisposed(); - if (bEnabled) { - String strText = (String) target.getClipboard().getContents( - TextTransfer.getInstance()); - bEnabled = ((strText != null) && (!strText.equals("")) && (target.getState() == TerminalState.CONNECTED));//$NON-NLS-1$ - } - setEnabled(bEnabled); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionSelectAll.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionSelectAll.java deleted file mode 100644 index a91ec1c..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/actions/TerminalActionSelectAll.java +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - split into core, view and connector plugins - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Anna Dushistova (MontaVista) - [227537] moved actions from terminal.view to terminal plugin - * Uwe Stieber (Wind River) - [260372] [terminal] Certain terminal actions are enabled if no target terminal control is available - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control.actions; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; - -public class TerminalActionSelectAll extends AbstractTerminalAction { - public TerminalActionSelectAll() { - super(TerminalActionSelectAll.class.getName()); - - setupAction(ActionMessages.SELECTALL, ActionMessages.SELECTALL, - (ImageDescriptor) null, null, null, false); - } - - public TerminalActionSelectAll(ITerminalViewControl target) { - super(target, TerminalActionSelectAll.class.getName()); - - setupAction(ActionMessages.SELECTALL, ActionMessages.SELECTALL, - (ImageDescriptor) null, null, null, false); - } - - public void run() { - ITerminalViewControl target = getTarget(); - if (target != null) { - target.selectAll(); - } - } - - public void updateAction(boolean aboutToShow) { - ITerminalViewControl target = getTarget(); - setEnabled(target != null && !target.isEmpty()); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/ITerminalControlForText.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/ITerminalControlForText.java deleted file mode 100644 index f154680..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/ITerminalControlForText.java +++ /dev/null @@ -1,41 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Anton Leherbauer (Wind River) - [458398] Add support for normal/application cursor keys mode - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control.impl; - -import java.io.OutputStream; - -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; - -/** - * need a better name! - * @author Michael Scharf - * - */ -public interface ITerminalControlForText { - - TerminalState getState(); - void setState(TerminalState state); - void setTerminalTitle(String title); - - ITerminalConnector getTerminalConnector(); - - OutputStream getOutputStream(); - - /** - * Enable/disable Application Cursor Keys mode (DECCKM) - * @param enable - */ - void enableApplicationCursorKeys(boolean enable); - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/TerminalMessages.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/TerminalMessages.java deleted file mode 100644 index 137d67a..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/TerminalMessages.java +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Martin Oberhuber (Wind River) - [378691][api] push Preferences into the Widget - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control.impl; - -import org.eclipse.osgi.util.NLS; - -public class TerminalMessages extends NLS { - static { - NLS.initializeMessages(TerminalMessages.class.getName(), TerminalMessages.class); - } - - public static String TerminalError; - public static String SocketError; - public static String IOError; - public static String CannotConnectTo; - public static String NotInitialized; - - //Preference Page - public static String INVERT_COLORS; - public static String BUFFERLINES; - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/TerminalMessages.properties b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/TerminalMessages.properties deleted file mode 100644 index dd249e2..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/TerminalMessages.properties +++ /dev/null @@ -1,28 +0,0 @@ -############################################################################### -# Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/epl-v10.html -# -# Initial Contributors: -# The following Wind River employees contributed to the Terminal component -# that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, -# Helmut Haigermoser and Ted Williams. -# -# Contributors: -# Michael Scharf (Wind River) - split into core, view and connector plugins -# Martin Oberhuber (Wind River) - fixed copyright headers and beautified -# Martin Oberhuber (Wind River) - [378691][api] push Preferences into the Widget -############################################################################### - -# NLS_MESSAGEFORMAT_VAR - -TerminalError = Terminal Error -SocketError = Socket Error -IOError = IO Error -CannotConnectTo = Cannot initialize {0}:\n{1} -NotInitialized = Not Initialized - -INVERT_COLORS = Invert terminal colors -BUFFERLINES = Terminal buffer lines: diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/TerminalPlugin.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/TerminalPlugin.java deleted file mode 100644 index de791f8..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/control/impl/TerminalPlugin.java +++ /dev/null @@ -1,92 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - split into core, view and connector plugins - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Anna Dushistova (MontaVista) - [227537] moved actions from terminal.view to terminal plugin - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.control.impl; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.resource.ImageRegistry; -import org.eclipse.tm.internal.terminal.control.actions.ImageConsts; -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.BundleContext; - -public class TerminalPlugin extends AbstractUIPlugin { - private static TerminalPlugin plugin; - public static final String PLUGIN_ID = "org.eclipse.tm.terminal.control"; //$NON-NLS-1$ - public static final String HELP_VIEW = PLUGIN_ID + ".terminal_view"; //$NON-NLS-1$ - - /** - * The constructor. - */ - public TerminalPlugin() { - } - /** - * Returns the shared instance. - */ - public static TerminalPlugin getDefault() { - return plugin; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) - */ - @Override - public void start(BundleContext context) throws Exception { - super.start(context); - plugin = this; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) - */ - @Override - public void stop(BundleContext context) throws Exception { - plugin = null; - super.stop(context); - } - - public static boolean isOptionEnabled(String strOption) { - String strEnabled = Platform.getDebugOption(strOption); - if (strEnabled == null) - return false; - - return new Boolean(strEnabled).booleanValue(); - } - - @Override - protected void initializeImageRegistry(ImageRegistry imageRegistry) { - try { - // Local toolbars - putImageInRegistry(imageRegistry, ImageConsts.IMAGE_CLCL_CLEAR_ALL, ImageConsts.IMAGE_DIR_LOCALTOOL + "clear_co.gif"); //$NON-NLS-1$ - // Enabled local toolbars - putImageInRegistry(imageRegistry, ImageConsts.IMAGE_ELCL_CLEAR_ALL, ImageConsts.IMAGE_DIR_ELCL + "clear_co.gif"); //$NON-NLS-1$ - // Disabled local toolbars - putImageInRegistry(imageRegistry, ImageConsts.IMAGE_DLCL_CLEAR_ALL, ImageConsts.IMAGE_DIR_DLCL + "clear_co.gif"); //$NON-NLS-1$ - } catch (MalformedURLException malformedURLException) { - malformedURLException.printStackTrace(); - } - } - - protected void putImageInRegistry(ImageRegistry imageRegistry, String strKey, String relativePath) throws MalformedURLException { - URL url = TerminalPlugin.getDefault().getBundle().getEntry(relativePath); - ImageDescriptor imageDescriptor = ImageDescriptor.createFromURL(url); - imageRegistry.put(strKey, imageDescriptor); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/EditActionAccelerators.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/EditActionAccelerators.java deleted file mode 100644 index e95d69e..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/EditActionAccelerators.java +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - *******************************************************************************/ - -package org.eclipse.tm.internal.terminal.emulator; - -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.jface.bindings.TriggerSequence; -import org.eclipse.jface.bindings.keys.KeySequence; -import org.eclipse.jface.bindings.keys.KeyStroke; -import org.eclipse.jface.bindings.keys.SWTKeySupport; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.keys.IBindingService; - -class EditActionAccelerators { - private static final String COPY_COMMAND_ID = "org.eclipse.tm.terminal.copy"; //$NON-NLS-1$ - private static final String PASTE_COMMAND_ID = "org.eclipse.tm.terminal.paste"; //$NON-NLS-1$ - - private final Map commandIdsByAccelerator = new HashMap(); - - private void load() { - addAccelerator(COPY_COMMAND_ID); - addAccelerator(PASTE_COMMAND_ID); - } - - private void addAccelerator(String commandId) { - TriggerSequence[] bindings = bindingsFor(commandId); - for (int i=0; i - * - * There are never any ANSI control characters or escape sequences in the - * text being displayed by this method (this includes newlines, carriage - * returns, and tabs). - *

            - */ - void appendString(String buffer); - - /** - * Process a newline (Control-J) character. A newline (NL) character just - * moves the cursor to the same column on the next line, creating new lines - * when the cursor reaches the bottom edge of the terminal. This is - * counter-intuitive, especially to UNIX programmers who are taught that - * writing a single NL to a terminal is sufficient to move the cursor to the - * first column of the next line, as if a carriage return (CR) and a NL were - * written. - *

            - * - * UNIX terminals typically display a NL character as a CR followed by a NL - * because the terminal device typically has the ONLCR attribute bit set - * (see the termios(4) man page for details), which causes the terminal - * device driver to translate NL to CR + NL on output. The terminal itself - * (i.e., a hardware terminal or a terminal emulator, like xterm or this - * code) _always_ interprets a CR to mean "move the cursor to the beginning - * of the current line" and a NL to mean "move the cursor to the same column - * on the next line". - *

            - */ - void processNewline(); - - /** - * This method returns the relative line number of the line containing the - * cursor. The returned line number is relative to the topmost visible line, - * which has relative line number 0. - * - * @return The relative line number of the line containing the cursor. - */ - int getCursorLine(); - - int getCursorColumn(); - - /** - * This method moves the cursor to the specified line and column. Parameter - * targetLine is the line number of a screen line, so it has a - * minimum value of 0 (the topmost screen line) and a maximum value of - * heightInLines - 1 (the bottommost screen line). A line does not have to - * contain any text to move the cursor to any column in that line. - */ - void setCursor(int targetLine, int targetColumn); - - void setCursorColumn(int targetColumn); - - void setCursorLine(int targetLine); - - int getLines(); - - int getColumns(); - - /** - * Enables VT100 line wrapping mode (default is off). - * This corresponds to the VT100 'eat_newline_glitch' terminal capability. - * If enabled, writing to the rightmost column does not cause - * an immediate wrap to the next line. Instead the line wrap occurs on the - * next output character. - * - * @param enable whether to enable or disable VT100 line wrapping mode - */ - void setVT100LineWrapping(boolean enable); - - /** - * @return whether VT100 line wrapping mode is enabled - */ - boolean isVT100LineWrapping(); - - /** - * Enables/disables insert mode (IRM). - * - * @param enable whether to enable insert mode - */ - void setInsertMode(boolean enable); - - /** - * Set scrolling region. Negative values reset the scroll region. - * - * @param top top line of scroll region - * @param bottom bottom line of scroll region - */ - void setScrollRegion(int top, int bottom); - - /** - * Scroll text upwards. - * - * @param lines number of lines to scroll - */ - void scrollUp(int lines); - - /** - * Scroll text downwards. - * - * @param lines number of lines to scroll - */ - void scrollDown(int lines); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/LoggingOutputStream.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/LoggingOutputStream.java deleted file mode 100644 index 20c176f..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/LoggingOutputStream.java +++ /dev/null @@ -1,48 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.emulator; - -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -import org.eclipse.tm.internal.terminal.provisional.api.Logger; - -public class LoggingOutputStream extends FilterOutputStream { - - public LoggingOutputStream(OutputStream out) { - super(out); - } - - public void write(byte[] b, int off, int len) throws IOException { - if(Logger.isLogEnabled()) - Logger.log("Received " + len + " bytes: '" + //$NON-NLS-1$ //$NON-NLS-2$ - Logger.encode(new String(b, 0, len)) + "'"); //$NON-NLS-1$ - - // we cannot call super.write, because this would call our write - // which logs character by character..... - //super.write(b, off, len); - if ((off | len | (b.length - (len + off)) | (off + len)) < 0) - throw new IndexOutOfBoundsException(); - - for (int i = 0 ; i < len ; i++) { - super.write(b[off + i]); - } - } - - public void write(int b) throws IOException { - if(Logger.isLogEnabled()) - Logger.log("Received " + 1 + " bytes: '" + //$NON-NLS-1$ //$NON-NLS-2$ - Logger.encode(new String(new byte[]{(byte)b}, 0, 1)) + "'"); //$NON-NLS-1$ - super.write(b); - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100BackendTraceDecorator.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100BackendTraceDecorator.java deleted file mode 100644 index 7853143..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100BackendTraceDecorator.java +++ /dev/null @@ -1,176 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Anton Leherbauer (Wind River) - [433751] Add option to enable VT100 line wrapping mode - * Anton Leherbauer (Wind River) - [458218] Add support for ANSI insert mode - * Anton Leherbauer (Wind River) - [458402] Add support for scroll up/down and scroll region - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.emulator; - -import java.io.PrintStream; - -import org.eclipse.tm.terminal.model.Style; - -public class VT100BackendTraceDecorator implements IVT100EmulatorBackend { - final IVT100EmulatorBackend fBackend; - final PrintStream fWriter; - public VT100BackendTraceDecorator(IVT100EmulatorBackend backend, PrintStream out) { - fBackend = backend; - fWriter=out; - } - - public void appendString(String buffer) { - fWriter.println("appendString(\""+buffer+"\")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.appendString(buffer); - } - - public void clearAll() { - fWriter.println("clearAll()"); //$NON-NLS-1$ - fBackend.clearAll(); - } - - public void deleteCharacters(int n) { - fWriter.println("deleteCharacters("+n+")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.deleteCharacters(n); - } - - public void deleteLines(int n) { - fWriter.println("deleteLines("+n+")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.deleteLines(n); - } - - public void eraseAll() { - fWriter.println("eraseAll()"); //$NON-NLS-1$ - fBackend.eraseAll(); - } - - public void eraseLine() { - fWriter.println("eraseLine()"); //$NON-NLS-1$ - fBackend.eraseLine(); - } - - public void eraseLineToCursor() { - fWriter.println("eraseLineToCursor()"); //$NON-NLS-1$ - fBackend.eraseLineToCursor(); - } - - public void eraseLineToEnd() { - fWriter.println("eraseLineToEnd()"); //$NON-NLS-1$ - fBackend.eraseLineToEnd(); - } - - public void eraseToCursor() { - fWriter.println("eraseToCursor()"); //$NON-NLS-1$ - fBackend.eraseToCursor(); - } - - public void eraseToEndOfScreen() { - fWriter.println("eraseToEndOfScreen()"); //$NON-NLS-1$ - fBackend.eraseToEndOfScreen(); - } - - public int getColumns() { - return fBackend.getColumns(); - } - - public int getCursorColumn() { - return fBackend.getCursorColumn(); - } - - public int getCursorLine() { - return fBackend.getCursorLine(); - } - - public Style getDefaultStyle() { - return fBackend.getDefaultStyle(); - } - - public int getLines() { - return fBackend.getLines(); - } - - public Style getStyle() { - return fBackend.getStyle(); - } - - public void insertCharacters(int charactersToInsert) { - fWriter.println("insertCharacters("+charactersToInsert+")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.insertCharacters(charactersToInsert); - } - - public void insertLines(int n) { - fWriter.println("insertLines("+n+")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.insertLines(n); - } - - public void processNewline() { - fWriter.println("processNewline()"); //$NON-NLS-1$ - fBackend.processNewline(); - } - - public void setCursor(int targetLine, int targetColumn) { - fWriter.println("setCursor("+targetLine+", "+targetColumn+")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - fBackend.setCursor(targetLine, targetColumn); - } - - public void setCursorColumn(int targetColumn) { - fWriter.println("setCursorColumn("+targetColumn+")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.setCursorColumn(targetColumn); - } - - public void setCursorLine(int targetLine) { - fWriter.println("setCursorLine("+targetLine+")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.setCursorLine(targetLine); - } - - public void setDefaultStyle(Style defaultStyle) { - fWriter.println("setDefaultStyle("+defaultStyle+")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.setDefaultStyle(defaultStyle); - } - - public void setDimensions(int lines, int cols) { - fWriter.println("setDimensions("+lines+","+cols+")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - fBackend.setDimensions(lines, cols); - } - - public void setStyle(Style style) { - fWriter.println("setStyle("+style+")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.setStyle(style); - } - - public void setVT100LineWrapping(boolean enable) { - fWriter.println("setVT100LineWrapping("+enable+")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.setVT100LineWrapping(enable); - } - - public boolean isVT100LineWrapping() { - return fBackend.isVT100LineWrapping(); - } - - public void setInsertMode(boolean enable) { - fWriter.println("setInsertMode("+enable+")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.setInsertMode(enable); - } - - public void setScrollRegion(int top, int bottom) { - fWriter.println("setScrollRegion("+top+','+bottom+")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.setScrollRegion(top, bottom); - } - - public void scrollUp(int lines) { - fWriter.println("scrollUp("+lines+")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.scrollUp(lines); - } - - public void scrollDown(int lines) { - fWriter.println("scrollDown("+lines+")"); //$NON-NLS-1$ //$NON-NLS-2$ - fBackend.scrollDown(lines); - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100Emulator.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100Emulator.java deleted file mode 100644 index 5e6817a..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100Emulator.java +++ /dev/null @@ -1,1396 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - split into core, view and connector plugins - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Michael Scharf (Wind River) - [209746] There are cases where some colors not displayed correctly - * Martin Oberhuber (Wind River) - [168197] Fix Terminal for CDC-1.1/Foundation-1.1 - * Michael Scharf (Wind River) - [262996] get rid of TerminalState.OPENED - * Martin Oberhuber (Wind River) - [334969] Fix multi-command SGR sequence - * Kris De Volder (VMWare) - [392107] Switched interpretation for ESC[0K and ESC[1K sequences - * Martin Oberhuber (Wind River) - [401386] Regression: No header on top due to incorrect ESC[K interpretation - * Martin Oberhuber (Wind River) - [401480] Handle ESC[39;49m and ESC[G - * Anton Leherbauer (Wind River) - [433751] Add option to enable VT100 line wrapping mode - * Anton Leherbauer (Wind River) - [458218] Add support for ANSI insert mode - * Anton Leherbauer (Wind River) - [458398] Add support for normal/application cursor keys mode - * Anton Leherbauer (Wind River) - [458402] Add support for scroll up/down and scroll region - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.emulator; - -import java.io.IOException; -import java.io.Reader; - -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.events.ControlListener; -import org.eclipse.tm.internal.terminal.control.impl.ITerminalControlForText; -import org.eclipse.tm.internal.terminal.control.impl.TerminalPlugin; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; -import org.eclipse.tm.internal.terminal.provisional.api.Logger; -import org.eclipse.tm.terminal.model.ITerminalTextData; -import org.eclipse.tm.terminal.model.Style; - -/** - * This class processes character data received from the remote host and - * displays it to the user using the Terminal view's StyledText widget. This - * class processes ANSI control characters, including NUL, backspace, carriage - * return, linefeed, and a subset of ANSI escape sequences sufficient to allow - * use of screen-oriented applications, such as vi, Emacs, and any GNU - * readline-enabled application (Bash, bc, ncftp, etc.). - *

            - * - * @author Fran Litterio - * @author Chris Thew - */ -public class VT100Emulator implements ControlListener { - /** This is a character processing state: Initial state. */ - private static final int ANSISTATE_INITIAL = 0; - - /** This is a character processing state: We've seen an escape character. */ - private static final int ANSISTATE_ESCAPE = 1; - - /** - * This is a character processing state: We've seen a '[' after an escape - * character. Expecting a parameter character or a command character next. - */ - private static final int ANSISTATE_EXPECTING_PARAMETER_OR_COMMAND = 2; - - /** - * This is a character processing state: We've seen a ']' after an escape - * character. We are now expecting an operating system command that - * reprograms an intelligent terminal. - */ - private static final int ANSISTATE_EXPECTING_OS_COMMAND = 3; - - /** - * This is a character processing state: We've seen a '[?' after an escape - * character. Expecting a parameter character or a command character next. - */ - private static final int ANSISTATE_EXPECTING_DEC_PRIVATE_COMMAND = 4; - - /** - * This is a character processing state: We've seen one of ()*+-./ after an escape - * character. Expecting a character set designation character. - */ - private static final int ANSISTATE_EXPECTING_CHARSET_DESIGNATION = 5; - - - /** - * This field holds the current state of the Finite TerminalState Automaton (FSA) - * that recognizes ANSI escape sequences. - * - * @see #processNewText() - */ - private int ansiState = ANSISTATE_INITIAL; - - /** - * This field holds a reference to the {@link TerminalControl} object that - * instantiates this class. - */ - private final ITerminalControlForText terminal; - - /** - * This field holds a reference to the StyledText widget that is used to - * display text to the user. - */ - final private IVT100EmulatorBackend text; - /** - * This field hold the saved absolute line number of the cursor when - * processing the "ESC 7" and "ESC 8" command sequences. - */ - private int savedCursorLine = 0; - - /** - * This field hold the saved column number of the cursor when processing the - * "ESC 7" and "ESC 8" command sequences. - */ - private int savedCursorColumn = 0; - - /** - * This field holds an array of StringBuffer objects, each of which is one - * parameter from the current ANSI escape sequence. For example, when - * parsing the escape sequence "\e[20;10H", this array holds the strings - * "20" and "10". - */ - private final StringBuffer[] ansiParameters = new StringBuffer[16]; - - /** - * This field holds the OS-specific command found in an escape sequence of - * the form "\e]...\u0007". - */ - private final StringBuffer ansiOsCommand = new StringBuffer(128); - - /** - * This field holds the index of the next unused element of the array stored - * in field {@link #ansiParameters}. - */ - private int nextAnsiParameter = 0; - - Reader fReader; - - boolean fCrAfterNewLine; - /** - * The constructor. - */ - public VT100Emulator(ITerminalTextData data, ITerminalControlForText terminal, Reader reader) { - super(); - - Logger.log("entered"); //$NON-NLS-1$ - - this.terminal = terminal; - - for (int i = 0; i < ansiParameters.length; ++i) { - ansiParameters[i] = new StringBuffer(); - } - setInputStreamReader(reader); - if(TerminalPlugin.isOptionEnabled(Logger.TRACE_DEBUG_LOG_VT100BACKEND)) - text=new VT100BackendTraceDecorator(new VT100EmulatorBackend(data),System.out); - else - text=new VT100EmulatorBackend(data); - -// text.setDimensions(24, 80); - Style style=Style.getStyle("BLACK", "WHITE"); //$NON-NLS-1$ //$NON-NLS-2$ - text.setDefaultStyle(style); - text.setStyle(style); - } - - /** - * Set the reader that this Terminal gets its input from. - * - * The reader can be changed while the Terminal is running, but a change of - * the reader likely loses some characters which have not yet been fully - * read. Changing the reader can be done in order to change the selected - * Encoding, though. This is typically done when the Terminal is - * constructed, i.e. before it really starts operation; or, when the user - * manually selects a different encoding and thus doesn't care about losing - * old characters. - * - * @param reader the new Reader - */ - public void setInputStreamReader(Reader reader) { - fReader = reader; - } - - public void setDimensions(int lines,int cols) { - text.setDimensions(lines, cols); - ITerminalConnector telnetConnection = getConnector(); - if (telnetConnection != null) { - telnetConnection.setTerminalSize(text.getColumns(), text.getLines()); - } - - } - - /** - * This method performs clean up when this VT100Emulator object is no longer - * needed. After calling this method, no other method on this object should - * be called. - */ - public void dispose() { - } - - /** - * This method is required by interface ControlListener. It allows us to - * know when the StyledText widget is moved. - */ - public void controlMoved(ControlEvent event) { - Logger.log("entered"); //$NON-NLS-1$ - // Empty. - } - - /** - * This method is required by interface ControlListener. It allows us to - * know when the StyledText widget is resized. - */ - public void controlResized(ControlEvent event) { - Logger.log("entered"); //$NON-NLS-1$ - adjustTerminalDimensions(); - } - - /** - * This method erases all text from the Terminal view. - */ - public void clearTerminal() { - Logger.log("entered"); //$NON-NLS-1$ - text.clearAll(); - } - - /** - * This method is called when the user changes the Terminal view's font. We - * attempt to recompute the pixel width of the new font's characters and fix - * the terminal's dimensions. - */ - public void fontChanged() { - Logger.log("entered"); //$NON-NLS-1$ - - if (text != null) - adjustTerminalDimensions(); - } -// /** -// * This method executes in the Display thread to process data received from -// * the remote host by class {@link org.eclipse.tm.internal.terminal.telnet.TelnetConnection} and -// * other implementors of {@link ITerminalConnector}, like the -// * SerialPortHandler. -// *

            -// * These connectors write text to the terminal's buffer through -// * {@link TerminalControl#writeToTerminal(String)} and then have -// * this run method executed in the display thread. This method -// * must not execute at the same time as methods -// * {@link #setNewText(StringBuffer)} and {@link #clearTerminal()}. -// *

            -// * IMPORTANT: This method must be called in strict alternation with method -// * {@link #setNewText(StringBuffer)}. -// *

            -// */ - public void processText() { - try { - // Find the width and height of the terminal, and resize it to display an - // integral number of lines and columns. - - adjustTerminalDimensions(); - - // Restore the caret offset, process and display the new text, then save - // the caret offset. See the documentation for field caretOffset for - // details. - - // ISSUE: Is this causing the scroll-to-bottom-on-output behavior? - - try { - processNewText(); - } catch (IOException e) { - Logger.logException(e); - } - - } catch (Exception ex) { - Logger.logException(ex); - } - } - /** - * This method scans the newly received text, processing ANSI control - * characters and escape sequences and displaying normal text. - * @throws IOException - */ - private void processNewText() throws IOException { - Logger.log("entered"); //$NON-NLS-1$ - - - // Scan the newly received text. - - while (hasNextChar()) { - char character = getNextChar(); - - switch (ansiState) { - case ANSISTATE_INITIAL: - switch (character) { - case '\u0000': - break; // NUL character. Ignore it. - - case '\u0007': - processBEL(); // BEL (Control-G) - break; - - case '\b': - processBackspace(); // Backspace - break; - - case '\t': - processTab(); // Tab. - break; - - case '\n': - processNewline(); // Newline (Control-J) - if(fCrAfterNewLine) - processCarriageReturn(); // Carriage Return (Control-M) - break; - - case '\r': - processCarriageReturn(); // Carriage Return (Control-M) - break; - - case '\u001b': - ansiState = ANSISTATE_ESCAPE; // Escape. - break; - - default: - processNonControlCharacters(character); - break; - } - break; - - case ANSISTATE_ESCAPE: - // We've seen an escape character. Here, we process the character - // immediately following the escape. - - switch (character) { - case '[': - ansiState = ANSISTATE_EXPECTING_PARAMETER_OR_COMMAND; - nextAnsiParameter = 0; - - // Erase the parameter strings in preparation for optional - // parameter characters. - - for (int i = 0; i < ansiParameters.length; ++i) { - ansiParameters[i].delete(0, ansiParameters[i].length()); - } - break; - - case ']': - ansiState = ANSISTATE_EXPECTING_OS_COMMAND; - ansiOsCommand.delete(0, ansiOsCommand.length()); - break; - - case ')': - case '(': - case '*': - case '+': - case '-': - case '.': - case '/': - ansiState = ANSISTATE_EXPECTING_CHARSET_DESIGNATION; - break; - - case '7': - // Save cursor position and character attributes - - ansiState = ANSISTATE_INITIAL; - savedCursorLine = relativeCursorLine(); - savedCursorColumn = getCursorColumn(); - break; - - case '8': - // Restore cursor and attributes to previously saved - // position - - ansiState = ANSISTATE_INITIAL; - moveCursor(savedCursorLine, savedCursorColumn); - break; - - case 'c': - // Reset the terminal - ansiState = ANSISTATE_INITIAL; - resetTerminal(); - break; - - default: - Logger - .log("Unsupported escape sequence: escape '" + character + "'"); //$NON-NLS-1$ //$NON-NLS-2$ - ansiState = ANSISTATE_INITIAL; - break; - } - break; - - case ANSISTATE_EXPECTING_PARAMETER_OR_COMMAND: - if (character == '?') { - ansiState = ANSISTATE_EXPECTING_DEC_PRIVATE_COMMAND; - break; - } - - // Parameters can appear after the '[' in an escape sequence, but they - // are optional. - - if (character == '@' || (character >= 'A' && character <= 'Z') - || (character >= 'a' && character <= 'z')) { - ansiState = ANSISTATE_INITIAL; - processAnsiCommandCharacter(character); - } else { - processAnsiParameterCharacter(character); - } - break; - - case ANSISTATE_EXPECTING_OS_COMMAND: - // A BEL (\u0007) character marks the end of the OSC sequence. - - if (character == '\u0007') { - ansiState = ANSISTATE_INITIAL; - processAnsiOsCommand(); - } else { - ansiOsCommand.append(character); - } - break; - - case ANSISTATE_EXPECTING_DEC_PRIVATE_COMMAND: - // Parameters can appear after the '[?' in an escape sequence, but they - // are optional. - - if (character == '@' || (character >= 'A' && character <= 'Z') - || (character >= 'a' && character <= 'z')) { - ansiState = ANSISTATE_INITIAL; - processDecPrivateCommandCharacter(character); - } else { - processAnsiParameterCharacter(character); - } - break; - - case ANSISTATE_EXPECTING_CHARSET_DESIGNATION: - if (character != '%') - ansiState = ANSISTATE_INITIAL; - // Character set designation commands are ignored - break; - - default: - // This should never happen! If it does happen, it means there is a - // bug in the FSA. For robustness, we return to the initial - // state. - - Logger.log("INVALID ANSI FSA STATE: " + ansiState); //$NON-NLS-1$ - ansiState = ANSISTATE_INITIAL; - break; - } - } - } - private void resetTerminal() { - text.eraseAll(); - text.setCursor(0, 0); - text.setStyle(text.getDefaultStyle()); - text.setScrollRegion(-1, -1); - text.setInsertMode(false); - terminal.enableApplicationCursorKeys(false); - } - /** - * This method is called when we have parsed an OS Command escape sequence. - * The only one we support is "\e]0;...\u0007", which sets the terminal - * title. - */ - private void processAnsiOsCommand() { - if (ansiOsCommand.charAt(0) != '0' || ansiOsCommand.charAt(1) != ';') { - Logger - .log("Ignoring unsupported ANSI OSC sequence: '" + ansiOsCommand + "'"); //$NON-NLS-1$ //$NON-NLS-2$ - return; - } - terminal.setTerminalTitle(ansiOsCommand.substring(2)); - } - - /** - * This method dispatches control to various processing methods based on the - * command character found in the most recently received ANSI escape - * sequence. This method only handles command characters that follow the - * ANSI standard Control Sequence Introducer (CSI), which is "\e[...", where - * "..." is an optional ';'-separated sequence of numeric parameters. - *

            - */ - private void processAnsiCommandCharacter(char ansiCommandCharacter) { - // If the width or height of the terminal is ridiculously small (one line or - // column or less), don't even try to process the escape sequence. This avoids - // throwing an exception (SPR 107450). The display will be messed up, but what - // did you user expect by making the terminal so small? - - switch (ansiCommandCharacter) { - case '@': - // Insert character(s). - processAnsiCommand_atsign(); - break; - - case 'A': - // Move cursor up N lines (default 1). - processAnsiCommand_A(); - break; - - case 'B': - // Move cursor down N lines (default 1). - processAnsiCommand_B(); - break; - - case 'C': - // Move cursor forward N columns (default 1). - processAnsiCommand_C(); - break; - - case 'D': - // Move cursor backward N columns (default 1). - processAnsiCommand_D(); - break; - - case 'd': - // Line Position Absolute [row] (default = [1,column]) (VPA). - processAnsiCommand_d(); - break; - - case 'E': - // Move cursor to first column of Nth next line (default 1). - processAnsiCommand_E(); - break; - - case 'F': - // Move cursor to first column of Nth previous line (default 1). - processAnsiCommand_F(); - break; - - case 'G': - // Move to column N of current line (default 1). - processAnsiCommand_G(); - break; - - case 'H': - // Set cursor Position. - processAnsiCommand_H(); - break; - - case 'h': - // Reset Mode. - processAnsiCommand_h(); - break; - - case 'J': - // Erase part or all of display. Cursor does not move. - processAnsiCommand_J(); - break; - - case 'K': - // Erase in line (cursor does not move). - processAnsiCommand_K(); - break; - - case 'L': - // Insert line(s) (current line moves down). - processAnsiCommand_L(); - break; - - case 'l': - // Set Mode. - processAnsiCommand_l(); - break; - - case 'M': - // Delete line(s). - processAnsiCommand_M(); - break; - - case 'm': - // Set Graphics Rendition (SGR). - processAnsiCommand_m(); - break; - - case 'n': - // Device Status Report (DSR). - processAnsiCommand_n(); - break; - - case 'P': - // Delete character(s). - processAnsiCommand_P(); - break; - - case 'r': - // Set Scrolling Region. - processAnsiCommand_r(); - break; - - case 'S': - // Scroll up. - processAnsiCommand_S(); - break; - - case 'T': - // Scroll down. - processAnsiCommand_T(); - break; - - case 'X': - // Erase character. - // Emacs, vi, and GNU readline don't seem to use this command, so we ignore - // it for now. - break; - - case 'Z': - // Cursor back tab. - // Emacs, vi, and GNU readline don't seem to use this command, so we ignore - // it for now. - break; - - default: - Logger.log("Ignoring unsupported ANSI command character: '" + //$NON-NLS-1$ - ansiCommandCharacter + "'"); //$NON-NLS-1$ - break; - } - } - - /** - * This method dispatches control to various processing methods based on the - * command character found in the most recently received DEC private mode escape - * sequence. This method only handles command characters that follow the - * control sequence CSI ? - */ - private void processDecPrivateCommandCharacter(char commandCharacter) { - switch (commandCharacter) { - case 'h': - // DEC Private Mode Set (DECSET) - processDecPrivateCommand_h(); - break; - - case 'l': - // DEC Private Mode Reset (DECRST) - processDecPrivateCommand_l(); - break; - - default: - Logger.log("Ignoring unsupported DEC private command character: '" + //$NON-NLS-1$ - commandCharacter + "'"); //$NON-NLS-1$ - break; - } - } - - /** - * This method makes room for N characters on the current line at the cursor - * position. Text under the cursor moves right without wrapping at the end - * of the line. - */ - private void processAnsiCommand_atsign() { - int charactersToInsert = getAnsiParameter(0); - text.insertCharacters(charactersToInsert); - } - - /** - * This method moves the cursor up by the number of lines specified by the - * escape sequence parameter (default 1). - */ - private void processAnsiCommand_A() { - moveCursorUp(getAnsiParameter(0)); - } - - /** - * This method moves the cursor down by the number of lines specified by the - * escape sequence parameter (default 1). - */ - private void processAnsiCommand_B() { - moveCursorDown(getAnsiParameter(0)); - } - - /** - * This method moves the cursor forward by the number of columns specified - * by the escape sequence parameter (default 1). - */ - private void processAnsiCommand_C() { - moveCursorForward(getAnsiParameter(0)); - } - - /** - * This method moves the cursor backward by the number of columns specified - * by the escape sequence parameter (default 1). - */ - private void processAnsiCommand_D() { - moveCursorBackward(getAnsiParameter(0)); - } - - /** - * This method moves the cursor to a specific row. - */ - private void processAnsiCommand_d() { - // Line Position Absolute [row] (default = [1,column]) (VPA). - text.setCursorLine(getAnsiParameter(0) - 1); - } - - /** - * This method moves the cursor to the first column of the Nth next line, - * where N is specified by the ANSI parameter (default 1). - */ - private void processAnsiCommand_E() { - int linesToMove = getAnsiParameter(0); - - moveCursor(relativeCursorLine() + linesToMove, 0); - } - - /** - * This method moves the cursor to the first column of the Nth previous - * line, where N is specified by the ANSI parameter (default 1). - */ - private void processAnsiCommand_F() { - int linesToMove = getAnsiParameter(0); - - moveCursor(relativeCursorLine() - linesToMove, 0); - } - - /** - * This method moves the cursor within the current line to the column - * specified by the ANSI parameter (default is column 1). - */ - private void processAnsiCommand_G() { - moveCursor(relativeCursorLine(), getAnsiParameter(0) - 1); - } - - /** - * This method sets the cursor to a position specified by the escape - * sequence parameters (default is the upper left corner of the screen). - */ - private void processAnsiCommand_H() { - moveCursor(getAnsiParameter(0) - 1, getAnsiParameter(1) - 1); - } - - /** - * This method sets terminal modes. - */ - private void processAnsiCommand_h() { - if (getAnsiParameter(0) == 4) { - // set insert mode - text.setInsertMode(true); - } - } - - /** - * This method deletes some (or all) of the text on the screen without - * moving the cursor. - */ - private void processAnsiCommand_J() { - int ansiParameter; - - if (ansiParameters[0].length() == 0) - ansiParameter = 0; - else - ansiParameter = getAnsiParameter(0); - - switch (ansiParameter) { - case 0: - text.eraseToEndOfScreen(); - break; - - case 1: - // Erase from beginning to current position (inclusive). - text.eraseToCursor(); - break; - - case 2: - // Erase entire display. - - text.eraseAll(); - break; - - default: - Logger.log("Unexpected J-command parameter: " + ansiParameter); //$NON-NLS-1$ - break; - } - } - - /** - * This method deletes some (or all) of the text in the current line without - * moving the cursor. - */ - private void processAnsiCommand_K() { - //Bug 401386: missing parameter must be interpreted as 0, and not 1 like most other defaults. - int ansiParameter = 0; - if (ansiParameters[0].length() > 0) - ansiParameter = getAnsiParameter(0); - - switch (ansiParameter) { - case 0: - // Erase from current position to end (inclusive). - text.eraseLineToEnd(); - break; - - case 1: - // Erase from beginning to current position (inclusive). - text.eraseLineToCursor(); - break; - - case 2: - // Erase entire line. - text.eraseLine(); - break; - - default: - Logger.log("Unexpected K-command parameter: " + ansiParameter); //$NON-NLS-1$ - break; - } - } - - /** - * Insert one or more blank lines. The current line of text moves down. Text - * that falls off the bottom of the screen is deleted. - */ - private void processAnsiCommand_L() { - text.insertLines(getAnsiParameter(0)); - } - - /** - * This method resets terminal modes. - */ - private void processAnsiCommand_l() { - if (getAnsiParameter(0) == 4) { - // reset insert mode - text.setInsertMode(false); - } - } - - /** - * Delete one or more lines of text. Any lines below the deleted lines move - * up, which we implement by appending newlines to the end of the text. - */ - private void processAnsiCommand_M() { - text.deleteLines(getAnsiParameter(0)); - } - - /** - * This method sets a new graphics rendition mode, such as - * foreground/background color, bold/normal text, and reverse video. - */ - private void processAnsiCommand_m() { - if (ansiParameters[0].length() == 0) { - // This a special case: when no ANSI parameter is specified, act like a - // single parameter equal to 0 was specified. - - ansiParameters[0].append('0'); - } - Style style=text.getStyle(); - // There are a non-zero number of ANSI parameters. Process each one in - // order. - - int totalParameters = ansiParameters.length; - int parameterIndex = 0; - - while (parameterIndex < totalParameters - && ansiParameters[parameterIndex].length() > 0) { - int ansiParameter = getAnsiParameter(parameterIndex); - - switch (ansiParameter) { - case 0: - // Reset all graphics modes. - style = text.getDefaultStyle(); - break; - - case 1: - style = style.setBold(true); - break; - - case 4: - style = style.setUnderline(true); - break; - - case 5: - style = style.setBlink(true); - break; - - case 7: - style = style.setReverse(true); - break; - - case 10: // Set primary font. Ignored. - break; - - case 21: - case 22: - style = style.setBold(false); - break; - - case 24: - style = style.setUnderline(false); - break; - - case 25: - style = style.setBlink(false); - break; - - case 27: - style = style.setReverse(false); - break; - - case 30: - style = style.setForground("BLACK"); //$NON-NLS-1$ - break; - - case 31: - style = style.setForground("RED"); //$NON-NLS-1$ - break; - - case 32: - style = style.setForground("GREEN"); //$NON-NLS-1$ - break; - - case 33: - style = style.setForground("YELLOW"); //$NON-NLS-1$ - break; - - case 34: - style = style.setForground("BLUE"); //$NON-NLS-1$ - break; - - case 35: - style = style.setForground("MAGENTA"); //$NON-NLS-1$ - break; - - case 36: - style = style.setForground("CYAN"); //$NON-NLS-1$ - break; - - case 37: - style = style.setForground("WHITE_FOREGROUND"); //$NON-NLS-1$ - break; - - case 39: //Foreground: Default - style = style.setForground(text.getDefaultStyle().getForground()); - break; - - case 40: - style = style.setBackground("BLACK"); //$NON-NLS-1$ - break; - - case 41: - style = style.setBackground("RED"); //$NON-NLS-1$ - break; - - case 42: - style = style.setBackground("GREEN"); //$NON-NLS-1$ - break; - - case 43: - style = style.setBackground("YELLOW"); //$NON-NLS-1$ - break; - - case 44: - style = style.setBackground("BLUE"); //$NON-NLS-1$ - break; - - case 45: - style = style.setBackground("MAGENTA"); //$NON-NLS-1$ - break; - - case 46: - style = style.setBackground("CYAN"); //$NON-NLS-1$ - break; - - case 47: - style = style.setBackground("WHITE"); //$NON-NLS-1$ - break; - - case 49: //Background: Default - style = style.setBackground(text.getDefaultStyle().getBackground()); - break; - - default: - Logger - .log("Unsupported graphics rendition parameter: " + ansiParameter); //$NON-NLS-1$ - break; - } - - ++parameterIndex; - } - text.setStyle(style); - } - - /** - * This method responds to an ANSI Device Status Report (DSR) command from - * the remote endpoint requesting the ready status or the cursor position. - * Requests for other kinds of status are ignored. - */ - private void processAnsiCommand_n() { - String reply; - - if (getAnsiParameter(0) == 5) { - // Report that the terminal is ready and has no malfunctions. - reply = "\u001b[0n"; //$NON-NLS-1$ - - } else if (getAnsiParameter(0) == 6) { - // Send the ANSI cursor position (which is 1-based) to the remote - // endpoint. - reply = "\u001b[" + (relativeCursorLine() + 1) + ";" + //$NON-NLS-1$ //$NON-NLS-2$ - (getCursorColumn() + 1) + "R"; //$NON-NLS-1$ - - } else { - // Do nothing if the numeric parameter was not 5 or 6. - return; - } - - try { - terminal.getOutputStream().write(reply.getBytes("ISO-8859-1")); //$NON-NLS-1$ - terminal.getOutputStream().flush(); - } catch (IOException ex) { - Logger.log("Caught IOException!"); //$NON-NLS-1$ - } - } - - /** - * Deletes one or more characters starting at the current cursor position. - * Characters on the same line and to the right of the deleted characters - * move left. If there are no characters on the current line at or to the - * right of the cursor column, no text is deleted. - */ - private void processAnsiCommand_P() { - text.deleteCharacters(getAnsiParameter(0)); - } - - /** - * Set Scrolling Region [top;bottom] (default = full size of window) (DECSTBM). - */ - private void processAnsiCommand_r() { - int top = 0; - int bottom = 0; - if (ansiParameters[0].length() > 0 && ansiParameters[1].length() > 0) { - top = getAnsiParameter(0); - bottom = getAnsiParameter(1); - } - text.setScrollRegion(top-1, bottom-1); - } - - /** - * Scroll up n lines (default = 1 line). - */ - private void processAnsiCommand_S() { - text.scrollUp(getAnsiParameter(0)); - } - - /** - * Scroll down n lines (default = 1 line). - */ - private void processAnsiCommand_T() { - text.scrollDown(getAnsiParameter(0)); - } - - private void processDecPrivateCommand_h() { - int param = getAnsiParameter(0); - switch (param) { - case 1: - // Enable Application Cursor Keys (DECCKM) - terminal.enableApplicationCursorKeys(true); - break; - case 47: - case 1047: - case 1048: - case 1049: - // Use Alternate Screen Buffer (ignored). - break; - default: - Logger.log("Unsupported command parameter: CSI ?" + param + 'h'); //$NON-NLS-1$ - break; - } - } - - private void processDecPrivateCommand_l() { - int param = getAnsiParameter(0); - switch (param) { - case 1: - // Enable Normal Cursor Keys (DECCKM) - terminal.enableApplicationCursorKeys(false); - break; - case 47: - case 1047: - case 1048: - case 1049: - // Use Normal Screen Buffer (ignored, but reset scroll region). - text.setScrollRegion(-1, -1); - break; - default: - Logger.log("Unsupported command parameter: CSI ?" + param + 'l'); //$NON-NLS-1$ - break; - } - } - - /** - * This method returns one of the numeric ANSI parameters received in the - * most recent escape sequence. - * - * @return The parameterIndexth numeric ANSI parameter or -1 if the - * index is out of range. - */ - private int getAnsiParameter(int parameterIndex) { - if (parameterIndex < 0 || parameterIndex >= ansiParameters.length) { - // This should never happen. - return -1; - } - - String parameter = ansiParameters[parameterIndex].toString(); - - if (parameter.length() == 0) - return 1; - - int parameterValue = 1; - - // Don't trust the remote endpoint to send well formed numeric - // parameters. - - try { - parameterValue = Integer.parseInt(parameter); - } catch (NumberFormatException ex) { - parameterValue = 1; - } - - return parameterValue; - } - - /** - * This method processes a single parameter character in an ANSI escape - * sequence. Parameters are the (optional) characters between the leading - * "\e[" and the command character in an escape sequence (e.g., in the - * escape sequence "\e[20;10H", the parameter characters are "20;10"). - * Parameters are integers separated by one or more ';'s. - */ - private void processAnsiParameterCharacter(char ch) { - if (ch == ';') { - ++nextAnsiParameter; - } else { - if (nextAnsiParameter < ansiParameters.length) - ansiParameters[nextAnsiParameter].append(ch); - } - } - /** - * This method processes a contiguous sequence of non-control characters. - * This is a performance optimization, so that we don't have to insert or - * append each non-control character individually to the StyledText widget. - * A non-control character is any character that passes the condition in the - * below while loop. - * @throws IOException - */ - private void processNonControlCharacters(char character) throws IOException { - StringBuffer buffer=new StringBuffer(); - buffer.append(character); - // Identify a contiguous sequence of non-control characters, starting at - // firstNonControlCharacterIndex in newText. - while(hasNextChar()) { - character=getNextChar(); - if(character == '\u0000' || character == '\b' || character == '\t' - || character == '\u0007' || character == '\n' - || character == '\r' || character == '\u001b') { - pushBackChar(character); - break; - } - buffer.append(character); - } - - // Now insert the sequence of non-control characters in the StyledText widget - // at the location of the cursor. - - displayNewText(buffer.toString()); - } - - /** - * This method displays a subset of the newly-received text in the Terminal - * view, wrapping text at the right edge of the screen and overwriting text - * when the cursor is not at the very end of the screen's text. - *

            - * - * There are never any ANSI control characters or escape sequences in the - * text being displayed by this method (this includes newlines, carriage - * returns, and tabs). - *

            - */ - private void displayNewText(String buffer) { - text.appendString(buffer); - } - - - /** - * Process a BEL (Control-G) character. - */ - private void processBEL() { - // TODO - //Display.getDefault().beep(); - } - - /** - * Process a backspace (Control-H) character. - */ - private void processBackspace() { - moveCursorBackward(1); - } - - /** - * Process a tab (Control-I) character. We don't insert a tab character into - * the StyledText widget. Instead, we move the cursor forward to the next - * tab stop, without altering any of the text. Tab stops are every 8 - * columns. The cursor will never move past the rightmost column. - */ - private void processTab() { - moveCursorForward(8 - (getCursorColumn() % 8)); - } - - /** - * Process a newline (Control-J) character. A newline (NL) character just - * moves the cursor to the same column on the next line, creating new lines - * when the cursor reaches the bottom edge of the terminal. This is - * counter-intuitive, especially to UNIX programmers who are taught that - * writing a single NL to a terminal is sufficient to move the cursor to the - * first column of the next line, as if a carriage return (CR) and a NL were - * written. - *

            - * - * UNIX terminals typically display a NL character as a CR followed by a NL - * because the terminal device typically has the ONLCR attribute bit set - * (see the termios(4) man page for details), which causes the terminal - * device driver to translate NL to CR + NL on output. The terminal itself - * (i.e., a hardware terminal or a terminal emulator, like xterm or this - * code) _always_ interprets a CR to mean "move the cursor to the beginning - * of the current line" and a NL to mean "move the cursor to the same column - * on the next line". - *

            - */ - private void processNewline() { - text.processNewline(); - } - - /** - * Process a Carriage Return (Control-M). - */ - private void processCarriageReturn() { - text.setCursorColumn(0); - } - - /** - * This method computes the width of the terminal in columns and its height - * in lines, then adjusts the width and height of the view's StyledText - * widget so that it displays an integral number of lines and columns of - * text. The adjustment is always to shrink the widget vertically or - * horizontally, because if the control were to grow, it would be clipped by - * the edges of the view window (i.e., the view window does not become - * larger to accommodate its contents becoming larger). - *

            - * - * This method must be called immediately before each time text is written - * to the terminal so that we can properly line wrap text. Because it is - * called so frequently, it must be fast when there is no resizing to be - * done. - *

            - */ - private void adjustTerminalDimensions() { - // Compute how many pixels we need to shrink the StyledText control vertically - // to make it display an integral number of lines of text. - - // TODO -// if(text.getColumns()!=80 && text.getLines()!=80) -// text.setDimensions(24, 80); - // If we are in a TELNET connection and we know the dimensions of the terminal, - // we give the size information to the TELNET connection object so it can - // communicate it to the TELNET server. If we are in a serial connection, - // there is nothing we can do to tell the remote host about the size of the - // terminal. - ITerminalConnector telnetConnection = getConnector(); - // TODO MSA: send only if dimensions have really changed! - if (telnetConnection != null) { - telnetConnection.setTerminalSize(text.getColumns(), text.getLines()); - } - - } - - private ITerminalConnector getConnector() { - if(terminal.getTerminalConnector()!=null) - return terminal.getTerminalConnector(); - return null; - } - - /** - * This method returns the relative line number of the line containing the - * cursor. The returned line number is relative to the topmost visible line, - * which has relative line number 0. - * - * @return The relative line number of the line containing the cursor. - */ - private int relativeCursorLine() { - return text.getCursorLine(); - } - - /** - * This method moves the cursor to the specified line and column. Parameter - * targetLine is the line number of a screen line, so it has a - * minimum value of 0 (the topmost screen line) and a maximum value of - * heightInLines - 1 (the bottommost screen line). A line does not have to - * contain any text to move the cursor to any column in that line. - */ - private void moveCursor(int targetLine, int targetColumn) { - text.setCursor(targetLine,targetColumn); - } - - /** - * This method moves the cursor down lines lines, but won't move the - * cursor past the bottom of the screen. This method does not cause any - * scrolling. - */ - private void moveCursorDown(int lines) { - moveCursor(relativeCursorLine() + lines, getCursorColumn()); - } - - /** - * This method moves the cursor up lines lines, but won't move the - * cursor past the top of the screen. This method does not cause any - * scrolling. - */ - private void moveCursorUp(int lines) { - moveCursor(relativeCursorLine() - lines, getCursorColumn()); - } - - /** - * This method moves the cursor forward columns columns, but won't - * move the cursor past the right edge of the screen, nor will it move the - * cursor onto the next line. This method does not cause any scrolling. - */ - private void moveCursorForward(int columnsToMove) { - moveCursor(relativeCursorLine(), getCursorColumn() + columnsToMove); - } - - /** - * This method moves the cursor backward columnsToMove columns, but - * won't move the cursor past the left edge of the screen, nor will it move - * the cursor onto the previous line. This method does not cause any - * scrolling. - */ - private void moveCursorBackward(int columnsToMove) { - moveCursor(relativeCursorLine(), getCursorColumn() - columnsToMove); - } - /** - * Resets the state of the terminal text (foreground color, background color, - * font style and other internal state). It essentially makes it ready for new input. - */ - public void resetState() { - ansiState=ANSISTATE_INITIAL; - text.setStyle(text.getDefaultStyle()); - text.setScrollRegion(-1, -1); - text.setInsertMode(false); - } - -// public OutputStream getOutputStream() { -// return fTerminalInputStream.getOutputStream(); -// } - - /** - * Buffer for {@link #pushBackChar(char)}. - */ - private int fNextChar=-1; - - private char getNextChar() throws IOException { - int c=-1; - if(fNextChar!=-1) { - c= fNextChar; - fNextChar=-1; - } else { - c = fReader.read(); - } - // TODO: better end of file handling - if(c==-1) - c=0; - return (char)c; - } - - private boolean hasNextChar() throws IOException { - if(fNextChar>=0) - return true; - return fReader.ready(); - } - - /** - * Put back one character to the stream. This method can push - * back exactly one character. The character is the next character - * returned by {@link #getNextChar} - * @param c the character to be pushed back. - */ - void pushBackChar(char c) { - //assert fNextChar!=-1: "Already a character waiting:"+fNextChar; //$NON-NLS-1$ - fNextChar=c; - } - private int getCursorColumn() { - return text.getCursorColumn(); - } - public boolean isCrAfterNewLine() { - return fCrAfterNewLine; - } - public void setCrAfterNewLine(boolean crAfterNewLine) { - fCrAfterNewLine = crAfterNewLine; - } - void setVT100LineWrapping(boolean enable) { - text.setVT100LineWrapping(enable); - } - boolean isVT100LineWrapping() { - return text.isVT100LineWrapping(); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100EmulatorBackend.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100EmulatorBackend.java deleted file mode 100644 index 36140d6..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100EmulatorBackend.java +++ /dev/null @@ -1,494 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Anton Leherbauer (Wind River) - [206329] Changing terminal size right after connect does not scroll properly - * Anton Leherbauer (Wind River) - [433751] Add option to enable VT100 line wrapping mode - * Anton Leherbauer (Wind River) - [458218] Add support for ANSI insert mode - * Anton Leherbauer (Wind River) - [458402] Add support for scroll up/down and scroll region - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.emulator; - -import org.eclipse.tm.terminal.model.ITerminalTextData; -import org.eclipse.tm.terminal.model.Style; - -/** - * - */ -public class VT100EmulatorBackend implements IVT100EmulatorBackend { - - private static class ScrollRegion { - static final ScrollRegion FULL_WINDOW = new ScrollRegion(0, Integer.MAX_VALUE-1); - private final int fTop; - private final int fBottom; - ScrollRegion(int top, int bottom) { - fTop = top; - fBottom = bottom; - } - boolean contains(int line) { - return line >= fTop && line <= fBottom; - } - int getTopLine() { - return fTop; - } - int getBottomLine() { - return fBottom; - } - int getHeight() { - return fBottom - fTop + 1; - } - } - - /** - * This field holds the number of the column in which the cursor is - * logically positioned. The leftmost column on the screen is column 0, and - * column numbers increase to the right. The maximum value of this field is - * {@link #widthInColumns} - 1. We track the cursor column using this field - * to avoid having to recompute it repeatly using StyledText method calls. - *

            - * - * The StyledText widget that displays text has a vertical bar (called the - * "caret") that appears _between_ character cells, but ANSI terminals have - * the concept of a cursor that appears _in_ a character cell, so we need a - * convention for which character cell the cursor logically occupies when - * the caret is physically between two cells. The convention used in this - * class is that the cursor is logically in column N when the caret is - * physically positioned immediately to the _left_ of column N. - *

            - * - * When fCursorColumn is N, the next character output to the terminal appears - * in column N. When a character is output to the rightmost column on a - * given line (column widthInColumns - 1), the cursor moves to column 0 on - * the next line after the character is drawn (this is the default line wrapping - * mode). If VT100 line wrapping mode is enabled, the cursor does not move - * to the next line until the next character is printed (this is known as - * the VT100 'eat_newline_glitch'). - * If the cursor is in the bottommost line when line wrapping - * occurs, the topmost visible line is scrolled off the top edge of the - * screen. - *

            - */ - private int fCursorColumn; - private int fCursorLine; - /* true if last output occurred on rightmost column - * and next output requires line wrap */ - private boolean fWrapPending; - private boolean fInsertMode; - private Style fDefaultStyle; - private Style fStyle; - int fLines; - int fColumns; - final private ITerminalTextData fTerminal; - private boolean fVT100LineWrapping; - private ScrollRegion fScrollRegion = ScrollRegion.FULL_WINDOW; - - public VT100EmulatorBackend(ITerminalTextData terminal) { - fTerminal=terminal; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#clearAll() - */ - public void clearAll() { - synchronized (fTerminal) { - // clear the history - int n=fTerminal.getHeight(); - for (int line = 0; line < n; line++) { - fTerminal.cleanLine(line); - } - fTerminal.setDimensions(fLines, fTerminal.getWidth()); - setStyle(getDefaultStyle()); - setCursor(0, 0); - } - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#setDimensions(int, int) - */ - public void setDimensions(int lines, int cols) { - synchronized (fTerminal) { - if(lines==fLines && cols==fColumns) - return; // nothing to do - // relative cursor line - int cl=getCursorLine(); - int cc=getCursorColumn(); - int height=fTerminal.getHeight(); - // absolute cursor line - int acl=cl+height-fLines; - int newLines=Math.max(lines,height); - if(lines=fCursorColumn+n; col--) { - char c=fTerminal.getChar(line, col-n); - Style style=fTerminal.getStyle(line, col-n); - fTerminal.setChar(line, col,c, style); - } - int last=Math.min(fCursorColumn+n, fColumns); - for (int col = fCursorColumn; col 0; - int line=toAbsoluteLine(fCursorLine); - int nLines=Math.min(fTerminal.getHeight()-line, fScrollRegion.getBottomLine()-fCursorLine+1); - fTerminal.scroll(line, nLines, n); - } - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#deleteCharacters(int) - */ - public void deleteCharacters(int n) { - synchronized (fTerminal) { - int line=toAbsoluteLine(fCursorLine); - for (int col = fCursorColumn+n; col < fColumns; col++) { - char c=fTerminal.getChar(line, col); - Style style=fTerminal.getStyle(line, col); - fTerminal.setChar(line, col-n,c, style); - } - int first=Math.max(fCursorColumn, fColumns-n); - for (int col = first; col 0; - int line=toAbsoluteLine(fCursorLine); - int nLines=Math.min(fTerminal.getHeight()-line, fScrollRegion.getBottomLine()-fCursorLine+1); - fTerminal.scroll(line, nLines, -n); - } - } - private boolean isCusorInScrollingRegion() { - return fScrollRegion.contains(fCursorLine); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#getDefaultStyle() - */ - public Style getDefaultStyle() { - synchronized (fTerminal) { - return fDefaultStyle; - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#setDefaultStyle(org.eclipse.tm.terminal.model.Style) - */ - public void setDefaultStyle(Style defaultStyle) { - synchronized (fTerminal) { - fDefaultStyle = defaultStyle; - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#getStyle() - */ - public Style getStyle() { - synchronized (fTerminal) { - if(fStyle==null) - return fDefaultStyle; - return fStyle; - } - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#setStyle(org.eclipse.tm.terminal.model.Style) - */ - public void setStyle(Style style) { - synchronized (fTerminal) { - fStyle=style; - } - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#appendString(java.lang.String) - */ - public void appendString(String buffer) { - synchronized (fTerminal) { - char[] chars=buffer.toCharArray(); - if (fInsertMode) - insertCharacters(chars.length); - int line=toAbsoluteLine(fCursorLine); - int i=0; - while (i < chars.length) { - if(fWrapPending) { - line = doLineWrap(); - } - int n=Math.min(fColumns-fCursorColumn,chars.length-i); - fTerminal.setChars(line, fCursorColumn, chars, i, n, fStyle); - int col=fCursorColumn+n; - i+=n; - // wrap needed? - if(col == fColumns) { - if (fVT100LineWrapping) { - // deferred line wrapping (eat_newline_glitch) - setCursorColumn(col - 1); - fWrapPending = true; - } else { - line = doLineWrap(); - } - } else { - setCursorColumn(col); - } - } - } - } - - private int doLineWrap() { - int line; - line=toAbsoluteLine(fCursorLine); - fTerminal.setWrappedLine(line); - doNewline(); - line=toAbsoluteLine(fCursorLine); - setCursorColumn(0); - return line; - } - - /** - * MUST be called from a synchronized block! - */ - private void doNewline() { - if (fCursorLine == fScrollRegion.getBottomLine()) - scrollUp(1); - else if (fCursorLine+1>=fLines) { - int h=fTerminal.getHeight(); - fTerminal.addLine(); - if(h!=fTerminal.getHeight()) - setCursorLine(fCursorLine+1); - } else { - setCursorLine(fCursorLine+1); - } - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#processNewline() - */ - public void processNewline() { - synchronized (fTerminal) { - doNewline(); - } - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#getCursorLine() - */ - public int getCursorLine() { - synchronized (fTerminal) { - return fCursorLine; - } - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#getCursorColumn() - */ - public int getCursorColumn() { - synchronized (fTerminal) { - return fCursorColumn; - } - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#setCursor(int, int) - */ - public void setCursor(int targetLine, int targetColumn) { - synchronized (fTerminal) { - setCursorLine(targetLine); - setCursorColumn(targetColumn); - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#setCursorColumn(int) - */ - public void setCursorColumn(int targetColumn) { - synchronized (fTerminal) { - if(targetColumn<0) - targetColumn=0; - else if(targetColumn>=fColumns) - targetColumn=fColumns-1; - fCursorColumn=targetColumn; - fWrapPending = false; - // We make the assumption that nobody is changing the - // terminal cursor except this class! - // This assumption gives a huge performance improvement - fTerminal.setCursorColumn(targetColumn); - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#setCursorLine(int) - */ - public void setCursorLine(int targetLine) { - synchronized (fTerminal) { - if(targetLine<0) - targetLine=0; - else if(targetLine>=fLines) - targetLine=fLines-1; - fCursorLine=targetLine; - // We make the assumption that nobody is changing the - // terminal cursor except this class! - // This assumption gives a huge performance improvement - fTerminal.setCursorLine(toAbsoluteLine(targetLine)); - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#getLines() - */ - public int getLines() { - synchronized (fTerminal) { - return fLines; - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.emulator.IVT100EmulatorBackend#getColumns() - */ - public int getColumns() { - synchronized (fTerminal) { - return fColumns; - } - } - - public void setVT100LineWrapping(boolean enable) { - fVT100LineWrapping = enable; - } - - public boolean isVT100LineWrapping() { - return fVT100LineWrapping; - } - - public void setInsertMode(boolean enable) { - fInsertMode = enable; - } - - public void setScrollRegion(int top, int bottom) { - if (top < 0 || bottom < 0) - fScrollRegion = ScrollRegion.FULL_WINDOW; - else if (top < bottom) - fScrollRegion = new ScrollRegion(top, bottom); - } - - public void scrollUp(int n) { - assert n>0; - synchronized (fTerminal) { - int line = toAbsoluteLine(fScrollRegion.getTopLine()); - int nLines = Math.min(fTerminal.getHeight()-line, fScrollRegion.getHeight()); - fTerminal.scroll(line, nLines, -n); - } - } - - public void scrollDown(int n) { - assert n>0; - synchronized (fTerminal) { - int line = toAbsoluteLine(fScrollRegion.getTopLine()); - int nLines = Math.min(fTerminal.getHeight()-line, fScrollRegion.getHeight()); - fTerminal.scroll(line, nLines, n); - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java deleted file mode 100644 index b5d62b5..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100TerminalControl.java +++ /dev/null @@ -1,1414 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - split into core, view and connector plugins - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Martin Oberhuber (Wind River) - [206892] State handling: Only allow connect when CLOSED - * Martin Oberhuber (Wind River) - [206883] Serial Terminal leaks Jobs - * Martin Oberhuber (Wind River) - [208145] Terminal prints garbage after quick disconnect/reconnect - * Martin Oberhuber (Wind River) - [207785] NPE when trying to send char while no longer connected - * Michael Scharf (Wind River) - [209665] Add ability to log byte streams from terminal - * Ruslan Sychev (Xored Software) - [217675] NPE or SWTException when closing Terminal View while connection establishing - * Michael Scharf (Wing River) - [196447] The optional terminal input line should be resizeable - * Martin Oberhuber (Wind River) - [168197] Replace JFace MessagDialog by SWT MessageBox - * Martin Oberhuber (Wind River) - [204796] Terminal should allow setting the encoding to use - * Michael Scharf (Wind River) - [237398] Terminal get Invalid Thread Access when the title is set - * Martin Oberhuber (Wind River) - [240745] Pressing Ctrl+F1 in the Terminal should bring up context help - * Michael Scharf (Wind River) - [240098] The cursor should not blink when the terminal is disconnected - * Anton Leherbauer (Wind River) - [335021] Middle mouse button copy/paste does not work with the terminal - * Max Stepanov (Appcelerator) - [339768] Fix ANSI code for PgUp / PgDn - * Pawel Piech (Wind River) - [333613] "Job found still running" after shutdown - * Martin Oberhuber (Wind River) - [348700] Terminal unusable after disconnect - * Simon Bernard (Sierra Wireless) - [351424] [terminal] Terminal does not support del and insert key - * Martin Oberhuber (Wind River) - [265352][api] Allow setting fonts programmatically - * Martin Oberhuber (Wind River) - [378691][api] push Preferences into the Widget - * Anton Leherbauer (Wind River) - [433751] Add option to enable VT100 line wrapping mode - * Anton Leherbauer (Wind River) - [434294] Incorrect handling of function keys with modifiers - * Martin Oberhuber (Wind River) - [434294] Add Mac bindings with COMMAND - * Anton Leherbauer (Wind River) - [434749] UnhandledEventLoopException when copying to clipboard while the selection is empty - * Martin Oberhuber (Wind River) - [436612] Restore Eclipse 3.4 compatibility by using Reflection - * Anton Leherbauer (Wind River) - [458398] Add support for normal/application cursor keys mode - * Anton Leherbauer (Wind River) - [420928] Terminal widget leaks memory - * Davy Landman (CWI) - [475267][api] Allow custom mouse listeners - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.emulator; - -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.Field; -import java.net.SocketException; -import java.nio.charset.Charset; - -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.commands.ParameterizedCommand; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.jface.bindings.Binding; -import org.eclipse.jface.bindings.keys.KeySequence; -import org.eclipse.jface.bindings.keys.KeyStroke; -import org.eclipse.jface.bindings.keys.SWTKeySupport; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.dnd.Clipboard; -import org.eclipse.swt.dnd.DND; -import org.eclipse.swt.dnd.TextTransfer; -import org.eclipse.swt.dnd.Transfer; -import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.events.FocusListener; -import org.eclipse.swt.events.KeyAdapter; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.KeyListener; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.tm.internal.terminal.control.ICommandInputField; -import org.eclipse.tm.internal.terminal.control.ITerminalListener; -import org.eclipse.tm.internal.terminal.control.ITerminalListener2; -import org.eclipse.tm.internal.terminal.control.ITerminalMouseListener; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.control.impl.ITerminalControlForText; -import org.eclipse.tm.internal.terminal.control.impl.TerminalMessages; -import org.eclipse.tm.internal.terminal.control.impl.TerminalPlugin; -import org.eclipse.tm.internal.terminal.preferences.ITerminalConstants; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; -import org.eclipse.tm.internal.terminal.provisional.api.Logger; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.internal.terminal.textcanvas.PipedInputStream; -import org.eclipse.tm.internal.terminal.textcanvas.PollingTextCanvasModel; -import org.eclipse.tm.internal.terminal.textcanvas.TextCanvas; -import org.eclipse.tm.internal.terminal.textcanvas.TextLineRenderer; -import org.eclipse.tm.terminal.model.ITerminalTextData; -import org.eclipse.tm.terminal.model.ITerminalTextDataSnapshot; -import org.eclipse.tm.terminal.model.TerminalTextDataFactory; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.contexts.IContextActivation; -import org.eclipse.ui.contexts.IContextService; -import org.eclipse.ui.handlers.IHandlerService; -import org.eclipse.ui.keys.IBindingService; - -/** - * - * This class was originally written to use nested classes, which unfortunately makes - * this source file larger and more complex than it needs to be. In particular, the - * methods in the nested classes directly access the fields of the enclosing class. - * One day we should pull the nested classes out into their own source files (but still - * in this package). - * - * @author Chris Thew - */ -public class VT100TerminalControl implements ITerminalControlForText, ITerminalControl, ITerminalViewControl -{ - protected final static String[] LINE_DELIMITERS = { "\n" }; //$NON-NLS-1$ - - /** - * This field holds a reference to a TerminalText object that performs all ANSI - * text processing on data received from the remote host and controls how text is - * displayed using the view's StyledText widget. - */ - private final VT100Emulator fTerminalText; - private Display fDisplay; - private TextCanvas fCtlText; - private Composite fWndParent; - private Clipboard fClipboard; - private KeyListener fKeyHandler; - private final ITerminalListener fTerminalListener; - private String fMsg = ""; //$NON-NLS-1$ - private TerminalFocusListener fFocusListener; - private ITerminalConnector fConnector; - private final ITerminalConnector[] fConnectors; - private final boolean fUseCommonPrefs; - private boolean connectOnEnterIfClosed = true; - - PipedInputStream fInputStream; - private static final String defaultEncoding = Charset.defaultCharset().name(); - private String fEncoding = defaultEncoding; - private InputStreamReader fInputStreamReader; - - private ICommandInputField fCommandInputField; - - private volatile TerminalState fState; - - private final ITerminalTextData fTerminalModel; - - private final EditActionAccelerators editActionAccelerators = new EditActionAccelerators(); - - private boolean fApplicationCursorKeys; - - /** - * Listens to changes in the preferences - */ - private final IPropertyChangeListener fPreferenceListener=new IPropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent event) { - if(event.getProperty().equals(ITerminalConstants.PREF_BUFFERLINES) - || event.getProperty().equals(ITerminalConstants.PREF_INVERT_COLORS)) { - updatePreferences(); - } - } - }; - private final IPropertyChangeListener fFontListener = new IPropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent event) { - if (event.getProperty().equals(ITerminalConstants.FONT_DEFINITION)) { - onTerminalFontChanged(); - } - } - }; - - /** - * Is protected by synchronize on this - */ - volatile private Job fJob; - - private PollingTextCanvasModel fPollingTextCanvasModel; - - public VT100TerminalControl(ITerminalListener target, Composite wndParent, ITerminalConnector[] connectors) { - this(target, wndParent, connectors, false); - } - - /** - * Instantiate a Terminal widget. - * @param target Callback for notifying the owner of Terminal state changes. - * @param wndParent The Window parent to embed the Terminal in. - * @param connectors Provided connectors. - * @param useCommonPrefs If true, the Terminal widget will pick up settings - * from the org.eclipse.tm.terminal.TerminalPreferencePage Preference page. - * Otherwise, clients need to maintain settings themselves. - * @since 3.2 - */ - public VT100TerminalControl(ITerminalListener target, Composite wndParent, ITerminalConnector[] connectors, boolean useCommonPrefs) { - fConnectors=connectors; - fUseCommonPrefs = useCommonPrefs; - fTerminalListener=target; - fTerminalModel=TerminalTextDataFactory.makeTerminalTextData(); - fTerminalModel.setMaxHeight(1000); - fInputStream=new PipedInputStream(8*1024); - fTerminalText = new VT100Emulator(fTerminalModel, this, null); - try { - // Use Default Encoding as start, until setEncoding() is called - setEncoding(null); - } catch (UnsupportedEncodingException e) { - // Should never happen - e.printStackTrace(); - // Fall back to local Platform Default Encoding - fEncoding = defaultEncoding; - fInputStreamReader = new InputStreamReader(fInputStream); - fTerminalText.setInputStreamReader(fInputStreamReader); - } - - setupTerminal(wndParent); - } - - @Override - public void setEncoding(String encoding) throws UnsupportedEncodingException { - if (encoding == null) { - // TODO better use a standard remote-to-local encoding? - encoding = "ISO-8859-1"; //$NON-NLS-1$ - // TODO or better use the local default encoding? - // encoding = defaultEncoding; - } - fInputStreamReader = new InputStreamReader(fInputStream, encoding); - // remember encoding if above didn't throw an exception - fEncoding = encoding; - fTerminalText.setInputStreamReader(fInputStreamReader); - } - - @Override - public String getEncoding() { - return fEncoding; - } - - @Override - public ITerminalConnector[] getConnectors() { - return fConnectors; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#copy() - */ - @Override - public void copy() { - copy(DND.CLIPBOARD); - } - - private void copy(int clipboardType) { - String selection = getSelection(); - if (selection.length() > 0) { - Object[] data = new Object[] { selection }; - Transfer[] types = new Transfer[] { TextTransfer.getInstance() }; - fClipboard.setContents(data, types, clipboardType); - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#paste() - */ - @Override - public void paste() { - paste(DND.CLIPBOARD); -// TODO paste in another thread.... to avoid blocking -// new Thread() { -// public void run() { -// for (int i = 0; i < strText.length(); i++) { -// sendChar(strText.charAt(i), false); -// } -// -// } -// }.start(); - } - - private void paste(int clipboardType) { - TextTransfer textTransfer = TextTransfer.getInstance(); - String strText = (String) fClipboard.getContents(textTransfer, clipboardType); - pasteString(strText); - } - - /** - * @param strText the text to paste - */ - @Override - public boolean pasteString(String strText) { - if(!isConnected()) - return false; - if (strText == null) - return false; - if (!fEncoding.equals(defaultEncoding)) { - sendString(strText); - } else { - // TODO I do not understand why pasteString would do this here... - for (int i = 0; i < strText.length(); i++) { - sendChar(strText.charAt(i), false); - } - } - return true; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#selectAll() - */ - @Override - public void selectAll() { - getCtlText().selectAll(); - if (fTerminalListener instanceof ITerminalListener2) { - ((ITerminalListener2)fTerminalListener).setTerminalSelectionChanged(); - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#sendKey(char) - */ - @Override - public void sendKey(char character) { - Event event; - KeyEvent keyEvent; - - event = new Event(); - event.widget = getCtlText(); - event.character = character; - event.keyCode = 0; - event.stateMask = 0; - event.doit = true; - keyEvent = new KeyEvent(event); - - fKeyHandler.keyPressed(keyEvent); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#clearTerminal() - */ - @Override - public void clearTerminal() { - // The TerminalText object does all text manipulation. - getTerminalText().clearTerminal(); - getCtlText().clearSelection(); - if (fTerminalListener instanceof ITerminalListener2) { - ((ITerminalListener2)fTerminalListener).setTerminalSelectionChanged(); - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#getClipboard() - */ - @Override - public Clipboard getClipboard() { - return fClipboard; - } - - /** - * @return non null selection - */ - @Override - public String getSelection() { - String txt= fCtlText.getSelectionText(); - if(txt==null) - txt=""; //$NON-NLS-1$ - return txt; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#setFocus() - */ - @Override - public void setFocus() { - getCtlText().setFocus(); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#isEmpty() - */ - @Override - public boolean isEmpty() { - return getCtlText().isEmpty(); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#isDisposed() - */ - @Override - public boolean isDisposed() { - return getCtlText().isDisposed(); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#isConnected() - */ - @Override - public boolean isConnected() { - return fState==TerminalState.CONNECTED; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#disposeTerminal() - */ - @Override - public void disposeTerminal() { - Logger.log("entered."); //$NON-NLS-1$ - if(fUseCommonPrefs) { - TerminalPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(fPreferenceListener); - JFaceResources.getFontRegistry().removeListener(fFontListener); - } - disconnectTerminal(); - fClipboard.dispose(); - getTerminalText().dispose(); - } - - @Override - public void connectTerminal() { - Logger.log("entered."); //$NON-NLS-1$ - if(getTerminalConnector()==null) - return; - fTerminalText.resetState(); - fApplicationCursorKeys = false; - if(fConnector.getInitializationErrorMessage()!=null) { - showErrorMessage(NLS.bind( - TerminalMessages.CannotConnectTo, - fConnector.getName(), - fConnector.getInitializationErrorMessage())); - // we cannot connect because the connector was not initialized - return; - } - // clean the error message - setMsg(""); //$NON-NLS-1$ - getTerminalConnector().connect(this); - waitForConnect(); - } - - @Override - public ITerminalConnector getTerminalConnector() { - return fConnector; - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#disconnectTerminal() - */ - @Override - public void disconnectTerminal() { - Logger.log("entered."); //$NON-NLS-1$ - - //Disconnect the remote side first - if (getState()!=TerminalState.CLOSED) { - if(getTerminalConnector()!=null) { - getTerminalConnector().disconnect(); - } - } - - //Ensure that a new Job can be started; then clean up old Job. - Job job; - synchronized(this) { - job = fJob; - fJob = null; - } - if (job!=null) { - job.cancel(); - // Join job to avoid leaving job running after workbench shutdown (333613). - // Interrupt to be fast enough; cannot close fInputStream since it is re-used (bug 348700). - Thread t = job.getThread(); - if(t!=null) t.interrupt(); - try { - job.join(); - } catch (InterruptedException e) {} - } - fPollingTextCanvasModel.stopPolling(); - } - - private void waitForConnect() { - Logger.log("entered."); //$NON-NLS-1$ - - // TODO Eliminate the nested dispatch loop - do { - if (!fDisplay.readAndDispatch()) - fDisplay.sleep(); - } while (getState()==TerminalState.CONNECTING); - - if (getCtlText().isDisposed()) { - disconnectTerminal(); - return; - } - if (getMsg().length() > 0) { - showErrorMessage(getMsg()); - disconnectTerminal(); - return; - } - if (getCtlText().isFocusControl()) { - if (getState() == TerminalState.CONNECTED) - fFocusListener.captureKeyEvents(true); - } - fPollingTextCanvasModel.startPolling(); - startReaderJob(); - } - - private synchronized void startReaderJob() { - if(fJob==null) { - fJob=new Job("Terminal data reader") { //$NON-NLS-1$ - @Override - protected IStatus run(IProgressMonitor monitor) { - IStatus status=Status.OK_STATUS; - try { - while(true) { - while(fInputStream.available()==0 && !monitor.isCanceled()) { - try { - fInputStream.waitForAvailable(500); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - if(monitor.isCanceled()) { - //Do not disconnect terminal here because another reader job may already be running - status=Status.CANCEL_STATUS; - break; - } - try { - // TODO: should block when no text is available! - fTerminalText.processText(); - } catch (Exception e) { - disconnectTerminal(); - status=new Status(IStatus.ERROR,TerminalPlugin.PLUGIN_ID,e.getLocalizedMessage(),e); - break; - } - } - } finally { - // clean the job: start a new one when the connection gets restarted - // Bug 208145: make sure we do not clean an other job that's already started (since it would become a Zombie) - synchronized (VT100TerminalControl.this) { - if (fJob==this) { - fJob=null; - } - } - } - return status; - } - - }; - fJob.setSystem(true); - fJob.schedule(); - } - } - - private void showErrorMessage(String message) { - String strTitle = TerminalMessages.TerminalError; - // [168197] Replace JFace MessagDialog by SWT MessageBox - //MessageDialog.openError( getShell(), strTitle, message); - MessageBox mb = new MessageBox(getShell(), SWT.ICON_ERROR | SWT.OK); - mb.setText(strTitle); - mb.setMessage(message); - mb.open(); - } - - protected void sendString(String string) { - Logger.log(string); - try { - // Send the string after converting it to an array of bytes using the - // platform's default character encoding. - // - // TODO: Find a way to force this to use the ISO Latin-1 encoding. - // TODO: handle Encoding Errors in a better way - - getOutputStream().write(string.getBytes(fEncoding)); - getOutputStream().flush(); - } catch (SocketException socketException) { - displayTextInTerminal(socketException.getMessage()); - - String strMsg = TerminalMessages.SocketError - + "!\n" + socketException.getMessage(); //$NON-NLS-1$ - showErrorMessage(strMsg); - - Logger.logException(socketException); - - disconnectTerminal(); - } catch (IOException ioException) { - showErrorMessage(TerminalMessages.IOError + "!\n" + ioException.getMessage());//$NON-NLS-1$ - - Logger.logException(ioException); - - disconnectTerminal(); - } - } - - @Override - public Shell getShell() { - return getCtlText().getShell(); - } - - protected void sendChar(char chKey, boolean altKeyPressed) { - try { - int byteToSend = chKey; - OutputStream os = getOutputStream(); - if (os==null) { - // Bug 207785: NPE when trying to send char while no longer connected - Logger.log("NOT sending '" + byteToSend + "' because no longer connected"); //$NON-NLS-1$ //$NON-NLS-2$ - } else { - if (altKeyPressed) { - // When the ALT key is pressed at the same time that a character is - // typed, translate it into an ESCAPE followed by the character. The - // alternative in this case is to set the high bit of the character - // being transmitted, but that will cause input such as ALT-f to be - // seen as the ISO Latin-1 character '�', which can be confusing to - // European users running Emacs, for whom Alt-f should move forward a - // word instead of inserting the '�' character. - // - // TODO: Make the ESCAPE-vs-highbit behavior user configurable. - - byte[] bytesToSend = String.valueOf(chKey).getBytes(fEncoding); - StringBuilder b = new StringBuilder("sending ESC"); //$NON-NLS-1$ - for (int i = 0; i < bytesToSend.length; i++) { - if (i != 0) b.append(" +"); //$NON-NLS-1$ - b.append(" '" + bytesToSend[i] + "'"); //$NON-NLS-1$ //$NON-NLS-2$ - } - Logger.log(b.toString()); - os.write('\u001b'); - os.write(bytesToSend); - } else { - byte[] bytesToSend = String.valueOf(chKey).getBytes(fEncoding); - StringBuilder b = new StringBuilder("sending"); //$NON-NLS-1$ - for (int i = 0; i < bytesToSend.length; i++) { - if (i != 0) b.append(" +"); //$NON-NLS-1$ - b.append(" '" + bytesToSend[i] + "'"); //$NON-NLS-1$ //$NON-NLS-2$ - } - Logger.log(b.toString()); - os.write(bytesToSend); - } - os.flush(); - } - } catch (SocketException socketException) { - Logger.logException(socketException); - - displayTextInTerminal(socketException.getMessage()); - - String strMsg = TerminalMessages.SocketError - + "!\n" + socketException.getMessage(); //$NON-NLS-1$ - - showErrorMessage(strMsg); - Logger.logException(socketException); - - disconnectTerminal(); - } catch (IOException ioException) { - Logger.logException(ioException); - - displayTextInTerminal(ioException.getMessage()); - - String strMsg = TerminalMessages.IOError + "!\n" + ioException.getMessage(); //$NON-NLS-1$ - - showErrorMessage(strMsg); - Logger.logException(ioException); - - disconnectTerminal(); - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#setupTerminal(org.eclipse.swt.widgets.Composite) - */ - @Override - public void setupTerminal(Composite parent) { - Assert.isNotNull(parent); - boolean wasDisposed = true; - TerminalState oldState = fState; - fState = TerminalState.CLOSED; - if (fClipboard != null && !fClipboard.isDisposed()) { - // terminal was not disposed (DnD) - wasDisposed = false; - fClipboard.dispose(); - fPollingTextCanvasModel.stopPolling(); - } - if (fWndParent != null && !fWndParent.isDisposed()) { - // terminal widget gets a new parent (DnD) - fWndParent.dispose(); - } - setupControls(parent); - setCommandInputField(fCommandInputField); - setupListeners(); - if (fUseCommonPrefs && wasDisposed) { - updatePreferences(); - onTerminalFontChanged(); - TerminalPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(fPreferenceListener); - JFaceResources.getFontRegistry().addListener(fFontListener); - } - setupHelp(fWndParent, TerminalPlugin.HELP_VIEW); - - if (!wasDisposed) { - fState = oldState; - } - } - - /* - * (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.ITerminalViewControl#updatePreferences() - */ - private void updatePreferences() { - int bufferLineLimit = Platform.getPreferencesService().getInt(TerminalPlugin.PLUGIN_ID, ITerminalConstants.PREF_BUFFERLINES, 0, null); - boolean invert = Platform.getPreferencesService().getBoolean(TerminalPlugin.PLUGIN_ID, ITerminalConstants.PREF_INVERT_COLORS, false, null); - setBufferLineLimit(bufferLineLimit); - setInvertedColors(invert); - } - - private void onTerminalFontChanged() { - // set the font for all - setFont(ITerminalConstants.FONT_DEFINITION); - } - - /* - * (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.ITerminalViewControl#setFont(java.lang.String) - */ - @Override - public void setFont(String fontName) { - Font font=JFaceResources.getFont(fontName); - getCtlText().setFont(font); - if(fCommandInputField!=null) { - fCommandInputField.setFont(font); - } - // Tell the TerminalControl singleton that the font has changed. - fCtlText.updateFont(fontName); - getTerminalText().fontChanged(); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.ITerminalViewControl#setFont(org.eclipse.swt.graphics.Font) - */ - @Override - @Deprecated - public void setFont(Font font) { - getCtlText().setFont(font); - if(fCommandInputField!=null) { - fCommandInputField.setFont(font); - } - - // Tell the TerminalControl singleton that the font has changed. - fCtlText.onFontChange(); - getTerminalText().fontChanged(); - } - @Override - public Font getFont() { - return getCtlText().getFont(); - } - @Override - public Control getControl() { - return fCtlText; - } - @Override - public Control getRootControl() { - return fWndParent; - } - protected void setupControls(Composite parent) { - fWndParent=new Composite(parent,SWT.NONE); - GridLayout layout=new GridLayout(); - layout.marginWidth=0; layout.marginHeight=0; layout.verticalSpacing=0; - fWndParent.setLayout(layout); - - ITerminalTextDataSnapshot snapshot=fTerminalModel.makeSnapshot(); - // TODO how to get the initial size correctly! - snapshot.updateSnapshot(false); - fPollingTextCanvasModel=new PollingTextCanvasModel(snapshot); - fCtlText=new TextCanvas(fWndParent,fPollingTextCanvasModel,SWT.NONE,new TextLineRenderer(fCtlText,fPollingTextCanvasModel)); - - fCtlText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - fCtlText.addResizeHandler(new TextCanvas.ResizeListener() { - @Override - public void sizeChanged(int lines, int columns) { - fTerminalText.setDimensions(lines, columns); - } - }); - fCtlText.addMouseListener(new MouseAdapter() { - @Override - public void mouseUp(MouseEvent e) { - // update selection used by middle mouse button paste - if (e.button == 1 && getSelection().length() > 0) { - copy(DND.SELECTION_CLIPBOARD); - } - } - }); - - fDisplay = getCtlText().getDisplay(); - fClipboard = new Clipboard(fDisplay); - } - - protected void setupListeners() { - fKeyHandler = new TerminalKeyHandler(); - fFocusListener = new TerminalFocusListener(); - - getCtlText().addKeyListener(fKeyHandler); - getCtlText().addFocusListener(fFocusListener); - - } - - /** - * Setup all the help contexts for the controls. - */ - protected void setupHelp(Composite parent, String id) { - Control[] children = parent.getChildren(); - - for (int nIndex = 0; nIndex < children.length; nIndex++) { - if (children[nIndex] instanceof Composite) { - setupHelp((Composite) children[nIndex], id); - } - } - - PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, id); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#displayTextInTerminal(java.lang.String) - */ - @Override - public void displayTextInTerminal(String text) { - writeToTerminal("\r\n"+text+"\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ - } - private void writeToTerminal(String text) { - try { - getRemoteToTerminalOutputStream().write(text.getBytes(fEncoding)); - } catch (UnsupportedEncodingException e) { - // should never happen! - e.printStackTrace(); - } catch (IOException e) { - // should never happen! - e.printStackTrace(); - } - } - - @Override - public OutputStream getRemoteToTerminalOutputStream() { - if(Logger.isLogEnabled()) { - return new LoggingOutputStream(fInputStream.getOutputStream()); - } else { - return fInputStream.getOutputStream(); - } - } - protected boolean isLogCharEnabled() { - return TerminalPlugin.isOptionEnabled(Logger.TRACE_DEBUG_LOG_CHAR); - } - - @Override - public OutputStream getOutputStream() { - if(getTerminalConnector()!=null) - return getTerminalConnector().getTerminalToRemoteStream(); - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#setMsg(java.lang.String) - */ - @Override - public void setMsg(String msg) { - fMsg = msg; - } - - public String getMsg() { - return fMsg; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#getCtlText() - */ - protected TextCanvas getCtlText() { - return fCtlText; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#getTerminalText() - */ - public VT100Emulator getTerminalText() { - return fTerminalText; - } - protected class TerminalFocusListener implements FocusListener { - private IContextActivation terminalContextActivation = null; - private IContextActivation editContextActivation = null; - - protected TerminalFocusListener() { - super(); - } - - @Override - @SuppressWarnings("cast") - public void focusGained(FocusEvent event) { - // Disable all keyboard accelerators (e.g., Control-B) so the Terminal view - // can see every keystroke. Without this, Emacs, vi, and Bash are unusable - // in the Terminal view. - if (getState() == TerminalState.CONNECTED) - captureKeyEvents(true); - - IContextService contextService = (IContextService) PlatformUI.getWorkbench().getAdapter(IContextService.class); - editContextActivation = contextService.activateContext("org.eclipse.tm.terminal.EditContext"); //$NON-NLS-1$ - } - - @Override - @SuppressWarnings("cast") - public void focusLost(FocusEvent event) { - // Enable all keybindings. - captureKeyEvents(false); - - // Restore the command context to its previous value. - - IContextService contextService = (IContextService) PlatformUI.getWorkbench().getAdapter(IContextService.class); - contextService.deactivateContext(editContextActivation); - } - - @SuppressWarnings("cast") - protected void captureKeyEvents(boolean capture) { - IBindingService bindingService = (IBindingService) PlatformUI.getWorkbench().getAdapter(IBindingService.class); - IContextService contextService = (IContextService) PlatformUI.getWorkbench().getAdapter(IContextService.class); - - boolean enableKeyFilter = !capture; - if (bindingService.isKeyFilterEnabled() != enableKeyFilter) - bindingService.setKeyFilterEnabled(enableKeyFilter); - - if (capture && terminalContextActivation == null) { - // The above code fails to cause Eclipse to disable menu-activation - // accelerators (e.g., Alt-F for the File menu), so we set the command - // context to be the Terminal view's command context. This enables us to - // override menu-activation accelerators with no-op commands in our - // plugin.xml file, which enables the Terminal view to see absolutely _all_ - // key-presses. - terminalContextActivation = contextService.activateContext("org.eclipse.tm.terminal.TerminalContext"); //$NON-NLS-1$ - - } else if (!capture && terminalContextActivation != null) { - contextService.deactivateContext(terminalContextActivation); - terminalContextActivation = null; - } - } - } - - protected class TerminalKeyHandler extends KeyAdapter { - @Override - public void keyPressed(KeyEvent event) { - //TODO next 2 lines are probably obsolete now - if (getState()==TerminalState.CONNECTING) - return; - - //TODO we should no longer handle copy & paste specially. - //Instead, we should have Ctrl+Shift always go to local since there is no escape sequence for this. - //On Mac, Command+Anything already goes always to local. - //Note that this decision means that Command will NOT be Meta in Emacs on a Remote. - int accelerator = SWTKeySupport.convertEventToUnmodifiedAccelerator(event); - if (editActionAccelerators.isCopyAction(accelerator)) { - copy(); - return; - } - if (editActionAccelerators.isPasteAction(accelerator)) { - paste(); - return; - } - - // We set the event.doit to false to prevent any further processing of this - // key event. The only reason this is here is because I was seeing the F10 - // key both send an escape sequence (due to this method) and switch focus - // to the Workbench File menu (forcing the user to click in the Terminal - // view again to continue entering text). This fixes that. - - event.doit = false; - - char character = event.character; - int modifierKeys = event.stateMask & SWT.MODIFIER_MASK; - boolean ctrlKeyPressed = (event.stateMask & SWT.CTRL) != 0; - boolean onlyCtrlKeyPressed = modifierKeys == SWT.CTRL; - boolean macCmdKeyPressed = (event.stateMask & SWT.COMMAND) != 0; - - // To fix SPR 110341, we consider the Alt key to be pressed only when the - // Control key is _not_ also pressed. This works around a bug in SWT where, - // on European keyboards, the AltGr key being pressed appears to us as Control - // + Alt being pressed simultaneously. - boolean altKeyPressed = (event.stateMask & SWT.ALT) != 0 && !ctrlKeyPressed; - - //if (!isConnected()) { - if (fState==TerminalState.CLOSED) { - // Pressing ENTER while not connected causes us to connect. - if (character == '\r' && isConnectOnEnterIfClosed()) { - connectTerminal(); - return; - } - - // Ignore all other keyboard input when not connected. - // Allow other key handlers (such as Ctrl+F1) do their work - event.doit = true; - return; - } - - // Manage the Del key - if (event.keyCode == 0x000007f) { - sendString("\u001b[3~"); //$NON-NLS-1$ - return; - } - - // TODO Linux tty is usually expecting a DEL (^?) character - // but this causes issues with some telnet servers and - // serial connections. Workaround: stty erase ^H - //if (event.keyCode == SWT.BS) { - // sendChar(SWT.DEL, altKeyPressed); - // return; - //} - - // If the event character is NUL ('\u0000'), then a special key was pressed - // (e.g., PageUp, PageDown, an arrow key, a function key, Shift, Alt, - // Control, etc.). The one exception is when the user presses Control-@, - // which sends a NUL character, in which case we must send the NUL to the - // remote endpoint. This is necessary so that Emacs will work correctly, - // because Control-@ (i.e., NUL) invokes Emacs' set-mark-command when Emacs - // is running on a terminal. When the user presses Control-@, the keyCode - // is 50. - // On a Mac, the Cmd key is always used for local commands. - - if (macCmdKeyPressed || (character == '\u0000' && event.keyCode != 50)) { - // A special key was pressed. Figure out which one it was and send the - // appropriate ANSI escape sequence. - // - // IMPORTANT: Control will not enter this method for these special keys - // unless certain tags are present in the plugin.xml file - // for the Terminal view. Do not delete those tags. - - String escSeq = null; - boolean anyModifierPressed = modifierKeys != 0; - boolean onlyMacCmdKeyPressed = modifierKeys == SWT.COMMAND; - - switch (event.keyCode) { - case 0x1000001: // Up arrow. - if (!anyModifierPressed) - escSeq = fApplicationCursorKeys ? "\u001bOA" : "\u001b[A"; //$NON-NLS-1$ //$NON-NLS-2$ - break; - - case 0x1000002: // Down arrow. - if (!anyModifierPressed) - escSeq = fApplicationCursorKeys ? "\u001bOB" : "\u001b[B"; //$NON-NLS-1$ //$NON-NLS-2$ - break; - - case 0x1000003: // Left arrow. - if (onlyCtrlKeyPressed) { - escSeq = "\u001b[1;5D"; //$NON-NLS-1$ - } else if (!anyModifierPressed) { - escSeq = fApplicationCursorKeys ? "\u001bOD" : "\u001b[D"; //$NON-NLS-1$ //$NON-NLS-2$ - } else if (onlyMacCmdKeyPressed) { - // Cmd-Left is "Home" on the Mac - escSeq = fApplicationCursorKeys ? "\u001bOH" : "\u001b[H"; //$NON-NLS-1$ //$NON-NLS-2$ - } - break; - - case 0x1000004: // Right arrow. - if (onlyCtrlKeyPressed) { - escSeq = "\u001b[1;5C"; //$NON-NLS-1$ - } else if (!anyModifierPressed) { - escSeq = fApplicationCursorKeys ? "\u001bOC" : "\u001b[C"; //$NON-NLS-1$ //$NON-NLS-2$ - } else if (onlyMacCmdKeyPressed) { - // Cmd-Right is "End" on the Mac - escSeq = fApplicationCursorKeys ? "\u001bOF" : "\u001b[F"; //$NON-NLS-1$ //$NON-NLS-2$ - } - break; - - case 0x1000005: // PgUp key. - if (!anyModifierPressed) - escSeq = "\u001b[5~"; //$NON-NLS-1$ - break; - - case 0x1000006: // PgDn key. - if (!anyModifierPressed) - escSeq = "\u001b[6~"; //$NON-NLS-1$ - break; - - case 0x1000007: // Home key. - if (!anyModifierPressed) - escSeq = fApplicationCursorKeys ? "\u001bOH" : "\u001b[H"; //$NON-NLS-1$ //$NON-NLS-2$ - break; - - case 0x1000008: // End key. - if (!anyModifierPressed) - escSeq = fApplicationCursorKeys ? "\u001bOF" : "\u001b[F"; //$NON-NLS-1$ //$NON-NLS-2$ - break; - - case 0x1000009: // Insert. - if (!anyModifierPressed) - escSeq = "\u001b[2~"; //$NON-NLS-1$ - break; - - case 0x100000a: // F1 key. - if (!anyModifierPressed) - escSeq = "\u001bOP"; //$NON-NLS-1$ - break; - - case 0x100000b: // F2 key. - if (!anyModifierPressed) - escSeq = "\u001bOQ"; //$NON-NLS-1$ - break; - - case 0x100000c: // F3 key. - if (!anyModifierPressed) - escSeq = "\u001bOR"; //$NON-NLS-1$ - break; - - case 0x100000d: // F4 key. - if (!anyModifierPressed) - escSeq = "\u001bOS"; //$NON-NLS-1$ - break; - - case 0x100000e: // F5 key. - if (!anyModifierPressed) - escSeq = "\u001b[15~"; //$NON-NLS-1$ - break; - - case 0x100000f: // F6 key. - if (!anyModifierPressed) - escSeq = "\u001b[17~"; //$NON-NLS-1$ - break; - - case 0x1000010: // F7 key. - if (!anyModifierPressed) - escSeq = "\u001b[18~"; //$NON-NLS-1$ - break; - - case 0x1000011: // F8 key. - if (!anyModifierPressed) - escSeq = "\u001b[19~"; //$NON-NLS-1$ - break; - - case 0x1000012: // F9 key. - if (!anyModifierPressed) - escSeq = "\u001b[20~"; //$NON-NLS-1$ - break; - - case 0x1000013: // F10 key. - if (!anyModifierPressed) - escSeq = "\u001b[21~"; //$NON-NLS-1$ - break; - - case 0x1000014: // F11 key. - if (!anyModifierPressed) - escSeq = "\u001b[23~"; //$NON-NLS-1$ - break; - - case 0x1000015: // F12 key. - if (!anyModifierPressed) - escSeq = "\u001b[24~"; //$NON-NLS-1$ - break; - - default: - // Ignore other special keys. Control flows through this case when - // the user presses SHIFT, CONTROL, ALT, and any other key not - // handled by the above cases. - break; - } - - if (escSeq == null) { - // Any unmapped key should be handled locally by Eclipse - event.doit = true; - processKeyBinding(event, accelerator); - } else - sendString(escSeq); - - // It's ok to return here, because we never locally echo special keys. - - return; - } - - Logger.log("stateMask = " + event.stateMask); //$NON-NLS-1$ - - if (onlyCtrlKeyPressed) { - switch (character) { - case ' ': - // Send a NUL character -- many terminal emulators send NUL when - // Control-Space is pressed. This is used to set the mark in Emacs. - character = '\u0000'; - break; - case '/': - // Ctrl+/ is undo in emacs - character = '\u001f'; - break; - } - } - - //TODO: At this point, Ctrl+M sends the same as Ctrl+Shift+M . - //This is undesired. Fixing this here might make the special Ctrl+Shift+C - //handling unnecessary further up. - sendChar(character, altKeyPressed); - - // Now decide if we should locally echo the character we just sent. We do - // _not_ locally echo the character if any of these conditions are true: - // - // o This is a serial connection. - // - // o This is a TCP connection (i.e., m_telnetConnection is not null) and - // the remote endpoint is not a TELNET server. - // - // o The ALT (or META) key is pressed. - // - // o The character is any of the first 32 ISO Latin-1 characters except - // Control-I or Control-M. - // - // o The character is the DELETE character. - - if (getTerminalConnector() == null - || getTerminalConnector().isLocalEcho() == false || altKeyPressed - || (character >= '\u0001' && character < '\t') - || (character > '\t' && character < '\r') - || (character > '\r' && character <= '\u001f') - || character == '\u007f') { - // No local echoing. - return; - } - - // Locally echo the character. - - StringBuffer charBuffer = new StringBuffer(); - charBuffer.append(character); - - // If the character is a carriage return, we locally echo it as a CR + LF - // combination. - - if (character == '\r') - charBuffer.append('\n'); - - writeToTerminal(charBuffer.toString()); - } - - /* - * Process given event as Eclipse key binding. - */ - @SuppressWarnings("cast") - private void processKeyBinding(KeyEvent event, int accelerator) { - IBindingService bindingService = (IBindingService) PlatformUI.getWorkbench().getAdapter(IBindingService.class); - KeyStroke keyStroke = SWTKeySupport.convertAcceleratorToKeyStroke(accelerator); - Binding binding = bindingService.getPerfectMatch(KeySequence.getInstance(keyStroke)); - if (binding != null) { - ParameterizedCommand cmd = binding.getParameterizedCommand(); - if (cmd != null) { - IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getAdapter(IHandlerService.class); - Event cmdEvent = new Event(); - cmdEvent.type = SWT.KeyDown; - cmdEvent.display = event.display; - cmdEvent.widget = event.widget; - cmdEvent.character = event.character; - cmdEvent.keyCode = event.keyCode; - ////Bug - KeyEvent.keyLocation was introduced in Eclipse 3.6 - ////Use reflection for now to remain backward compatible down to Eclipse 3.4 - //cmdEvent.keyLocation = event.keyLocation; - try { - Field f1 = event.getClass().getField("keyLocation"); //$NON-NLS-1$ - Field f2 = cmdEvent.getClass().getField("keyLocation"); //$NON-NLS-1$ - f2.set(cmdEvent, f1.get(event)); - } catch(NoSuchFieldException nsfe) { - /* ignore, this is Eclipse 3.5 or earlier */ - } catch(Throwable t) { - t.printStackTrace(); - } - cmdEvent.stateMask = event.stateMask; - event.doit = false; - try { - handlerService.executeCommand(cmd, cmdEvent); - } catch (ExecutionException e) { - TerminalPlugin.getDefault().getLog().log( - new Status(IStatus.ERROR,TerminalPlugin.PLUGIN_ID,e.getLocalizedMessage(),e)); - } catch (Exception e) { - // ignore other exceptions from cmd execution - } - } - } - } - - } - - @Override - public void setTerminalTitle(String title) { - fTerminalListener.setTerminalTitle(title); - } - - - @Override - public TerminalState getState() { - return fState; - } - - - @Override - public void setState(TerminalState state) { - fState=state; - fTerminalListener.setState(state); - // enable the (blinking) cursor if the terminal is connected - runAsyncInDisplayThread(new Runnable() { - @Override - public void run() { - if(fCtlText!=null && !fCtlText.isDisposed()) { - if (isConnected()) { - fCtlText.setCursorEnabled(true); - } else { - fCtlText.setCursorEnabled(false); - // Stop capturing all key events - fFocusListener.captureKeyEvents(false); - } - } - } - }); - } - /** - * @param runnable run in display thread - */ - private void runAsyncInDisplayThread(Runnable runnable) { - if(Display.findDisplay(Thread.currentThread())!=null) - runnable.run(); - else if(PlatformUI.isWorkbenchRunning() && PlatformUI.getWorkbench().getDisplay() != null && !PlatformUI.getWorkbench().getDisplay().isDisposed()) - PlatformUI.getWorkbench().getDisplay().asyncExec(runnable); - // else should not happen and we ignore it... - } - - @Override - public String getSettingsSummary() { - if(getTerminalConnector()!=null) - return getTerminalConnector().getSettingsSummary(); - return ""; //$NON-NLS-1$ - } - - @Override - public void setConnector(ITerminalConnector connector) { - fConnector=connector; - - } - @Override - public ICommandInputField getCommandInputField() { - return fCommandInputField; - } - - @Override - public void setCommandInputField(ICommandInputField inputField) { - if(fCommandInputField!=null) - fCommandInputField.dispose(); - fCommandInputField=inputField; - if(fCommandInputField!=null) - fCommandInputField.createControl(fWndParent, this); - if(fWndParent.isVisible()) - fWndParent.layout(true); - } - - @Override - public int getBufferLineLimit() { - return fTerminalModel.getMaxHeight(); - } - - @Override - public void setBufferLineLimit(int bufferLineLimit) { - if(bufferLineLimit<=0) - return; - synchronized (fTerminalModel) { - if(fTerminalModel.getHeight()>bufferLineLimit) - fTerminalModel.setDimensions(bufferLineLimit, fTerminalModel.getWidth()); - fTerminalModel.setMaxHeight(bufferLineLimit); - } - } - - @Override - public boolean isScrollLock() { - return fCtlText.isScrollLock(); - } - - @Override - public void setScrollLock(boolean on) { - fCtlText.setScrollLock(on); - } - - @Override - public void setInvertedColors(boolean invert) { - fCtlText.setInvertedColors(invert); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#setConnectOnEnterIfClosed(boolean) - */ - @Override - public final void setConnectOnEnterIfClosed(boolean on) { - connectOnEnterIfClosed = on; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl#isConnectOnEnterIfClosed() - */ - @Override - public final boolean isConnectOnEnterIfClosed() { - return connectOnEnterIfClosed; - } - - @Override - public void setVT100LineWrapping(boolean enable) { - getTerminalText().setVT100LineWrapping(enable); - } - - @Override - public boolean isVT100LineWrapping() { - return getTerminalText().isVT100LineWrapping(); - } - - @Override - public void enableApplicationCursorKeys(boolean enable) { - fApplicationCursorKeys = enable; - } - - @Override - public void addMouseListener(ITerminalMouseListener listener) { - getCtlText().addTerminalMouseListener(listener); - } - - @Override - public void removeMouseListener(ITerminalMouseListener listener) { - getCtlText().removeTerminalMouseListener(listener); - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/ISnapshotChanges.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/ISnapshotChanges.java deleted file mode 100644 index 184b63b..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/ISnapshotChanges.java +++ /dev/null @@ -1,90 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.model; - -import org.eclipse.tm.terminal.model.ITerminalTextData; - -public interface ISnapshotChanges { - - /** - * @param line might bigger than the number of lines.... - */ - void markLineChanged(int line); - - /** - * Marks all lines in the range as changed - * @param line >=0 - * @param n might be out of range - */ - void markLinesChanged(int line, int n); - - /** - * Marks all lines within the scrolling region - * changed and resets the scrolling information - */ - void convertScrollingIntoChanges(); - - /** - * @return true if something has changed - */ - boolean hasChanged(); - - /** - * @param startLine - * @param size - * @param shift - */ - void scroll(int startLine, int size, int shift); - - /** - * Mark all lines changed - * @param height if no window is set this is the number of - * lines that are marked as changed - */ - void setAllChanged(int height); - - int getFirstChangedLine(); - - int getLastChangedLine(); - - int getScrollWindowStartLine(); - - int getScrollWindowSize(); - - int getScrollWindowShift(); - - boolean hasLineChanged(int line); - - void markDimensionsChanged(); - boolean hasDimensionsChanged(); - void markCursorChanged(); - - /** - * @return true if the terminal data has changed - */ - boolean hasTerminalChanged(); - /** - * mark the terminal as changed - */ - void setTerminalChanged(); - - - void copyChangedLines(ITerminalTextData dest, ITerminalTextData source); - - /** - * @param startLine -1 means follow the end of the data - * @param size number of lines to follow - */ - void setInterestWindow(int startLine, int size); - int getInterestWindowStartLine(); - int getInterestWindowSize(); - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/SnapshotChanges.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/SnapshotChanges.java deleted file mode 100644 index 362e8ce..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/SnapshotChanges.java +++ /dev/null @@ -1,391 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.model; - -import org.eclipse.tm.terminal.model.ITerminalTextData; - - -/** - * Collects the changes of the {@link ITerminalTextData} - * - */ -public class SnapshotChanges implements ISnapshotChanges { - /** - * The first line changed - */ - private int fFirstChangedLine; - /** - * The last line changed - */ - private int fLastChangedLine; - private int fScrollWindowStartLine; - private int fScrollWindowSize; - private int fScrollWindowShift; - /** - * true, if scrolling should not tracked anymore - */ - private boolean fScrollDontTrack; - /** - * The lines that need to be copied - * into the snapshot (lines that have - * not changed don't have to be copied) - */ - private boolean[] fChangedLines; - - private int fInterestWindowSize; - private int fInterestWindowStartLine; - private boolean fDimensionsChanged; - private boolean fTerminalHasChanged; - private boolean fCursorHasChanged; - - public SnapshotChanges(int nLines) { - setChangedLinesLength(nLines); - fFirstChangedLine=Integer.MAX_VALUE; - fLastChangedLine=-1; - } - public SnapshotChanges(int windowStart, int windowSize) { - setChangedLinesLength(windowStart+windowSize); - fFirstChangedLine=Integer.MAX_VALUE; - fLastChangedLine=-1; - fInterestWindowStartLine=windowStart; - fInterestWindowSize=windowSize; - - } - /** - * This is used in asserts to throw an {@link RuntimeException}. - * This is useful for tests. - * @return never -- throws an exception - */ - private boolean throwRuntimeException() { - throw new RuntimeException(); - } - /** - * @param line - * @param size - * @return true if the range overlaps with the interest window - */ - boolean isInInterestWindow(int line, int size) { - if(fInterestWindowSize<=0) - return true; - if(line+size<=fInterestWindowStartLine || line>=fInterestWindowStartLine+fInterestWindowSize) - return false; - return true; - } - /** - * @param line - * @return true if the line is within the interest window - */ - boolean isInInterestWindow(int line) { - if(fInterestWindowSize<=0) - return true; - if(line=fInterestWindowStartLine+fInterestWindowSize) - return false; - return true; - } - /** - * @param line - * @return the line within the window - */ - int fitLineToWindow(int line) { - if(fInterestWindowSize<=0) - return line; - if(linebefore {@link #fitLineToWindow(int)} has been called! - * @param size - * @return the adjusted size. - *

            Note:

            {@link #fitLineToWindow(int)} has to be called on the line to - * move the window correctly! - */ - int fitSizeToWindow(int line, int size) { - if(fInterestWindowSize<=0) - return size; - if(linefInterestWindowStartLine+fInterestWindowSize) - size=fInterestWindowStartLine+fInterestWindowSize-line; - return size; - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.model.ISnapshotChanges#markLineChanged(int) - */ - public void markLineChanged(int line) { - if(!isInInterestWindow(line)) - return; - line=fitLineToWindow(line); - if(linefLastChangedLine) - fLastChangedLine=line; - // in case the terminal got resized we expand - // don't remember the changed line because - // there is nothing to copy - if(line0 || fScrollWindowShift!=0 ||fDimensionsChanged || fCursorHasChanged) - return true; - return false; - } - public void markDimensionsChanged() { - fDimensionsChanged=true; - } - public boolean hasDimensionsChanged() { - return fDimensionsChanged; - } - public boolean hasTerminalChanged() { - return fTerminalHasChanged; - } - public void setTerminalChanged() { - fTerminalHasChanged=true; - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.model.ISnapshotChanges#scroll(int, int, int) - */ - public void scroll(int startLine, int size, int shift) { - size=fitSizeToWindow(startLine, size); - startLine=fitLineToWindow(startLine); - // let's track only negative shifts - if(fScrollDontTrack) { - // we are in a state where we cannot track scrolling - // so let's simply mark the scrolled lines as changed - markLinesChanged(startLine, size); - } else if(shift>=0) { - // we cannot handle positive scroll - // forget about clever caching of scroll events - doNotTrackScrollingAnymore(); - // mark all lines inside the scroll region as changed - markLinesChanged(startLine, size); - } else { - // we have already scrolled - if(fScrollWindowShift<0) { - // we have already scrolled - if(fScrollWindowStartLine==startLine && fScrollWindowSize==size) { - // we are scrolling the same region again? - fScrollWindowShift+=shift; - scrollChangesLinesWithNegativeShift(startLine,size,shift); - } else { - // mark all lines in the old scroll region as changed - doNotTrackScrollingAnymore(); - // mark all lines changed, because - markLinesChanged(startLine, size); - } - } else { - // first scroll in this change -- we just notify it - fScrollWindowStartLine=startLine; - fScrollWindowSize=size; - fScrollWindowShift=shift; - scrollChangesLinesWithNegativeShift(startLine,size,shift); - } - } - } - /** - * Some incompatible scrolling occurred. We cannot do the - * scroll optimization anymore... - */ - private void doNotTrackScrollingAnymore() { - if(fScrollWindowSize>0) { - // convert the current scrolling into changes - markLinesChanged(fScrollWindowStartLine, fScrollWindowSize); - fScrollWindowStartLine=0; - fScrollWindowSize=0; - fScrollWindowShift=0; - } - // don't be clever on scrolling anymore - fScrollDontTrack=true; - } - /** - * Scrolls the changed lines data - * - * @param line - * @param n - * @param shift must be negative! - */ - private void scrollChangesLinesWithNegativeShift(int line, int n, int shift) { - assert shift <0 || throwRuntimeException(); - // scroll the region - // don't run out of bounds! - int m=Math.min(line+n+shift,getChangedLineLength()+shift); - for (int i = line; i < m; i++) { - setChangedLine(i, hasLineChanged(i-shift)); - // move the first changed line up. - // We don't have to move the maximum down, - // because with a shift scroll, the max is moved - // my the next loop in this method - if(i0) { - int shift=oldStartLine-startLine; - if(shift==0) { - if(size>oldSize) { - // add lines to the end - markLinesChanged(oldStartLine+oldSize, size-oldSize); - } - // else no lines within the window have changed - - } else if(Math.abs(shift)TerminalTextData.toMultiLineText(this,0,200)) - * @param term the terminal - * @param start start line to show - * @param len number of lines to show -- negative numbers means show all - * @return a string representation of the content - */ - static public String toMultiLineText(ITerminalTextDataReadOnly term, int start, int len) { - if(len<0) - len=term.getHeight(); - StringBuffer buff=new StringBuffer(); - int width=term.getWidth(); - int n=Math.min(len,term.getHeight()-start); - for (int line = start; line < n; line++) { - if(line>0) - buff.append("\n"); //$NON-NLS-1$ - for (int column = 0; column < width; column++) { - buff.append(term.getChar(line, column)); - } - } - // get rid of the empty space at the end of the lines - //return buff.toString().replaceAll("\000+", ""); //$NON-NLS-1$//$NON-NLS-2$ - // - int i = buff.length() - 1; - while (i >= 0 && buff.charAt(i) == '\000') { - i--; - } - buff.setLength(i + 1); - return buff.toString(); - // - } - - /** - * Show the first 100 lines - * see {@link #toMultiLineText(ITerminalTextDataReadOnly, int, int)} - * @param term A read-only terminal model - * @return a string representation of the terminal - */ - static public String toMultiLineText(ITerminalTextDataReadOnly term) { - return toMultiLineText(term, 0, 100); - } - - public TerminalTextData() { - this(new TerminalTextDataFastScroll()); - -// this(new TerminalTextDataStore()); - } - public TerminalTextData(ITerminalTextData data) { - fData=data; - } - public int getWidth() { - return fData.getWidth(); - } - public int getHeight() { - // no need for an extra variable - return fData.getHeight(); - } - public void setDimensions(int height, int width) { - int h=getHeight(); - int w=getWidth(); - if(w==width && h==height) - return; - fData.setDimensions(height, width); - sendDimensionsChanged(h, w, height, width); - } - private void sendDimensionsChanged(int oldHeight, int oldWidth, int newHeight, int newWidth) { - // determine what has changed - if(oldWidth==newWidth) { - if(oldHeight list=new ArrayList(); - list.addAll(Arrays.asList(fSnapshots)); - list.remove(snapshot); - fSnapshots=list.toArray(new TerminalTextDataSnapshot[list.size()]); - } - - public ITerminalTextDataSnapshot makeSnapshot() { - // poor mans approach to modify the array - TerminalTextDataSnapshot snapshot=new TerminalTextDataSnapshot(this); - snapshot.markDimensionsChanged(); - List list=new ArrayList(); - list.addAll(Arrays.asList(fSnapshots)); - list.add(snapshot); - fSnapshots=list.toArray(new TerminalTextDataSnapshot[list.size()]); - return snapshot; - } - public void addLine() { - int oldHeight=getHeight(); - fData.addLine(); - // was is an append or a scroll? - int newHeight=getHeight(); - if(newHeight>oldHeight) { - //the line was appended - sendLinesChangedToSnapshot(oldHeight, 1); - int width=getWidth(); - sendDimensionsChanged(oldHeight, width, newHeight, width); - - } else { - // the line was scrolled - sendScrolledToSnapshots(0, oldHeight, -1); - } - - } - - public void copy(ITerminalTextData source) { - fData.copy(source); - fCursorLine=source.getCursorLine(); - fCursorColumn=source.getCursorColumn(); - } - - public void copyLine(ITerminalTextData source, int sourceLine, int destLine) { - fData.copyLine(source, sourceLine, destLine); - } - public void copyRange(ITerminalTextData source, int sourceStartLine, int destStartLine, int length) { - fData.copyRange(source, sourceStartLine, destStartLine, length); - } - public char[] getChars(int line) { - return fData.getChars(line); - } - public Style[] getStyles(int line) { - return fData.getStyles(line); - } - public int getMaxHeight() { - return fData.getMaxHeight(); - } - public void setMaxHeight(int height) { - fData.setMaxHeight(height); - } - public void cleanLine(int line) { - fData.cleanLine(line); - sendLineChangedToSnapshots(line); - } - public int getCursorColumn() { - return fCursorColumn; - } - public int getCursorLine() { - return fCursorLine; - } - public void setCursorColumn(int column) { - fCursorColumn=column; - sendCursorChanged(); - } - public void setCursorLine(int line) { - fCursorLine=line; - sendCursorChanged(); - } - - public boolean isWrappedLine(int line) { - return fData.isWrappedLine(line); - } - - public void setWrappedLine(int line) { - fData.setWrappedLine(line); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/TerminalTextDataFastScroll.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/TerminalTextDataFastScroll.java deleted file mode 100644 index 9202178..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/TerminalTextDataFastScroll.java +++ /dev/null @@ -1,259 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Anton Leherbauer (Wind River) - [453393] Add support for copying wrapped lines without line break - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.model; - -import org.eclipse.tm.terminal.model.ITerminalTextData; -import org.eclipse.tm.terminal.model.ITerminalTextDataSnapshot; -import org.eclipse.tm.terminal.model.LineSegment; -import org.eclipse.tm.terminal.model.Style; - -/** - * This class is optimized for scrolling the entire {@link #getHeight()}. - * The scrolling is done by moving an offset into the data and using - * the modulo operator. - * - */ -public class TerminalTextDataFastScroll implements ITerminalTextData { - - final ITerminalTextData fData; - private int fHeight; - private int fMaxHeight; - /** - * The offset into the array. - */ - int fOffset; - public TerminalTextDataFastScroll(ITerminalTextData data,int maxHeight) { - fMaxHeight=maxHeight; - fData=data; - fData.setDimensions(maxHeight, fData.getWidth()); - if(maxHeight>2) - assert shiftOffset(-2) || throwRuntimeException(); - } - public TerminalTextDataFastScroll(int maxHeight) { - this(new TerminalTextDataStore(),maxHeight); - } - public TerminalTextDataFastScroll() { - this(new TerminalTextDataStore(),1); - } - /** - * This is used in asserts to throw an {@link RuntimeException}. - * This is useful for tests. - * @return never -- throws an exception - */ - private boolean throwRuntimeException() { - throw new RuntimeException(); - } - /** - * - * @param line - * @return the actual line number in {@link #fData} - */ - int getPositionOfLine(int line) { - return (line+fOffset)%fMaxHeight; - } - /** - * Moves offset by delta. This does not move the data! - * @param delta - */ - void moveOffset(int delta) { - assert Math.abs(delta)=0 && destStartLine+length<=fHeight) || throwRuntimeException(); - for (int i = 0; i < length; i++) { - fData.copyLine(source, i+sourceStartLine, getPositionOfLine(i+destStartLine)); - } - } - - public char getChar(int line, int column) { - assert (line>=0 && line=0 && line=0 && line=0 && line=0 && line=0 && startLine+size<=fHeight) || throwRuntimeException(); - if(shift>=fMaxHeight || -shift>=fMaxHeight) { - cleanLines(startLine, fMaxHeight-startLine); - return; - } - if(size==fHeight) { - // This is the case this class is optimized for! - moveOffset(-shift); - // we only have to clean the lines that appear by the move - if(shift<0) { - cleanLines(Math.max(startLine, startLine+size+shift),Math.min(-shift, getHeight()-startLine)); - } else { - cleanLines(startLine, Math.min(shift, getHeight()-startLine)); - } - } else { - // we have to copy the lines. - if(shift<0) { - // move the region up - // shift is negative!! - for (int i = startLine; i < startLine+size+shift; i++) { - fData.copyLine(fData, getPositionOfLine(i-shift), getPositionOfLine(i)); - } - // then clean the opened lines - cleanLines(Math.max(0, startLine+size+shift),Math.min(-shift, getHeight()-startLine)); - } else { - for (int i = startLine+size-1; i >=startLine && i-shift>=0; i--) { - fData.copyLine(fData, getPositionOfLine(i-shift), getPositionOfLine(i)); - } - cleanLines(startLine, Math.min(shift, getHeight()-startLine)); - } - } - } - - public void setChar(int line, int column, char c, Style style) { - assert (line>=0 && line=0 && line=0 && line=0 || throwRuntimeException(); - assert width>=0 || throwRuntimeException(); - if(height > fMaxHeight) - setMaxHeight(height); - fHeight=height; - if(width!=fData.getWidth()) - fData.setDimensions(fMaxHeight, width); - } - - public void setMaxHeight(int maxHeight) { - assert maxHeight>=fHeight || throwRuntimeException(); - // move everything to offset0 - int start=getPositionOfLine(0); - if(start!=0) { - // invent a more efficient algorithm.... - ITerminalTextData buffer=new TerminalTextDataStore(); - // create a buffer with the expected height - buffer.setDimensions(maxHeight, getWidth()); - int n=Math.min(fMaxHeight-start,maxHeight); - // copy the first part - buffer.copyRange(fData, start, 0, n); - // copy the second part - if(n=0 && line=0 && linenot threadsafe! - */ -class TerminalTextDataSnapshot implements ITerminalTextDataSnapshot { - /** - * The changes of the current snapshot relative to the - * previous snapshot - */ - volatile ISnapshotChanges fCurrentChanges; - /** - * Keeps track of changes that happened since the current - * snapshot has been made. - */ - ISnapshotChanges fFutureChanges; - /** - * Is used as lock and is the reference to the terminal we take snapshots from. - */ - final TerminalTextData fTerminal; - /** - * A snapshot copy of of fTerminal - */ - // snapshot does not need internal synchronisation - final TerminalTextDataWindow fSnapshot; - // this variable is synchronized on fTerminal! - private SnapshotOutOfDateListener[] fListener=new SnapshotOutOfDateListener[0]; - // this variable is synchronized on fTerminal! - private boolean fListenersNeedNotify; - private int fInterestWindowSize; - private int fInterestWindowStartLine; - - TerminalTextDataSnapshot(TerminalTextData terminal) { - fSnapshot = new TerminalTextDataWindow(); - fTerminal = terminal; - fCurrentChanges = new SnapshotChanges(fTerminal.getHeight()); - fCurrentChanges.setTerminalChanged(); - fFutureChanges = new SnapshotChanges(fTerminal.getHeight()); - fFutureChanges.markLinesChanged(0, fTerminal.getHeight()); - fListenersNeedNotify=true; - fInterestWindowSize=-1; - } - /** - * This is used in asserts to throw an {@link RuntimeException}. - * This is useful for tests. - * @return never -- throws an exception - */ - private boolean throwRuntimeException() { - throw new RuntimeException(); - } - - public void detach() { - fTerminal.removeSnapshot(this); - } - - public boolean isOutOfDate() { - // this is called from fTerminal, therefore we lock on fTerminal - synchronized (fTerminal) { - return fFutureChanges.hasChanged(); - } - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.model.ITerminalTextDataSnapshot#snapshot() - */ - public void updateSnapshot(boolean detectScrolling) { - // make sure terminal does not change while we make the snapshot - synchronized (fTerminal) { - // let's make the future changes current - fCurrentChanges=fFutureChanges; - fFutureChanges=new SnapshotChanges(fTerminal.getHeight()); - fFutureChanges.setInterestWindow(fInterestWindowStartLine, fInterestWindowSize); - // and update the snapshot - if(fSnapshot.getHeight()!=fTerminal.getHeight()||fSnapshot.getWidth()!=fTerminal.getWidth()) { - if(fInterestWindowSize==-1) - fSnapshot.setWindow(0, fTerminal.getHeight()); - // if the dimensions have changed, we need a full copy - fSnapshot.copy(fTerminal); - // and we mark all lines as changed - fCurrentChanges.setAllChanged(fTerminal.getHeight()); - } else { - // first we do the scroll on the copy - int start=fCurrentChanges.getScrollWindowStartLine(); - int lines=Math.min(fCurrentChanges.getScrollWindowSize(), fSnapshot.getHeight()-start); - fSnapshot.scroll(start, lines, fCurrentChanges.getScrollWindowShift()); - // and then create the snapshot of the changed lines - fCurrentChanges.copyChangedLines(fSnapshot, fTerminal); - } - fListenersNeedNotify=true; - fSnapshot.setCursorLine(fTerminal.getCursorLine()); - fSnapshot.setCursorColumn(fTerminal.getCursorColumn()); - } - if(!detectScrolling) { - // let's pretend there was no scrolling and - // convert the scrolling into line changes - fCurrentChanges.convertScrollingIntoChanges(); - } - } - - public char getChar(int line, int column) { - return fSnapshot.getChar(line, column); - } - - public int getHeight() { - return fSnapshot.getHeight(); - } - - public LineSegment[] getLineSegments(int line, int column, int len) { - return fSnapshot.getLineSegments(line, column, len); - } - - public Style getStyle(int line, int column) { - return fSnapshot.getStyle(line, column); - } - - public int getWidth() { - return fSnapshot.getWidth(); - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.model.ITerminalTextDataSnapshot#getFirstChangedLine() - */ - public int getFirstChangedLine() { - return fCurrentChanges.getFirstChangedLine(); - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.model.ITerminalTextDataSnapshot#getLastChangedLine() - */ - public int getLastChangedLine() { - return fCurrentChanges.getLastChangedLine(); - } - - public boolean hasLineChanged(int line) { - return fCurrentChanges.hasLineChanged(line); - } - public boolean hasDimensionsChanged() { - return fCurrentChanges.hasDimensionsChanged(); - } - public boolean hasTerminalChanged() { - return fCurrentChanges.hasTerminalChanged(); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.model.ITerminalTextDataSnapshot#getScrollChangeY() - */ - public int getScrollWindowStartLine() { - return fCurrentChanges.getScrollWindowStartLine(); - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.model.ITerminalTextDataSnapshot#getScrollChangeN() - */ - public int getScrollWindowSize() { - return fCurrentChanges.getScrollWindowSize(); - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.model.ITerminalTextDataSnapshot#getScrollChangeShift() - */ - public int getScrollWindowShift() { - return fCurrentChanges.getScrollWindowShift(); - } - - /** - * Announces a change in line line - * @param line - */ - void markLineChanged(int line) { - // threading - fFutureChanges.markLineChanged(line); - fFutureChanges.setTerminalChanged(); - notifyListers(); - } - /** - * Announces a change of n lines beginning with line line - * @param line - * @param n - */ - void markLinesChanged(int line,int n) { - fFutureChanges.markLinesChanged(line,n); - fFutureChanges.setTerminalChanged(); - notifyListers(); - } - - void markDimensionsChanged() { - fFutureChanges.markDimensionsChanged(); - fFutureChanges.setTerminalChanged(); - notifyListers(); - } - void markCursorChanged() { - fFutureChanges.markCursorChanged(); - fFutureChanges.setTerminalChanged(); - notifyListers(); - } - - /** - * @param startLine - * @param size - * @param shift - */ - void scroll(int startLine, int size, int shift) { - fFutureChanges.scroll(startLine,size,shift); - fFutureChanges.setTerminalChanged(); - notifyListers(); - } - /** - * Notifies listeners about the change - */ - private void notifyListers() { - // this code has to be called from a block synchronized on fTerminal - synchronized (fTerminal) { - if(fListenersNeedNotify) { - for (int i = 0; i < fListener.length; i++) { - fListener[i].snapshotOutOfDate(this); - } - fListenersNeedNotify=false; - } - } - } - public ITerminalTextDataSnapshot makeSnapshot() { - return fSnapshot.makeSnapshot(); - } - - synchronized public void addListener(SnapshotOutOfDateListener listener) { - List list=new ArrayList(); - list.addAll(Arrays.asList(fListener)); - list.add(listener); - fListener=list.toArray(new SnapshotOutOfDateListener[list.size()]); - } - - synchronized public void removeListener(SnapshotOutOfDateListener listener) { - List list=new ArrayList(); - list.addAll(Arrays.asList(fListener)); - list.remove(listener); - fListener=list.toArray(new SnapshotOutOfDateListener[list.size()]); - } - public String toString() { - return fSnapshot.toString(); - } - - - public int getInterestWindowSize() { - return fInterestWindowSize; - } - - - public int getInterestWindowStartLine() { - return fInterestWindowStartLine; - } - - public void setInterestWindow(int startLine, int size) { - assert startLine>=0 || throwRuntimeException(); - assert size>=0 || throwRuntimeException(); - fInterestWindowStartLine=startLine; - fInterestWindowSize=size; - fSnapshot.setWindow(startLine, size); - fFutureChanges.setInterestWindow(startLine, size); - notifyListers(); - } - - - public char[] getChars(int line) { - return fSnapshot.getChars(line); - } - - - public Style[] getStyles(int line) { - return fSnapshot.getStyles(line); - } - public int getCursorColumn() { - return fSnapshot.getCursorColumn(); - } - public int getCursorLine() { - return fSnapshot.getCursorLine(); - } - public ITerminalTextData getTerminalTextData() { - return fTerminal; - } - public boolean isWrappedLine(int line) { - return fSnapshot.isWrappedLine(line); - } -} - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/TerminalTextDataStore.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/TerminalTextDataStore.java deleted file mode 100644 index 9817087..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/model/TerminalTextDataStore.java +++ /dev/null @@ -1,344 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Anton Leherbauer (Wind River) - [453393] Add support for copying wrapped lines without line break - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.model; - -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.BitSet; -import java.util.List; - -import org.eclipse.tm.terminal.model.ITerminalTextData; -import org.eclipse.tm.terminal.model.ITerminalTextDataSnapshot; -import org.eclipse.tm.terminal.model.LineSegment; -import org.eclipse.tm.terminal.model.Style; - -/** - * This class is thread safe. - * - */ -public class TerminalTextDataStore implements ITerminalTextData { - private char[][] fChars; - private Style[][] fStyle; - private int fWidth; - private int fHeight; - private int fMaxHeight; - private int fCursorColumn; - private int fCursorLine; - final private BitSet fWrappedLines = new BitSet(); - - public TerminalTextDataStore() { - fChars=new char[0][]; - fStyle=new Style[0][]; - fWidth=0; - } - /** - * This is used in asserts to throw an {@link RuntimeException}. - * This is useful for tests. - * @return never -- throws an exception - */ - private boolean throwRuntimeException() { - throw new RuntimeException(); - } - - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.text.ITerminalTextData#getWidth() - */ - public int getWidth() { - return fWidth; - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.text.ITerminalTextData#getHeight() - */ - public int getHeight() { - return fHeight; - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.text.ITerminalTextData#setDimensions(int, int) - */ - public void setDimensions(int height, int width) { - assert height>=0 || throwRuntimeException(); - assert width>=0 || throwRuntimeException(); - // just extend the region - if(height>fChars.length) { - int h=4*height/3; - if(fMaxHeight>0 && h>fMaxHeight) - h=fMaxHeight; - fStyle=(Style[][]) resizeArray(fStyle, height); - fChars=(char[][]) resizeArray(fChars, height); - } - // clean the new lines - if(height>fHeight) { - for (int i = fHeight; i < height; i++) { - cleanLine(i); - } - } - // set dimensions after successful resize! - fWidth=width; - fHeight=height; - } - /** - * Reallocates an array with a new size, and copies the contents of the old - * array to the new array. - * - * @param origArray the old array, to be reallocated. - * @param newSize the new array size. - * @return A new array with the same contents (chopped off if needed or filled with 0 or null). - */ - private Object resizeArray(Object origArray, int newSize) { - int oldSize = Array.getLength(origArray); - if(oldSize==newSize) - return origArray; - Class elementType = origArray.getClass().getComponentType(); - Object newArray = Array.newInstance(elementType, newSize); - int preserveLength = Math.min(oldSize, newSize); - if (preserveLength > 0) - System.arraycopy(origArray, 0, newArray, 0, preserveLength); - return newArray; - } - - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.text.ITerminalTextData#getLineSegments(int, int, int) - */ - public LineSegment[] getLineSegments(int line, int column, int len) { - // get the styles and chars for this line - Style[] styles=fStyle[line]; - char[] chars=fChars[line]; - int col=column; - int n=column+len; - - // expand the line if needed.... - if(styles==null) - styles=new Style[n]; - else if(styles.length segments=new ArrayList(); - for (int i = column; i < n; i++) { - if(styles[i]!=style) { - segments.add(new LineSegment(col,new String(chars,col,i-col),style)); - style=styles[i]; - col=i; - } - } - if(col < n) { - segments.add(new LineSegment(col,new String(chars,col,n-col),style)); - } - return segments.toArray(new LineSegment[segments.size()]); - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.text.ITerminalTextData#getChar(int, int) - */ - public char getChar(int line, int column) { - assert column=fChars[line].length) - return 0; - return fChars[line][column]; - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.text.ITerminalTextData#getStyle(int, int) - */ - public Style getStyle(int line, int column) { - assert column=fStyle[line].length) - return null; - return fStyle[line][column]; - } - - void ensureLineLength(int iLine, int length) { - if(length>fWidth) - throw new RuntimeException(); - if(fChars[iLine]==null) { - fChars[iLine]=new char[length]; - } else if(fChars[iLine].length=startLine && i-shift>=0; i--) { - fChars[i]=fChars[i-shift]; - fStyle[i]=fStyle[i-shift]; - fWrappedLines.set(i, fWrappedLines.get(i-shift)); - } - cleanLines(startLine, Math.min(shift, getHeight()-startLine)); - } - } - /** - * Replaces the lines with new empty data - * @param line - * @param len - */ - private void cleanLines(int line, int len) { - for (int i = line; i < line+len; i++) { - cleanLine(i); - } - } - - /* - * @return a text representation of the object. - * Lines are separated by '\n'. No style information is returned. - */ - public String toString() { - StringBuffer buff=new StringBuffer(); - for (int line = 0; line < getHeight(); line++) { - if(line>0) - buff.append("\n"); //$NON-NLS-1$ - for (int column = 0; column < fWidth; column++) { - buff.append(getChar(line, column)); - } - } - return buff.toString(); - } - - - public ITerminalTextDataSnapshot makeSnapshot() { - throw new UnsupportedOperationException(); - } - - public void addLine() { - if(fMaxHeight>0 && getHeight()char=='\000' and style=null. - * - */ -public class TerminalTextDataWindow implements ITerminalTextData { - final ITerminalTextData fData; - int fWindowStartLine; - int fWindowSize; - int fHeight; - int fMaxHeight; - public TerminalTextDataWindow(ITerminalTextData data) { - fData=data; - } - public TerminalTextDataWindow() { - this(new TerminalTextDataStore()); - } - /** - * This is used in asserts to throw an {@link RuntimeException}. - * This is useful for tests. - * @return never -- throws an exception - */ - private boolean throwRuntimeException() { - throw new RuntimeException(); - } - /** - * @param line - * @return true if the line is within the window - */ - boolean isInWindow(int line) { - return line>=fWindowStartLine && line0 && getHeight()0) - fData.copyRange(source, fWindowStartLine, 0, n); - } - public void copyRange(ITerminalTextData source, int sourceStartLine, int destStartLine, int length) { - int n=length; - int dStart=destStartLine-fWindowStartLine; - int sStart=sourceStartLine; - // if start outside our range, cut the length to copy - if(dStart<0) { - n+=dStart; - sStart-=dStart; - dStart=0; - } - // do not exceed the window size - n=Math.min(n,fWindowSize); - if(n>0) - fData.copyRange(source, sStart, dStart, n); - - } - public void copyLine(ITerminalTextData source, int sourceLine, int destLine) { - if(isInWindow(destLine)) - fData.copyLine(source, sourceLine, destLine-fWindowStartLine); - } - public void scroll(int startLine, int size, int shift) { - assert (startLine>=0 && startLine+size<=fHeight) || throwRuntimeException(); - int n=size; - int start=startLine-fWindowStartLine; - // if start outside our range, cut the length to copy - if(start<0) { - n+=start; - start=0; - } - n=Math.min(n,fWindowSize-start); - // do not exceed the window size - if(n>0) - fData.scroll(start, n, shift); - } - public void setChar(int line, int column, char c, Style style) { - if(!isInWindow(line)) - return; - fData.setChar(line-fWindowStartLine, column, c, style); - } - public void setChars(int line, int column, char[] chars, int start, int len, Style style) { - if(!isInWindow(line)) - return; - fData.setChars(line-fWindowStartLine, column, chars, start, len, style); - } - public void setChars(int line, int column, char[] chars, Style style) { - if(!isInWindow(line)) - return; - fData.setChars(line-fWindowStartLine, column, chars, style); - } - public void setDimensions(int height, int width) { - assert height>=0 || throwRuntimeException(); - fData.setDimensions(fWindowSize, width); - fHeight=height; - } - public void setMaxHeight(int height) { - fMaxHeight=height; - } - public void setWindow(int startLine, int size) { - fWindowStartLine=startLine; - fWindowSize=size; - fData.setDimensions(fWindowSize, getWidth()); - } - public int getWindowStartLine() { - return fWindowStartLine; - } - public int getWindowSize() { - return fWindowSize; - } - public void setHeight(int height) { - fHeight = height; - } - public void cleanLine(int line) { - if(isInWindow(line)) - fData.cleanLine(line-fWindowStartLine); - } - public int getCursorColumn() { - return fData.getCursorColumn(); - } - public int getCursorLine() { - return fData.getCursorLine(); - } - public void setCursorColumn(int column) { - fData.setCursorColumn(column); - } - public void setCursorLine(int line) { - fData.setCursorLine(line); - } - public boolean isWrappedLine(int line) { - if(isInWindow(line)) - return fData.isWrappedLine(line - fWindowStartLine); - return false; - } - public void setWrappedLine(int line) { - if(isInWindow(line)) - fData.setWrappedLine(line - fWindowStartLine); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/preferences/ITerminalConstants.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/preferences/ITerminalConstants.java deleted file mode 100644 index 907c79d..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/preferences/ITerminalConstants.java +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Martin Oberhuber (Wind River) - [378691][api] push Preferences into the Widget - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.preferences; - -/** - * Constants for Terminal Preferences. - * - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - */ -public interface ITerminalConstants { - - public static final String PREF_HAS_MIGRATED = "TerminalPref.migrated"; //$NON-NLS-1$ - - public static final String PREF_BUFFERLINES = "TerminalPrefBufferLines"; //$NON-NLS-1$ - public static final String PREF_INVERT_COLORS = "TerminalPrefInvertColors"; //$NON-NLS-1$ - public static final int DEFAULT_BUFFERLINES = 1000; - public static final boolean DEFAULT_INVERT_COLORS = false; - - public static final String FONT_DEFINITION = "terminal.views.view.font.definition"; //$NON-NLS-1$ - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/preferences/TerminalPreferenceInitializer.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/preferences/TerminalPreferenceInitializer.java deleted file mode 100644 index 920d5e4..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/preferences/TerminalPreferenceInitializer.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Martin Oberhuber (Wind River) - [378691][api] push Preferences into the Widget - * Martin Oberhuber (Wind River) - [436612] Restore Eclipse 3.4 compatibility - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.preferences; - -import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer; -import org.eclipse.core.runtime.preferences.DefaultScope; -import org.eclipse.core.runtime.preferences.IEclipsePreferences; -import org.eclipse.tm.internal.terminal.control.impl.TerminalPlugin; - -/** - * Terminal Preference Initializer. - * - * @noextend This class is not intended to be subclassed by clients. - * @noinstantiate This class is not intended to be instantiated by clients. - * @noreference This class is not intended to be referenced by clients. - */ -public class TerminalPreferenceInitializer extends AbstractPreferenceInitializer { - - public TerminalPreferenceInitializer() { - } - - public void initializeDefaultPreferences() { - //DefaultScope.INSTANCE was added in Eclipse 3.7 - IEclipsePreferences defaultPrefs = DefaultScope.INSTANCE.getNode(TerminalPlugin.PLUGIN_ID); - defaultPrefs.putBoolean(ITerminalConstants.PREF_INVERT_COLORS, ITerminalConstants.DEFAULT_INVERT_COLORS); - defaultPrefs.putInt(ITerminalConstants.PREF_BUFFERLINES, ITerminalConstants.DEFAULT_BUFFERLINES); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/preferences/TerminalPreferencePage.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/preferences/TerminalPreferencePage.java deleted file mode 100644 index 89a2c8f..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/preferences/TerminalPreferencePage.java +++ /dev/null @@ -1,75 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following Wind River employees contributed to the Terminal component - * that contains this file: Chris Thew, Fran Litterio, Stephen Lamb, - * Helmut Haigermoser and Ted Williams. - * - * Contributors: - * Michael Scharf (Wind River) - split into core, view and connector plugins - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Martin Oberhuber (Wind River) - [378691][api] push Preferences into the Widget - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.preferences; - -import org.eclipse.jface.preference.BooleanFieldEditor; -import org.eclipse.jface.preference.FieldEditorPreferencePage; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.preference.IntegerFieldEditor; -import org.eclipse.tm.internal.terminal.control.impl.TerminalMessages; -import org.eclipse.tm.internal.terminal.control.impl.TerminalPlugin; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchPreferencePage; - -/** - * Terminal Preference Page. - * - * @noextend This class is not intended to be subclassed by clients. - * @noinstantiate This class is not intended to be instantiated by clients. - * @noreference This class is not intended to be referenced by clients. - */ -public class TerminalPreferencePage extends FieldEditorPreferencePage implements - IWorkbenchPreferencePage { - protected BooleanFieldEditor fInvertColors; - - protected IntegerFieldEditor fEditorBufferSize; - - public TerminalPreferencePage() { - super(GRID); - } - protected void createFieldEditors() { - setupPage(); - } - public void init(IWorkbench workbench) { - // do nothing - } - protected void setupPage() { - setupData(); - setupEditors(); - } - protected void setupData() { - TerminalPlugin plugin; - IPreferenceStore preferenceStore; - - plugin = TerminalPlugin.getDefault(); - preferenceStore = plugin.getPreferenceStore(); - setPreferenceStore(preferenceStore); - } - protected void setupEditors() { - fInvertColors = new BooleanFieldEditor( - ITerminalConstants.PREF_INVERT_COLORS, TerminalMessages.INVERT_COLORS, - getFieldEditorParent()); - fEditorBufferSize = new IntegerFieldEditor(ITerminalConstants.PREF_BUFFERLINES, - TerminalMessages.BUFFERLINES, getFieldEditorParent()); - - fEditorBufferSize.setValidRange(0, Integer.MAX_VALUE); - - addField(fInvertColors); - addField(fEditorBufferSize); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/AbstractSettingsPage.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/AbstractSettingsPage.java deleted file mode 100644 index 501f45f..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/AbstractSettingsPage.java +++ /dev/null @@ -1,181 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.provisional.api; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.jface.dialogs.IMessageProvider; -import org.eclipse.jface.fieldassist.ControlDecoration; -import org.eclipse.jface.fieldassist.FieldDecoration; -import org.eclipse.jface.fieldassist.FieldDecorationRegistry; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Control; - -/** - * Abstract settings page providing a common implementation of the listener handling. - */ -public abstract class AbstractSettingsPage implements ISettingsPage, IMessageProvider { - // A message associated with the control. - private String message = null; - - // The message type of the associated message. - private int messageType = IMessageProvider.NONE; - - // Reference to the listener - private final ListenerList listeners = new ListenerList(); - - // Flag to control the control decorations - private boolean hasDecoration = false; - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage#addListener(org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage.Listener) - */ - public void addListener(Listener listener) { - Assert.isNotNull(listener); - listeners.add(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage#removeListener(org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage.Listener) - */ - public void removeListener(Listener listener) { - Assert.isNotNull(listener); - listeners.remove(listener); - } - - /** - * Fire the listeners for the given control. - * - * @param control The control or null. - */ - public void fireListeners(Control control) { - Object[] list = listeners.getListeners(); - for (int i = 0; i < list.length; i++) { - Object l = list[i]; - if (!(l instanceof Listener)) continue; - ((Listener)l).onSettingsPageChanged(control); - } - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.IMessageProvider#getMessage() - */ - public final String getMessage() { - return message; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.IMessageProvider#getMessageType() - */ - public final int getMessageType() { - return messageType; - } - - /** - * Set the message and the message type. - * - * @param message The message or null. - * @param messageType The type of the message (NONE, INFORMATION, WARNING, ERROR). - */ - public final void setMessage(String message, int messageType) { - this.message = message; - this.messageType = messageType; - } - - /** - * Sets if or if not the settings panel widgets will have control decorations - * or not. The method has effect only if called before {@link #createControl(org.eclipse.swt.widgets.Composite)}. - * - * @param value True if the panel widgets have control decorations, false otherwise. - */ - public final void setHasControlDecoration(boolean value) { - this.hasDecoration = value; - } - - /** - * Returns if or if not the settings panel widgets will have control - * decorations or not. - * - * @return True if the panel widgets have control decorations, false otherwise. - */ - protected final boolean hasControlDecoration() { - return hasDecoration; - } - - /** - * Creates a new instance of a {@link ControlDecoration} object associated with - * the given control. The method is called after the control has been created. - * - * @param control The control. Must not be null. - * @return The control decoration object instance. - */ - protected final ControlDecoration createControlDecoration(Control control) { - Assert.isNotNull(control); - if (!hasDecoration) return null; - ControlDecoration controlDecoration = new ControlDecoration(control, getControlDecorationPosition()); - controlDecoration.setShowOnlyOnFocus(false); - control.setData("controlDecoration", controlDecoration); //$NON-NLS-1$ - return controlDecoration; - } - - /** - * Returns the control decoration position. The default is - * {@link SWT#TOP} | {@link SWT#LEFT}. - * - * @return The control position. - */ - protected int getControlDecorationPosition() { - return SWT.TOP | SWT.LEFT; - } - - /** - * Updates the control decoration of the given control to represent the given message - * and message type. If the message is null or the message type is - * {@link IMessageProvider#NONE} no decoration will be shown. - * - * @param control The control. Must not be null. - * @param message The message. - * @param messageType The message type. - */ - protected final void updateControlDecoration(Control control, String message, int messageType) { - Assert.isNotNull(control); - - ControlDecoration controlDecoration = (ControlDecoration)control.getData("controlDecoration"); //$NON-NLS-1$ - if (controlDecoration != null) { - // The description is the same as the message - controlDecoration.setDescriptionText(message); - - // The icon depends on the message type - FieldDecorationRegistry registry = FieldDecorationRegistry.getDefault(); - - // Determine the id of the decoration to show - String decorationId = FieldDecorationRegistry.DEC_INFORMATION; - if (messageType == IMessageProvider.ERROR) { - decorationId = FieldDecorationRegistry.DEC_ERROR; - } else if (messageType == IMessageProvider.WARNING) { - decorationId = FieldDecorationRegistry.DEC_WARNING; - } - - // Get the field decoration - FieldDecoration fieldDeco = registry.getFieldDecoration(decorationId); - if (fieldDeco != null) { - controlDecoration.setImage(fieldDeco.getImage()); - } - - if (message == null || messageType == IMessageProvider.NONE) { - controlDecoration.hide(); - } - else { - controlDecoration.show(); - } - } - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ISettingsPage.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ISettingsPage.java deleted file mode 100644 index a00d71d..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ISettingsPage.java +++ /dev/null @@ -1,80 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.provisional.api; - -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; - -/** - * @author Michael Scharf - * - * TODO: Michael Scharf: provide a long description of a wizard - * TODO: Michael Scharf: allow multiple pages to be generated - *

            - * EXPERIMENTAL. This class or interface has been added as - * part of a work in progress. There is no guarantee that this API will - * work or that it will remain the same. Please do not use this API without - * consulting with the Target Management team. - *

            - */ -public interface ISettingsPage { - - public interface Listener { - - /** - * Invoked by settings page controls to signal that the settings page - * changed and page container may update their state. - * - * @param control The control which triggered the event or null - */ - public void onSettingsPageChanged(Control control); - } - - /** - * Create a page to be shown in a dialog or wizard to setup the connection. - * @param parent - */ - void createControl(Composite parent); - - /** - * Called before the page is shown. Loads the state from the {@link ITerminalConnector}. - */ - void loadSettings(); - - /** - * Called when the OK button is pressed. - */ - void saveSettings(); - - /** - * @return true if the - */ - boolean validateSettings(); - - /** - * Adds the given listener. - *

            - * Has not effect if the same listener is already registered. - * - * @param listener The listener. Must not be null. - */ - public void addListener(Listener listener); - - /** - * Removes the given listener. - *

            - * Has no effect if the same listener was not registered. - * - * @param listener The listener. Must not be null. - */ - public void removeListener(Listener listener); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ISettingsStore.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ISettingsStore.java deleted file mode 100644 index b7dd859..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ISettingsStore.java +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.provisional.api; - -/** - * A simple interface to a store to persist the state of a connection. - * - * @author Michael Scharf - *

            - * EXPERIMENTAL. This class or interface has been added as - * part of a work in progress. There is no guarantee that this API will - * work or that it will remain the same. Please do not use this API without - * consulting with the Target Management team. - *

            - */ -public interface ISettingsStore { - /** - * @param key alpha numeric key, may contain dots (.) - * @return value - */ - String get(String key); - - /** - * @param key alpha numeric key, may contain dots (.) - * @param defaultValue - * @return the value or the default - */ - String get(String key, String defaultValue); - - /** - * Save a string value - * @param key alpha numeric key, may contain dots (.) - * @param value - */ - void put(String key, String value); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalConnector.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalConnector.java deleted file mode 100644 index 242726e..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalConnector.java +++ /dev/null @@ -1,147 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Martin Oberhuber (Wind River) - [261486][api][cleanup] Mark @noimplement interfaces as @noextend - * Uwe Stieber (Wind River) - [282996] [terminal][api] Add "hidden" attribute to terminal connector extension point - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.provisional.api; - -import java.io.OutputStream; - -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl; - -/** - * A contributed connection type to manage a single connection. - * - * Implementations of this class are contributed through the - * org.eclipse.tm.terminal.control.connectors extension point. This - * class gives access to the static markup of a terminal connector extension as - * well as providing the lifecycle management for the dynamically loaded - * {@link TerminalConnectorImpl} instance, which performs the actual - * communications. This pattern allows for lazy initialization, bundle - * activation and class loading of the actual {@link TerminalConnectorImpl} - * instance. - * - * Clients can get terminal connector instances from the - * {@link TerminalConnectorExtension} class, or from - * {@link ITerminalViewControl#getTerminalConnector()} when running inside an - * active terminal widget. - * - * @noimplement This interface is not intended to be implemented by clients. - * @noextend This interface is not intended to be extended by clients. - * - * @author Michael Scharf - *

            - * EXPERIMENTAL. This class or interface has been added - * as part of a work in progress. There is no guarantee that this API - * will work or that it will remain the same. Please do not use this API - * without consulting with the Target Management team. - *

            - */ -public interface ITerminalConnector extends IAdaptable { - /** - * @return an ID of this connector. The id from the plugin.xml. - * @since org.eclipse.tm.terminal 2.0 - */ - String getId(); - - /** - * @return null the name (as specified in the plugin.xml) - * @since org.eclipse.tm.terminal 2.0 - */ - String getName(); - - /** - * @return True if the connector is not visible in user - * selections. - * @since org.eclipse.tm.terminal 3.0.1 - */ - boolean isHidden(); - - /** - * @return true if the {@link TerminalConnectorImpl} has been initialized. - * If there was an initialization error, {@link #getInitializationErrorMessage()} - * returns the error message. - * @since org.eclipse.tm.terminal 2.0 - */ - boolean isInitialized(); - - /** - * This method initializes the connector if it is not initialized! - * If the connector was initialized successfully, null is - * returned. Otherwise an error message describing the problem is returned. - * @return null or a localized error message. - * @since org.eclipse.tm.terminal 2.0 - */ - String getInitializationErrorMessage(); - - /** - * Connect using the current state of the settings. - * @param control Used to inform the UI about state changes and messages from the connection. - */ - void connect(ITerminalControl control); - - /** - * Disconnect if connected. Else do nothing. - */ - void disconnect(); - - /** - * @return true if a local echo is needed. - * TODO:Michael Scharf: this should be handed within the connection.... - */ - boolean isLocalEcho(); - - /** - * Notify the remote site that the size of the terminal has changed. - * @param newWidth - * @param newHeight - */ - void setTerminalSize(int newWidth, int newHeight); - - /** - * @return the terminal to remote stream (bytes written to this stream will - * be sent to the remote site). For the stream in the other direction (remote to - * terminal see {@link ITerminalControl#getRemoteToTerminalOutputStream()} - * @since org.eclipse.tm.terminal 2.0 - */ - OutputStream getTerminalToRemoteStream(); - - /** - * Load the state of this connection. Is typically called before - * {@link #connect(ITerminalControl)}. - * - * @param store a string based data store. Short keys like "foo" can be used to - * store the state of the connection. - */ - void load(ISettingsStore store); - - /** - * When the view or dialog containing the terminal is closed, - * the state of the connection is saved into the settings store store - * @param store - */ - void save(ISettingsStore store); - - /** - * Set or reset the settings store to the default values. - */ - void setDefaultSettings(); - - /** - * @return A string that represents the settings of the connection. This representation - * may be shown in the status line of the terminal view. - */ - String getSettingsSummary(); - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalControl.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalControl.java deleted file mode 100644 index 79b3cb8..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalControl.java +++ /dev/null @@ -1,160 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Martin Oberhuber (Wind River) - [204796] Terminal should allow setting the encoding to use - * Martin Oberhuber (Wind River) - [261486][api][cleanup] Mark @noimplement interfaces as @noextend - * Anton Leherbauer (Wind River) - [433751] Add option to enable VT100 line wrapping mode - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.provisional.api; - -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; - -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Shell; - -/** - * Represents the terminal view as seen by a terminal connection. - *

            - * EXPERIMENTAL. This class or interface has been added as part - * of a work in progress. There is no guarantee that this API will work or that - * it will remain the same. Please do not use this API without consulting with - * the Target Management team. - *

            - * - * @author Michael Scharf - * @noimplement This interface is not intended to be implemented by clients. - * @noextend This interface is not intended to be extended by clients. - */ -public interface ITerminalControl { - - /** - * @return the current state of the connection - */ - TerminalState getState(); - - /** - * @param state - */ - void setState(TerminalState state); - - /** - * Setup the terminal control within the given parent composite. - * - * @param parent The parent composite. Must not be null. - */ - void setupTerminal(Composite parent); - - /** - * A shell to show dialogs. - * @return the shell in which the terminal is shown. - */ - Shell getShell(); - - /** - * Set the encoding that the Terminal uses to decode bytes from the - * Terminal-to-remote-Stream into Unicode Characters used in Java; or, to - * encode Characters typed by the user into bytes sent over the wire to the - * remote. - * - * By default, the local Platform Default Encoding is used. Also note that - * the encoding must not be applied in case the terminal stream is processed - * by some data transfer protocol which requires binary data. - * - * Validity of the encoding set here is not checked. Since some encodings do - * not cover the entire range of Unicode characters, it can happen that a - * particular Unicode String typed in by the user can not be encoded into a - * byte Stream with the encoding specified. and UnsupportedEncodingException - * will be thrown in this case at the time the String is about to be - * processed. - * - * The concrete encoding to use can either be specified manually by a user, - * by means of a dialog, or a connector can try to obtain it automatically - * from the remote side e.g. by evaluating an environment variable such as - * LANG on UNIX systems. - * - * @since org.eclipse.tm.terminal 2.0 - */ - void setEncoding(String encoding) throws UnsupportedEncodingException; - - /** - * Return the current encoding. That's interesting when the previous - * setEncoding() call failed and the fallback default encoding should be - * queried, such that e.g. a combobox with encodings to choose can be - * properly initialized. - * - * @return the current Encoding of the Terminal. - * @since org.eclipse.tm.terminal 2.0 - */ - String getEncoding(); - - /** - * Show a text in the terminal. If puts newlines at the beginning and the - * end. - * - * @param text TODO: Michael Scharf: Is this really needed? - */ - void displayTextInTerminal(String text); - - /** - * @return a stream used to write to the terminal. Any bytes written to this - * stream appear in the terminal or are interpreted by the emulator as - * control sequences. The stream in the opposite direction, terminal - * to remote is in {@link ITerminalConnector#getTerminalToRemoteStream()}. - */ - OutputStream getRemoteToTerminalOutputStream(); - - /** - * Set the title of the terminal view. - * @param title - */ - void setTerminalTitle(String title); - - /** - * Show an error message during connect. - * @param msg - * TODO: Michael Scharf: Should be replaced by a better error notification mechanism! - */ - void setMsg(String msg); - - /** - * Sets if or if not the terminal view control should try to reconnect - * the terminal connection if the user hits ENTER in a closed terminal. - *

            - * Reconnect on ENTER if terminal is closed is enabled by default. - * - * @param on True to enable the reconnect, false to disable it. - */ - void setConnectOnEnterIfClosed(boolean on); - - /** - * Returns if or if not the terminal view control should try to reconnect - * the terminal connection if the user hits ENTER in a closed terminal. - * - * @return True the reconnect is enabled, false if disabled. - */ - boolean isConnectOnEnterIfClosed(); - - /** - * Enables VT100 line wrapping mode (default is off). - * This corresponds to the VT100 'eat_newline_glitch' terminal capability. - * If enabled, writing to the rightmost column does not cause - * an immediate wrap to the next line. Instead the line wrap occurs on the - * next output character. - * - * @param enable whether to enable or disable VT100 line wrapping mode - */ - void setVT100LineWrapping(boolean enable); - - /** - * @return whether VT100 line wrapping mode is enabled - */ - boolean isVT100LineWrapping(); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/Logger.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/Logger.java deleted file mode 100644 index 437935f..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/Logger.java +++ /dev/null @@ -1,195 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Fran Litterio (Wind River) - initial API and implementation - * Ted Williams (Wind River) - refactored into org.eclipse namespace - * Michael Scharf (Wind River) - split into core, view and connector plugins - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.provisional.api; - -import java.io.FileOutputStream; -import java.io.PrintStream; - -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.tm.internal.terminal.control.impl.TerminalPlugin; - -/** - * A simple logger class. Every method in this class is static, so they can be - * called from both class and instance methods. To use this class, write code - * like this: - *

            - * - *

            - * Logger.log("something has happened");
            - * Logger.log("counter is " + counter);
            - * 
            - * - * @author Fran Litterio - *

            - * EXPERIMENTAL. This class or interface has been added as - * part of a work in progress. There is no guarantee that this API will - * work or that it will remain the same. Please do not use this API without - * consulting with the Target Management team. - *

            - */ -public final class Logger { - public static final String TRACE_DEBUG_LOG = "org.eclipse.tm.terminal.control/debug/log"; //$NON-NLS-1$ - public static final String TRACE_DEBUG_LOG_CHAR = "org.eclipse.tm.terminal.control/debug/log/char"; //$NON-NLS-1$ - public static final String TRACE_DEBUG_LOG_VT100BACKEND = "org.eclipse.tm.terminal.control/debug/log/VT100Backend"; //$NON-NLS-1$ - - private static PrintStream logStream; - - static { - // Any of the three known debugging options turns on the creation of the log file - boolean createLogFile = TerminalPlugin.isOptionEnabled(TRACE_DEBUG_LOG) - || TerminalPlugin.isOptionEnabled(TRACE_DEBUG_LOG_CHAR) - || TerminalPlugin.isOptionEnabled(TRACE_DEBUG_LOG_VT100BACKEND); - - // Log only if tracing is enabled - if (createLogFile && TerminalPlugin.getDefault() != null) { - IPath logFile = Platform.getStateLocation(TerminalPlugin.getDefault().getBundle()); - if (logFile != null && logFile.toFile().isDirectory()) { - logFile = logFile.append("tmterminal.log"); //$NON-NLS-1$ - try { - logStream = new PrintStream(new FileOutputStream(logFile.toFile(), true)); - } catch (Exception ex) { - logStream = System.err; - logStream.println("Exception when opening log file -- logging to stderr!"); //$NON-NLS-1$ - ex.printStackTrace(logStream); - } - } - } - } - - /** - * Encodes a String such that non-printable control characters are - * converted into user-readable escape sequences for logging. - * @param message String to encode - * @return encoded String - */ - public static final String encode(String message) { - boolean encoded = false; - StringBuffer buf = new StringBuffer(message.length()+32); - for (int i=0; i=' ' && c<'\u007f') { - buf.append(c); - } else if (c <= '\u00ff') { - buf.append('\\'); buf.append('x'); - buf.append(Integer.toHexString(c)); - encoded=true; - } else { - buf.append('\\'); buf.append('u'); - if (c<='\u0fff') { - buf.append('0'); - } - buf.append(Integer.toHexString(c)); - encoded=true; - } - } - } - if (encoded) { - return buf.toString(); - } - return message; - } - - /** - * Checks if logging is enabled. - * @return true if logging is enabled. - */ - public static final boolean isLogEnabled() { - return (logStream!=null); - } - - /** - * Logs the specified message. Do not append a newline to parameter - * message. This method does that for you. - * - * @param message A String containing the message to log. - */ - public static final void log(String message) { - if (logStream != null) { - // Read my own stack to get the class name, method name, and line - // number of - // where this method was called. - - StackTraceElement caller = new Throwable().getStackTrace()[1]; - int lineNumber = caller.getLineNumber(); - String className = caller.getClassName(); - String methodName = caller.getMethodName(); - className = className.substring(className.lastIndexOf('.') + 1); - - logStream.println(className + "." + methodName + ":" + lineNumber + ": " + message); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ - logStream.flush(); - } - } - - /** - * Writes a stack trace for an exception to both Standard Error and to the - * log file. - */ - public static final void logException(Exception ex) { - // log in eclipse error log - if (TerminalPlugin.getDefault() != null) { - TerminalPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, TerminalPlugin.PLUGIN_ID, IStatus.OK, ex.getMessage(), ex)); - } else { - ex.printStackTrace(); - } - // Additional Tracing for debug purposes: - // Read my own stack to get the class name, method name, and line number - // of where this method was called - if(logStream!=null) { - StackTraceElement caller = new Throwable().getStackTrace()[1]; - int lineNumber = caller.getLineNumber(); - String className = caller.getClassName(); - String methodName = caller.getMethodName(); - className = className.substring(className.lastIndexOf('.') + 1); - - PrintStream tmpStream = System.err; - - if (logStream != null) { - tmpStream = logStream; - } - - tmpStream.println(className - + "." + methodName + ":" + lineNumber + ": " + //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ - "Caught exception: " + ex); //$NON-NLS-1$ - ex.printStackTrace(tmpStream); - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/NullSettingsStore.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/NullSettingsStore.java deleted file mode 100644 index e86f157..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/NullSettingsStore.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.provisional.api; - -/** - * A settings store implementation doing nothing. - */ -public class NullSettingsStore implements ISettingsStore { - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore#get(java.lang.String) - */ - @Override - public String get(String key) { - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore#get(java.lang.String, java.lang.String) - */ - @Override - public String get(String key, String defaultValue) { - return defaultValue; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore#put(java.lang.String, java.lang.String) - */ - @Override - public void put(String key, String value) { - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/TerminalConnectorExtension.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/TerminalConnectorExtension.java deleted file mode 100644 index fe494bc..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/TerminalConnectorExtension.java +++ /dev/null @@ -1,98 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Uwe Stieber (Wind River) - [282996] [terminal][api] Add "hidden" attribute to terminal connector extension point - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.provisional.api; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.core.runtime.IConfigurationElement; -import org.eclipse.core.runtime.RegistryFactory; -import org.eclipse.tm.internal.terminal.connector.TerminalConnector; -import org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl; - -/** - * A factory to get {@link ITerminalConnector} instances. - * - * @author Michael Scharf - * - * @noextend This class is not intended to be subclassed by clients. - * @noinstantiate This class is not intended to be instantiated by clients. - * - *

            - * EXPERIMENTAL. This class or interface has been added as - * part of a work in progress. There is no guarantee that this API will work or - * that it will remain the same. Please do not use this API without consulting - * with the Target Management - * team. - *

            - */ -public class TerminalConnectorExtension { - static private ITerminalConnector makeConnector(final IConfigurationElement config) { - String id = config.getAttribute("id"); //$NON-NLS-1$ - if(id==null || id.length()==0) - id=config.getAttribute("class"); //$NON-NLS-1$ - String name= config.getAttribute("name"); //$NON-NLS-1$ - if(name==null || name.length()==0) { - name=id; - } - String hidden = config.getAttribute("hidden"); //$NON-NLS-1$ - boolean isHidden = hidden != null ? new Boolean(hidden).booleanValue() : false; - TerminalConnector.Factory factory=new TerminalConnector.Factory(){ - public TerminalConnectorImpl makeConnector() throws Exception { - return (TerminalConnectorImpl)config.createExecutableExtension("class"); //$NON-NLS-1$ - }}; - return new TerminalConnector(factory,id,name, isHidden); - } - - /** - * Return a specific terminal connector for a given connector id. The - * terminal connector is not yet instantiated to any real connection. - * - * @param id the id of the terminal connector in the - * org.eclipse.tm.terminal.control.connectors - * extension point - * @return a new ITerminalConnector with id or null if there - * is no extension with that id. - * @since org.eclipse.tm.terminal 2.0 - */ - public static ITerminalConnector makeTerminalConnector(String id) { - IConfigurationElement[] config = RegistryFactory.getRegistry().getConfigurationElementsFor("org.eclipse.tm.terminal.control.connectors"); //$NON-NLS-1$ - for (int i = 0; i < config.length; i++) { - if(id.equals(config[i].getAttribute("id"))) { //$NON-NLS-1$ - return makeConnector(config[i]); - } - } - return null; - } - /** - * Return a list of available terminal connectors (connection types). - * - * The terminal connectors returned are not yet instantiated to any real - * connection. Each terminal connector can connect to one remote system at a - * time. - * - * @return a new list of {@link ITerminalConnector} instances defined in the - * org.eclipse.tm.terminal.control.connectors - * extension point - * @since org.eclipse.tm.terminal 2.0 return value is ITerminalConnector[] - */ - public static ITerminalConnector[] makeTerminalConnectors() { - IConfigurationElement[] config = RegistryFactory.getRegistry().getConfigurationElementsFor("org.eclipse.tm.terminal.control.connectors"); //$NON-NLS-1$ - List result=new ArrayList(); - for (int i = 0; i < config.length; i++) { - result.add(makeConnector(config[i])); - } - return result.toArray(new ITerminalConnector[result.size()]); - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/TerminalState.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/TerminalState.java deleted file mode 100644 index 14051ae..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/TerminalState.java +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - fixed copyright headers and beautified - * Michael Scharf (Wind River) - [262996] get rid of TerminalState.OPENED - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.provisional.api; - -/** - * Represent the sate of a terminal connection. - * In java 1.5 this would be an enum. - * @author Michael Scharf - * - *

            - * EXPERIMENTAL. This class or interface has been added as - * part of a work in progress. There is no guarantee that this API will - * work or that it will remain the same. Please do not use this API without - * consulting with the Target Management team. - *

            - */ -public class TerminalState { - /** - * The terminal is not connected. - */ - public final static TerminalState CLOSED=new TerminalState("CLOSED"); //$NON-NLS-1$ - - /** - * The terminal is about to connect. - */ - public final static TerminalState CONNECTING=new TerminalState("CONNECTING..."); //$NON-NLS-1$ - - /** - * The terminal is connected. - */ - public final static TerminalState CONNECTED=new TerminalState("CONNECTED"); //$NON-NLS-1$ - - private final String fState; - - public TerminalState(String state) { - fState = state; - } - - public String toString() { - return fState; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/provider/TerminalConnectorImpl.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/provider/TerminalConnectorImpl.java deleted file mode 100644 index a358335..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/provisional/api/provider/TerminalConnectorImpl.java +++ /dev/null @@ -1,152 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - [225853][api] Provide more default functionality in TerminalConnectorImpl - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.provisional.api.provider; - -import java.io.OutputStream; - -import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; -import org.eclipse.tm.internal.terminal.provisional.api.Logger; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; - -/** - * Abstract base class for all terminal connector implementations to be - * registered via the org.eclipse.tm.terminal.control.connectors - * extension point. - * - * @since org.eclipse.tm.terminal 2.0 - */ -public abstract class TerminalConnectorImpl { - - /** - * The TerminalControl associated with this connector. - * Required for advertising state changes when needed. - */ - protected ITerminalControl fControl; - - /** - * Initialize this connector. This is called once after the constructor, in - * order to perform any required initializations such as loading required - * native libraries. Any work that may lead to runtime exceptions should be - * done in this method rather than in the constructor. - * - * @throws Exception when the connector fails to initialize (due to missing - * required libraries, for instance). - */ - public void initialize() throws Exception { - } - - /** - * Connect using the current state of the settings. - * - * This method is designed to be overridden by actual implementations, in - * order to open the streams required for communicating with the remote - * side. Extenders must call super.connect(control) as the - * first thing they are doing. - * - * @param control Used to inform the UI about state changes and messages - * from the connection. - */ - public void connect(ITerminalControl control) { - Logger.log("entered."); //$NON-NLS-1$ - fControl = control; - } - - /** - * Disconnect if connected. Else do nothing. Has to set the state of the - * {@link ITerminalControl} when finished disconnecting. - */ - public final void disconnect() { - Logger.log("entered."); //$NON-NLS-1$ - doDisconnect(); - fControl.setState(TerminalState.CLOSED); - } - - /** - * Disconnect if connected. Else do nothing. Clients should override to - * perform any extra work needed for disconnecting. - */ - protected void doDisconnect() { - // Do nothing by default - } - - /** - * @return the terminal to remote stream (bytes written to this stream will - * be sent to the remote site). For the stream in the other direction (remote to - * terminal see {@link ITerminalControl#getRemoteToTerminalOutputStream()} - */ - abstract public OutputStream getTerminalToRemoteStream(); - - /** - * @return A string that represents the settings of the connection. This representation - * may be shown in the status line of the terminal view. - */ - abstract public String getSettingsSummary(); - - /** - * Test if local echo is needed. The default implementation returns - * false. Override to modify this behavior. - * - * @return true if a local echo is needed. TODO:Michael Scharf: this should - * be handed within the connection.... - */ - public boolean isLocalEcho() { - return false; - } - - /** - * Set or reset the settings store to the default values. - */ - public void setDefaultSettings() { - // do nothing by default - } - - /** - * Load the state or settings of this connection. Is typically called before - * {@link #connect(ITerminalControl)}. - * - * Connectors that have nothing to configure do not need to implement this. - * Those terminals that do have configuration need to override this method - * to load settings. - * - * @param store a string based data store. Short keys like "foo" can be used - * to store the state of the connection. - */ - public void load(ISettingsStore store) { - // do nothing by default - } - - /** - * When the view or dialog containing the terminal is closed, the state of - * the connection is saved into the settings store store. - * - * Connectors that have no state or settings to persist do not need to - * override this. Others should override to persist their settings. - * - * @param store the store for persisting settings. - */ - public void save(ISettingsStore store) { - // do nothing by default - } - - /** - * Notify the remote site that the size of the terminal has changed. - * - * Concrete connectors should override this if they have the possibility to - * inform the remote about changed terminal size. - * - * @param newWidth the new width in characters. - * @param newHeight the new height in characters. - */ - public void setTerminalSize(int newWidth, int newHeight) { - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/AbstractTextCanvasModel.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/AbstractTextCanvasModel.java deleted file mode 100644 index 7991014..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/AbstractTextCanvasModel.java +++ /dev/null @@ -1,348 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - [168197] Fix Terminal for CDC-1.1/Foundation-1.1 - * Anton Leherbauer (Wind River) - [219589] Copy an entire line selection - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.textcanvas; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.eclipse.swt.graphics.Point; -import org.eclipse.tm.terminal.model.ITerminalTextDataReadOnly; -import org.eclipse.tm.terminal.model.ITerminalTextDataSnapshot; - -abstract public class AbstractTextCanvasModel implements ITextCanvasModel { - protected List fListeners = new ArrayList(); - private int fCursorLine; - private int fCursorColumn; - private boolean fShowCursor; - private long fCursorTime; - private boolean fCursorIsEnabled; - private final ITerminalTextDataSnapshot fSnapshot; - private int fLines; - - private int fSelectionStartLine=-1; - private int fSeletionEndLine; - private int fSelectionStartCoumn; - private int fSelectionEndColumn; - private ITerminalTextDataSnapshot fSelectionSnapshot; - private String fCurrentSelection=""; //$NON-NLS-1$ - private final Point fSelectionAnchor=new Point(0,0); - /** - * do not update while update is running - */ - boolean fInUpdate; - private int fCols; - - public AbstractTextCanvasModel(ITerminalTextDataSnapshot snapshot) { - fSnapshot=snapshot; - fLines=fSnapshot.getHeight(); - } - public void addCellCanvasModelListener(ITextCanvasModelListener listener) { - fListeners.add(listener); - } - - public void removeCellCanvasModelListener(ITextCanvasModelListener listener) { - fListeners.remove(listener); - } - - protected void fireCellRangeChanged(int x, int y, int width, int height) { - for (Iterator iter = fListeners.iterator(); iter.hasNext();) { - ITextCanvasModelListener listener = iter.next(); - listener.rangeChanged(x, y, width, height); - } - } - protected void fireDimensionsChanged( int width,int height) { - for (Iterator iter = fListeners.iterator(); iter.hasNext();) { - ITextCanvasModelListener listener = iter.next(); - listener.dimensionsChanged(width,height); - } - - } - protected void fireTerminalDataChanged() { - for (Iterator iter = fListeners.iterator(); iter.hasNext();) { - ITextCanvasModelListener listener = iter.next(); - listener.terminalDataChanged(); - } - - } - - public ITerminalTextDataReadOnly getTerminalText() { - return fSnapshot; - } - protected ITerminalTextDataSnapshot getSnapshot() { - return fSnapshot; - } - protected void updateSnapshot() { - if(!fInUpdate && fSnapshot.isOutOfDate()) { - fInUpdate=true; - try { - fSnapshot.updateSnapshot(false); - if(fSnapshot.hasTerminalChanged()) - fireTerminalDataChanged(); - // TODO why does hasDimensionsChanged not work?????? - // if(fSnapshot.hasDimensionsChanged()) - // fireDimensionsChanged(); - if(fLines!=fSnapshot.getHeight() || fCols!=fSnapshot.getWidth()) { - fireDimensionsChanged(fSnapshot.getWidth(),fSnapshot.getHeight()); - fLines=fSnapshot.getHeight(); - fCols=fSnapshot.getWidth(); - } - int y=fSnapshot.getFirstChangedLine(); - // has any line changed? - if(y=getSnapshot().getHeight()) { - cursorLine=getSnapshot().getHeight()-1; - cursorColumn=getSnapshot().getWidth()-1; - } - // has the cursor moved? - if(fCursorLine!=cursorLine || fCursorColumn!=cursorColumn) { - // hide the old cursor! - fShowCursor=false; - // clean the previous cursor - // bug 206363: paint also the char to the left and right of the cursor - see also below - int col=fCursorColumn; - int width=2; - if(col>0) { - col--; - width++; - } - fireCellRangeChanged(col, fCursorLine, width, 1); - // the cursor is shown when it moves! - fShowCursor=true; - fCursorTime=System.currentTimeMillis(); - fCursorLine=cursorLine; - fCursorColumn=cursorColumn; - // and draw the new cursor - fireCellRangeChanged(fCursorColumn, fCursorLine, 1, 1); - } else { - long t=System.currentTimeMillis(); - // TODO make the cursor blink time customisable - if(t-fCursorTime>500) { - fShowCursor=!fShowCursor; - fCursorTime=t; - // on some windows machines, there is some left - // over when updating the cursor . - // https://bugs.eclipse.org/bugs/show_bug.cgi?id=206363 - int col=fCursorColumn; - int width=2; - if(col>0) { - col--; - width++; - } - fireCellRangeChanged(col, fCursorLine, width, 1); - } - } - } - public void setVisibleRectangle(int startLine, int startCol, int height, int width) { - fSnapshot.setInterestWindow(Math.max(0,startLine), Math.max(1,height)); - update(); - } - protected void showCursor(boolean show) { - fShowCursor=true; - } - public void setCursorEnabled(boolean visible) { - fCursorTime=System.currentTimeMillis(); - fShowCursor=visible; - fCursorIsEnabled=visible; - fireCellRangeChanged(fCursorColumn, fCursorLine, 1, 1); - } - public boolean isCursorEnabled() { - return fCursorIsEnabled; - } - - public Point getSelectionEnd() { - if(fSelectionStartLine<0) - return null; - else - return new Point(fSelectionEndColumn, fSeletionEndLine); - } - - public Point getSelectionStart() { - if (fSelectionStartLine < 0) - return null; - else - return new Point(fSelectionStartCoumn,fSelectionStartLine); - } - public Point getSelectionAnchor() { - if(fSelectionStartLine<0) - return null; - return new Point(fSelectionAnchor.x,fSelectionAnchor.y); - } - public void setSelectionAnchor(Point anchor) { - fSelectionAnchor.x=anchor.x; - fSelectionAnchor.y=anchor.y; - } - - public void setSelection(int startLine, int endLine, int startColumn, int endColumn) { -// System.err.println(startLine+","+endLine+","+startColumn+","+endColumn); - doSetSelection(startLine, endLine, startColumn, endColumn); - fCurrentSelection=extractSelectedText(); - } - private void doSetSelection(int startLine, int endLine, int startColumn, int endColumn) { - assert(startLine<0 || startLine<=endLine); - if(startLine>=0) { - if(fSelectionSnapshot==null) { - fSelectionSnapshot=fSnapshot.getTerminalTextData().makeSnapshot(); - fSelectionSnapshot.updateSnapshot(true); - } - } else if(fSelectionSnapshot!=null) { - fSelectionSnapshot.detach(); - fSelectionSnapshot=null; - } - int oldStart=fSelectionStartLine; - int oldEnd=fSeletionEndLine; - fSelectionStartLine = startLine; - fSeletionEndLine = endLine; - fSelectionStartCoumn = startColumn; - fSelectionEndColumn = endColumn; - if(fSelectionSnapshot!=null) { - fSelectionSnapshot.setInterestWindow(0, fSelectionSnapshot.getHeight()); - } - int changedStart; - int changedEnd; - if(oldStart<0) { - changedStart=fSelectionStartLine; - changedEnd=fSeletionEndLine; - } else if(fSelectionStartLine<0) { - changedStart=oldStart; - changedEnd=oldEnd; - } else { - changedStart=Math.min(oldStart, fSelectionStartLine); - changedEnd=Math.max(oldEnd, fSeletionEndLine); - } - if(changedStart>=0) { - fireCellRangeChanged(0, changedStart, fSnapshot.getWidth(), changedEnd-changedStart+1); - } - } - - public boolean hasLineSelection(int line) { - if (fSelectionStartLine < 0) - return false; - else - return line >= fSelectionStartLine && line <= fSeletionEndLine; - } - - public String getSelectedText() { - return fCurrentSelection; - } - /** - * Calculates the currently selected text - * @return the currently selected text - */ - private String extractSelectedText() { - if(fSelectionStartLine<0 || fSelectionStartCoumn<0 || fSelectionSnapshot==null) - return ""; //$NON-NLS-1$ - StringBuffer buffer=new StringBuffer(); - for (int line = fSelectionStartLine; line <= fSeletionEndLine; line++) { - String text; - char[] chars=fSelectionSnapshot.getChars(line); - if(chars!=null) { - text=new String(chars); - if(line==fSeletionEndLine && fSelectionEndColumn >= 0) - text=text.substring(0, Math.min(fSelectionEndColumn+1,text.length())); - if(line==fSelectionStartLine) - text=text.substring(Math.min(fSelectionStartCoumn,text.length())); - // get rid of the empty space at the end of the lines - // text=text.replaceAll("\000+$",""); //$NON-NLS-1$//$NON-NLS-2$ - // - int i = text.length() - 1; - while (i >= 0 && text.charAt(i) == '\000') { - i--; - } - text = text.substring(0, i + 1); - // - // null means space - text=text.replace('\000', ' '); - } else { - text=""; //$NON-NLS-1$ - } - buffer.append(text); - if(line < fSeletionEndLine && !fSelectionSnapshot.isWrappedLine(line)) - buffer.append('\n'); - } - return buffer.toString(); - } - private void updateSelection() { - if (fSelectionSnapshot != null && fSelectionSnapshot.isOutOfDate()) { - fSelectionSnapshot.updateSnapshot(true); - // has the selection moved? - if (fSelectionSnapshot != null && fSelectionStartLine >= 0 && fSelectionSnapshot.getScrollWindowSize() > 0) { - int start = fSelectionStartLine + fSelectionSnapshot.getScrollWindowShift(); - int end = fSeletionEndLine + fSelectionSnapshot.getScrollWindowShift(); - if (start < 0) - if (end >= 0) - start = 0; - else - start = -1; - doSetSelection(start, end, fSelectionStartCoumn, fSelectionEndColumn); - } - // check if the content of the selection has changed. If the content has - // changed, clear the selection - if (fCurrentSelection.length()>0 && fSelectionSnapshot != null - && fSelectionSnapshot.getFirstChangedLine() <= fSeletionEndLine - && fSelectionSnapshot.getLastChangedLine() >= fSelectionStartLine) { - // has the selected text changed? - if (!fCurrentSelection.equals(extractSelectedText())) { - setSelection(-1, -1, -1, -1); - } - } - // update the observed window... - if (fSelectionSnapshot != null) - // todo make -1 to work! - fSelectionSnapshot.setInterestWindow(0, fSelectionSnapshot.getHeight()); - } - } - -} \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/GridCanvas.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/GridCanvas.java deleted file mode 100644 index 40ab4bf..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/GridCanvas.java +++ /dev/null @@ -1,232 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Anton Leherbauer (Wind River) - [294468] Fix scroller and text line rendering - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.textcanvas; - - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.ScrollBar; - -/** - * A Grid based Canvas. The canvas has rows and columns. - * CellPainting is done with the abstract method drawCell - */ -abstract public class GridCanvas extends VirtualCanvas { - /** width of a cell */ - private int fCellWidth; - /** height of a cell */ - private int fCellHeight; - - public GridCanvas(Composite parent, int style) { - super(parent, style); - addListener(SWT.MouseWheel, new Listener() { - public void handleEvent(Event event) { - if(getVerticalBar().isVisible()) { - int delta=-fCellHeight; - if(event.count<0) - delta=-delta; - scrollYDelta(delta); - } - event.doit=false; - } - }); - - } - - /** template method paint. - * iterates over all cells in the clipping rectangle and paints them. - */ - protected void paint(GC gc) { - Rectangle clipping=gc.getClipping(); - if(clipping.width==0 || clipping.height==0) - return; - Rectangle clientArea= getScreenRectInVirtualSpace(); - // Beginning coordinates - int xOffset=clientArea.x; - int yOffset=clientArea.y; - int colFirst=virtualXToCell(xOffset+clipping.x); - if(colFirst>getCols()) - colFirst=getCols(); - else if (colFirst < 0) { - colFirst = 0; - } - int rowFirst=virtualYToCell(yOffset+clipping.y); - // End coordinates - int colLast=virtualXToCell(xOffset+clipping.x+clipping.width+fCellWidth); - if(colLast>getCols()) - colLast=getCols(); - int rowLast=virtualYToCell(yOffset+clipping.y+clipping.height+fCellHeight); - if(rowLast>getRows()) - rowLast=getRows(); - // System.out.println(rowFirst+"->"+rowLast+" "+System.currentTimeMillis()); - // draw the cells - for(int row=rowFirst;row<=rowLast;row++) { - int cx=colFirst*fCellWidth-xOffset; - int cy=row*fCellHeight-yOffset; - drawLine(gc,row,cx,cy,colFirst,colLast); - } - paintUnoccupiedSpace(gc,clipping); - } - /** - * @param gc - * @param row the line to draw - * @param x coordinate on screen - * @param y coordinate on screen - * @param colFirst first column to draw - * @param colLast last column to draw - */ - abstract void drawLine(GC gc, int row, int x, int y, int colFirst, int colLast); - - abstract protected int getRows(); - abstract protected int getCols(); - - protected void setCellWidth(int cellWidth) { - fCellWidth = cellWidth; - getHorizontalBar().setIncrement(fCellWidth); - } - - public int getCellWidth() { - return fCellWidth; - } - - protected void setCellHeight(int cellHeight) { - fCellHeight = cellHeight; - getVerticalBar().setIncrement(fCellHeight); - } - - public int getCellHeight() { - return fCellHeight; - } - - int virtualXToCell(int x) { - return x/fCellWidth; - } - - int virtualYToCell(int y) { - return y/fCellHeight; - } - - protected Point screenPointToCell(int x, int y) { - x=screenXtoVirtual(x)/fCellWidth; - y=screenYtoVirtual(y)/fCellHeight; - return new Point(x,y); - } - - Point screenPointToCell(Point point) { - return screenPointToCell(point.x,point.y); - } - - protected Point cellToOriginOnScreen(int x, int y) { - x=virtualXtoScreen(fCellWidth*x); - y=virtualYtoScreen(fCellHeight*y); - return new Point(x,y); - } - - Point cellToOriginOnScreen(Point cell) { - return cellToOriginOnScreen(cell.x,cell.y); - } - - Rectangle getCellScreenRect(Point cell) { - return getCellScreenRect(cell.x,cell.y); - } - - Rectangle getCellScreenRect(int x, int y) { - x=fCellWidth*virtualXtoScreen(x); - y=fCellHeight*virtualYtoScreen(y); - return new Rectangle(x,y,fCellWidth,fCellHeight); - } - - protected Rectangle getCellVirtualRect(Point cell) { - return getCellVirtualRect(cell.x,cell.y); - } - - Rectangle getCellVirtualRect(int x, int y) { - x=fCellWidth*x; - y=fCellHeight*y; - return new Rectangle(x,y,fCellWidth,fCellHeight); - } - protected void viewRectangleChanged(int x, int y, int width, int height) { - int cellX=virtualXToCell(x); - int cellY=virtualYToCell(y); - // End coordinates - int xE=virtualXToCell(x+width); -// if(xE>getCols()) -// xE=getCols(); - int yE=virtualYToCell(y+height); -// if(yE>getRows()) -// yE=getRows(); - visibleCellRectangleChanged(cellX,cellY,xE-cellX,yE-cellY); - } - - /** - * Called when the viewed part has changed. - * Override when you need this information.... - * Is only called if the values change (well, almost) - * @param x origin of visible cells - * @param y origin of visible cells - * @param width number of cells visible in x direction - * @param height number of cells visible in y direction - */ - protected void visibleCellRectangleChanged(int x, int y, int width, int height) { - } - - protected void setVirtualExtend(int width, int height) { - int cellHeight = getCellHeight(); - if (cellHeight > 0) { - height -= height % cellHeight; - } - super.setVirtualExtend(width, height); - } - - protected void setVirtualOrigin(int x, int y) { - int cellHeight = getCellHeight(); - if (cellHeight > 0) { - int remainder = y % cellHeight; - if (remainder < 0) { - y -= (cellHeight + remainder); - } else { - y -= remainder; - } - } - super.setVirtualOrigin(x, y); - } - - protected void scrollY(ScrollBar vBar) { - int vSelection = vBar.getSelection (); - Rectangle bounds = getVirtualBounds(); - int y = -vSelection; - int cellHeight = getCellHeight(); - if (cellHeight > 0) { - int remainder = y % cellHeight; - if (remainder < 0) { - y -= (cellHeight + remainder); - } else { - y -= remainder; - } - } - int deltaY = y - bounds.y; - if(deltaY!=0) { - scrollSmart(0,deltaY); - setVirtualOrigin(bounds.x, bounds.y += deltaY); - } - if (-bounds.y + getRows() * getCellHeight() >= bounds.height) { - // scrolled to bottom - need to redraw bottom area - Rectangle clientRect = getClientArea(); - redraw(0, clientRect.height - fCellHeight, clientRect.width, fCellHeight, false); - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ILinelRenderer.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ILinelRenderer.java deleted file mode 100644 index e03946b..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ILinelRenderer.java +++ /dev/null @@ -1,37 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Anton Leherbauer (Wind River) - [294468] Fix scroller and text line rendering - * Martin Oberhuber (Wind River) - [265352][api] Allow setting fonts programmatically - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.textcanvas; - -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.GC; - -/** - * - */ -public interface ILinelRenderer { - int getCellWidth(); - int getCellHeight(); - void drawLine(ITextCanvasModel model, GC gc, int line, int x, int y, int colFirst, int colLast); - /** - * Update for a font change from the global JFace Registry. - */ - void onFontChange(); - /** - * Set a new font - * @param fontName Jface name of the new font - * @since 3.2 - */ - void updateFont(String fontName); - void setInvertedColors(boolean invert); - Color getDefaultBackgroundColor(); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModel.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModel.java deleted file mode 100644 index 1891c60..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModel.java +++ /dev/null @@ -1,84 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.textcanvas; - -import org.eclipse.swt.graphics.Point; -import org.eclipse.tm.terminal.model.ITerminalTextDataReadOnly; - -public interface ITextCanvasModel { - void addCellCanvasModelListener(ITextCanvasModelListener listener); - void removeCellCanvasModelListener(ITextCanvasModelListener listener); - - ITerminalTextDataReadOnly getTerminalText(); - /** - * This is is - * @param startLine - * @param startCol - * @param height - * @param width - */ - void setVisibleRectangle(int startLine, int startCol, int height, int width); - - /** - * @return true when the cursor is shown (used for blinking cursors) - */ - boolean isCursorOn(); - /** - * Show/Hide the cursor. - * @param visible - */ - void setCursorEnabled(boolean visible); - - /** - * @return true if the cursor is shown. - */ - boolean isCursorEnabled(); - - /** - * @return the line of the cursor - */ - int getCursorLine(); - /** - * @return the column of the cursor - */ - int getCursorColumn(); - - /** - * @return the start of the selection or null if nothing is selected - * {@link Point#x} is the column and {@link Point#y} is the line. - */ - Point getSelectionStart(); - /** - * @return the end of the selection or null if nothing is selected - * {@link Point#x} is the column and {@link Point#y} is the line. - */ - Point getSelectionEnd(); - - Point getSelectionAnchor(); - - void setSelectionAnchor(Point anchor); - /** - * Sets the selection. A negative startLine clears the selection. - * @param startLine - * @param endLine - * @param startColumn - * @param endColumn - */ - void setSelection(int startLine, int endLine, int startColumn, int endColumn); - - /** - * @param line - * @return true if line is part of the selection - */ - boolean hasLineSelection(int line); - - String getSelectedText(); -} \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModelListener.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModelListener.java deleted file mode 100644 index 4e09027..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModelListener.java +++ /dev/null @@ -1,24 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.textcanvas; - -/** - */ -public interface ITextCanvasModelListener { - void rangeChanged(int col, int line, int width, int height); - void dimensionsChanged(int cols, int rows); - /** - * Called when any text change happened. Used to scroll to the - * end of text in auto scroll mode. This does not get fired - * when the window of interest has changed! - */ - void terminalDataChanged(); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/PipedInputStream.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/PipedInputStream.java deleted file mode 100644 index f0e1132..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/PipedInputStream.java +++ /dev/null @@ -1,312 +0,0 @@ -/******************************************************************************* - * Copyright (c) 1996, 2011 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Douglas Lea (Addison Wesley) - [cq:1552] BoundedBufferWithStateTracking adapted to BoundedByteBuffer - * Martin Oberhuber (Wind River) - the waitForAvailable method - * Martin Oberhuber (Wind River) - [208166] Avoid unnecessary arraycopy in BoundedByteBuffer - * Pawel Piech (Wind River) - [333613] "Job found still running" after shutdown - *******************************************************************************/ - -package org.eclipse.tm.internal.terminal.textcanvas; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * The main purpose of this class is to start a runnable in the - * display thread when data is available and to pretend no data - * is available after a given amount of time the runnable is running. - * - */ -public class PipedInputStream extends InputStream { - /** - * The output stream used by the terminal backend to write to the terminal - */ - protected final OutputStream fOutputStream; - /** - * A blocking byte queue. - */ - private final BoundedByteBuffer fQueue; - - /** - * A byte bounded buffer used to synchronize the input and the output stream. - *

            - * Adapted from BoundedBufferWithStateTracking - * http://gee.cs.oswego.edu/dl/cpj/allcode.java - * http://gee.cs.oswego.edu/dl/cpj/ - *

            - * BoundedBufferWithStateTracking is part of the examples for the book - * Concurrent Programming in Java: Design Principles and Patterns by - * Doug Lea (ISBN 0-201-31009-0). Second edition published by - * Addison-Wesley, November 1999. The code is - * Copyright(c) Douglas Lea 1996, 1999 and released to the public domain - * and may be used for any purposes whatsoever. - *

            - * For some reasons a solution based on - * PipedOutputStream/PipedIntputStream - * does work *very* slowly: - * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4404700 - *

            - * - */ - private class BoundedByteBuffer { - protected final byte[] fBuffer; // the elements - protected int fPutPos = 0; // circular indices - protected int fTakePos = 0; - protected int fUsedSlots = 0; // the count - private boolean fClosed; - public BoundedByteBuffer(int capacity) throws IllegalArgumentException { - // make sure we don't deadlock on too small capacity - if (capacity <= 0) - throw new IllegalArgumentException(); - fBuffer = new byte[capacity]; - } - /** - * @return the bytes available for {@link #read()} - * Must be called with a lock on this! - */ - public int available() { - return fUsedSlots; - } - /** - * Writes a single byte to the buffer. Blocks if the buffer is full. - * @param b byte to write to the buffer - * @throws InterruptedException when the thread is interrupted while waiting - * for the buffer to become ready - * Must be called with a lock on this! - */ - public void write(byte b) throws InterruptedException { - while (fUsedSlots == fBuffer.length) - // wait until not full - wait(); - - fBuffer[fPutPos] = b; - fPutPos = (fPutPos + 1) % fBuffer.length; // cyclically increment - - if (fUsedSlots++ == 0) // signal if was empty - notifyAll(); - } - public int getFreeSlots() { - return fBuffer.length - fUsedSlots; - } - public void write(byte[] b, int off, int len) throws InterruptedException { - assert len<=getFreeSlots(); - while (fUsedSlots == fBuffer.length) - // wait until not full - wait(); - int n = Math.min(len, fBuffer.length - fPutPos); - System.arraycopy(b, off, fBuffer, fPutPos, n); - if (fPutPos + len > fBuffer.length) - System.arraycopy(b, off + n, fBuffer, 0, len - n); - fPutPos = (fPutPos + len) % fBuffer.length; // cyclically increment - boolean wasEmpty = fUsedSlots == 0; - fUsedSlots += len; - if (wasEmpty) // signal if was empty - notifyAll(); - } - /** - * Read a single byte. Blocks until a byte is available. - * @return a byte from the buffer - * @throws InterruptedException when the thread is interrupted while waiting - * for the buffer to become ready - * Must be called with a lock on this! - */ - public int read() throws InterruptedException { - while (fUsedSlots == 0) { - if(fClosed) - return -1; - // wait until not empty - wait(); - } - byte b = fBuffer[fTakePos]; - fTakePos = (fTakePos + 1) % fBuffer.length; - - if (fUsedSlots-- == fBuffer.length) // signal if was full - notifyAll(); - return b; - } - public int read(byte[] cbuf, int off, int len) throws InterruptedException { - assert len<=available(); - while (fUsedSlots == 0) { - if(fClosed) - return 0; - // wait until not empty - wait(); - } - int n = Math.min(len, fBuffer.length - fTakePos); - System.arraycopy(fBuffer, fTakePos, cbuf, off, n); - if (fTakePos + len > n) - System.arraycopy(fBuffer, 0, cbuf, off + n, len - n); - fTakePos = (fTakePos + len) % fBuffer.length; - boolean wasFull = fUsedSlots == fBuffer.length; - fUsedSlots -= len; - if(wasFull) - notifyAll(); - - return len; - } - public void close() { - fClosed=true; - notifyAll(); - } - public boolean isClosed() { - return fClosed; - } - } - - /** - * An output stream that calls {@link PipedInputStream#textAvailable} - * every time data is written to the stream. The data is written to - * {@link PipedInputStream#fQueue}. - * - */ - class PipedOutputStream extends OutputStream { - public void write(byte[] b, int off, int len) throws IOException { - try { - synchronized (fQueue) { - if(fQueue.isClosed()) - throw new IOException("Stream is closed!"); //$NON-NLS-1$ - int written=0; - while(writtenPipedInputStream is the same as closing the output stream. - * The stream will allow reading data that's still in the pipe after which it will - * throw an IOException. - */ - public void close() throws IOException { - synchronized(fQueue) { - fQueue.close(); - } - } - - public int read(byte[] cbuf, int off, int len) throws IOException { - int n=0; - if(len==0) - return 0; - // read as much as we can using a single synchronized statement - try { - synchronized (fQueue) { - // if nothing available, block and read one byte - if (fQueue.available() == 0) { - // block now until at least one byte is available - int c = fQueue.read(); - // are we at the end of stream - if (c == -1) - return -1; - cbuf[off] = (byte) c; - n++; - } - // is there more data available? - if (n < len && fQueue.available() > 0) { - // read at most available() - int nn = Math.min(fQueue.available(), len - n); - // are we at the end of the stream? - if (nn == 0 && fQueue.isClosed()) { - // if no byte was read, return -1 to indicate end of stream - // else return the bytes we read up to now - if (n == 0) - n = -1; - return n; - } - fQueue.read(cbuf, off + n, nn); - n += nn; - } - - } - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - return n; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/PollingTextCanvasModel.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/PollingTextCanvasModel.java deleted file mode 100644 index b54fdf6..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/PollingTextCanvasModel.java +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Anton Leherbauer (Wind River) - [420928] Terminal widget leaks memory - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.textcanvas; -import org.eclipse.swt.widgets.Display; -import org.eclipse.tm.terminal.model.ITerminalTextDataSnapshot; - -/** - * @author Michael.Scharf@scharf-software.com - * - */ -public class PollingTextCanvasModel extends AbstractTextCanvasModel { - private static final int DEFAULT_POLL_INTERVAL = 50; - int fPollInterval = -1; - - /** - * - */ - public PollingTextCanvasModel(ITerminalTextDataSnapshot snapshot) { - super(snapshot); - startPolling(); - } - public void setUpdateInterval(int t) { - fPollInterval = t; - } - public void stopPolling() { - // timerExec only dispatches if the delay is >=0 - fPollInterval = -1; - } - public void startPolling() { - if (fPollInterval < 0) { - fPollInterval = DEFAULT_POLL_INTERVAL; - Display.getDefault().timerExec(fPollInterval, new Runnable(){ - public void run() { - update(); - Display.getDefault().timerExec(fPollInterval, this); - } - }); - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/StyleMap.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/StyleMap.java deleted file mode 100644 index 81e63e2..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/StyleMap.java +++ /dev/null @@ -1,296 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Michael Scharf (Wind River) - [205260] Terminal does not take the font from the preferences - * Michael Scharf (Wind River) - [209746] There are cases where some colors not displayed correctly - * Michael Scharf (Wind River) - [206328] Terminal does not draw correctly with proportional fonts - * Martin Oberhuber (Wind River) - [247700] Terminal uses ugly fonts in JEE package - * Martin Oberhuber (Wind River) - [335358] Fix Terminal color definition - * Martin Oberhuber (Wind River) - [265352][api] Allow setting fonts programmatically - * Martin Oberhuber (Wind River) - [475422] Fix display on MacOSX Retina - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.textcanvas; - -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.widgets.Display; -import org.eclipse.tm.internal.terminal.preferences.ITerminalConstants; -import org.eclipse.tm.terminal.model.Style; -import org.eclipse.tm.terminal.model.StyleColor; - -public class StyleMap { - private static final String BLACK = "black"; //$NON-NLS-1$ - private static final String WHITE = "white"; //$NON-NLS-1$ - private static final String WHITE_FOREGROUND = "white_foreground"; //$NON-NLS-1$ - private static final String GRAY = "gray"; //$NON-NLS-1$ - private static final String MAGENTA = "magenta"; //$NON-NLS-1$ - private static final String CYAN = "cyan"; //$NON-NLS-1$ - private static final String YELLOW = "yellow"; //$NON-NLS-1$ - private static final String BLUE = "blue"; //$NON-NLS-1$ - private static final String GREEN = "green"; //$NON-NLS-1$ - private static final String RED = "red"; //$NON-NLS-1$ - - private static final String PREFIX = "org.eclipse.tm.internal."; //$NON-NLS-1$ - String fFontName=ITerminalConstants.FONT_DEFINITION; - Map fColorMapForeground=new HashMap(); - Map fColorMapBackground=new HashMap(); - Map fColorMapIntense=new HashMap(); - private Point fCharSize; - private final Style fDefaultStyle; - private boolean fInvertColors; - private boolean fProportional; - private final int[] fOffsets=new int[256]; - StyleMap() { - initColors(); - fDefaultStyle=Style.getStyle(StyleColor.getStyleColor(BLACK),StyleColor.getStyleColor(WHITE)); - updateFont(); - } - private void initColors() { - initForegroundColors(); - initBackgroundColors(); - initIntenseColors(); - } - private void initForegroundColors() { - if(fInvertColors) { - setColor(fColorMapForeground, WHITE, 0, 0, 0); - setColor(fColorMapForeground, WHITE_FOREGROUND, 50, 50, 50); - setColor(fColorMapForeground, BLACK, 229, 229, 229); - } else { - setColor(fColorMapForeground, WHITE, 255, 255, 255); - setColor(fColorMapForeground, WHITE_FOREGROUND, 229, 229, 229); - setColor(fColorMapForeground, BLACK, 50, 50, 50); - } - setColor(fColorMapForeground, RED, 205, 0, 0); - setColor(fColorMapForeground, GREEN, 0, 205, 0); - setColor(fColorMapForeground, BLUE, 0, 0, 238); - setColor(fColorMapForeground, YELLOW, 205, 205, 0); - setColor(fColorMapForeground, CYAN, 0, 205, 205); - setColor(fColorMapForeground, MAGENTA, 205, 0, 205); - setColor(fColorMapForeground, GRAY, 229, 229, 229); - } - - private void initBackgroundColors() { - if(fInvertColors) { - setColor(fColorMapBackground, WHITE, 0, 0, 0); - setColor(fColorMapBackground, WHITE_FOREGROUND, 50, 50, 50); // only used when colors are inverse - setColor(fColorMapBackground, BLACK, 255, 255, 255); - } else { - setColor(fColorMapBackground, WHITE, 255, 255, 255); - setColor(fColorMapBackground, WHITE_FOREGROUND, 229, 229, 229); - setColor(fColorMapBackground, BLACK, 0, 0, 0); - } - setColor(fColorMapBackground, RED, 205, 0, 0); - setColor(fColorMapBackground, GREEN, 0, 205, 0); - setColor(fColorMapBackground, BLUE, 0, 0, 238); - setColor(fColorMapBackground, YELLOW, 205, 205, 0); - setColor(fColorMapBackground, CYAN, 0, 205, 205); - setColor(fColorMapBackground, MAGENTA, 205, 0, 205); - setColor(fColorMapBackground, GRAY, 229, 229, 229); - } - - private void initIntenseColors() { - if(fInvertColors) { - setColor(fColorMapIntense, WHITE, 127, 127, 127); - setColor(fColorMapIntense, WHITE_FOREGROUND, 0, 0, 0); // only used when colors are inverse - setColor(fColorMapIntense, BLACK, 255, 255, 255); - } else { - setColor(fColorMapIntense, WHITE, 255, 255, 255); - setColor(fColorMapIntense, WHITE_FOREGROUND, 255, 255, 255); - setColor(fColorMapIntense, BLACK, 0, 0, 0); - } - setColor(fColorMapIntense, RED, 255, 0, 0); - setColor(fColorMapIntense, GREEN, 0, 255, 0); - setColor(fColorMapIntense, BLUE, 92, 92, 255); - setColor(fColorMapIntense, YELLOW, 255, 255, 0); - setColor(fColorMapIntense, CYAN, 0, 255, 255); - setColor(fColorMapIntense, MAGENTA, 255, 0, 255); - setColor(fColorMapIntense, GRAY, 255, 255, 255); - } - - private void setColor(Map colorMap, String name, int r, int g, int b) { - String colorName=PREFIX+r+"-"+g+"-"+b; //$NON-NLS-1$//$NON-NLS-2$ - Color color=JFaceResources.getColorRegistry().get(colorName); - if(color==null) { - JFaceResources.getColorRegistry().put(colorName, new RGB(r,g,b)); - color=JFaceResources.getColorRegistry().get(colorName); - } - colorMap.put(StyleColor.getStyleColor(name), color); - colorMap.put(StyleColor.getStyleColor(name.toUpperCase()), color); - } - - public Color getForegrondColor(Style style) { - style = defaultIfNull(style); - Map map = style.isBold() ? fColorMapIntense : fColorMapForeground; - //Map map = fColorMapForeground; - if(style.isReverse()) - return getColor(map ,style.getBackground()); - else - return getColor(map ,style.getForground()); - } - public Color getBackgroundColor(Style style) { - style = defaultIfNull(style); - if(style.isReverse()) - return getColor(fColorMapBackground,style.getForground()); - else - return getColor(fColorMapBackground,style.getBackground()); - } - Color getColor(Map map,StyleColor color) { - Color c=map.get(color); - if(c==null) { - c=Display.getCurrent().getSystemColor(SWT.COLOR_GRAY); - } - return c; - } - private Style defaultIfNull(Style style) { - if(style==null) - style=fDefaultStyle; - return style; - } - public void setInvertedColors(boolean invert) { - if(invert==fInvertColors) - return; - fInvertColors=invert; - initColors(); - } -// static Font getBoldFont(Font font) { -// FontData fontDatas[] = font.getFontData(); -// FontData data = fontDatas[0]; -// return new Font(Display.getCurrent(), data.getName(), data.getHeight(), data.getStyle()|SWT.BOLD); -// } - - public Font getFont(Style style) { - style = defaultIfNull(style); - if(style.isBold()) { - return JFaceResources.getFontRegistry().getBold(fFontName); - } else if(style.isUnderline()) { - return JFaceResources.getFontRegistry().getItalic(fFontName); - - } - return JFaceResources.getFontRegistry().get(fFontName); - } - - public Font getFont() { - return JFaceResources.getFontRegistry().get(fFontName); - - } - public int getFontWidth() { - return fCharSize.x; - } - public int getFontHeight() { - return fCharSize.y; - } - public void updateFont() { - updateFont(ITerminalConstants.FONT_DEFINITION); - } - /** - * Update the StyleMap for a new font name. - * The font name must be a valid name in the Jface font registry. - * @param fontName Jface name of the new font to use. - * @since 3.2 - */ - public void updateFont(String fontName) { - Display display=Display.getCurrent(); - GC gc = new GC (display); - if (JFaceResources.getFontRegistry().hasValueFor(fontName)) { - fFontName = fontName; - } else { - //fall back to "basic jface text font" - fFontName = "org.eclipse.jface.textfont"; //$NON-NLS-1$ - } - gc.setFont(getFont()); - fCharSize = gc.textExtent ("W"); //$NON-NLS-1$ - fProportional=false; - - for (char c = ' '; c <= '~'; c++) { - // consider only the first 128 chars for deciding if a font - // is proportional. Collect char width as a side-effect. - if(measureChar(gc, c, true)) - fProportional=true; - } - if(fProportional) { - // Widest char minus the padding on the left and right: - // Looks much better for small fonts - fCharSize.x-=2; - // Collect width of the upper characters (for offset calculation) - for (char c = '~'+1; c < fOffsets.length; c++) { - measureChar(gc, c,false); - } - // Calculate offsets based on each character's width and the bounding box - for (int i = ' '; i < fOffsets.length; i++) { - fOffsets[i]=(fCharSize.x-fOffsets[i])/2; - } - } else { - // Non-Proportional: Reset all offsets (eg after font change) - for (int i = 0; i < fOffsets.length; i++) { - fOffsets[i]=0; - } - String t = "The quick brown Fox jumps over the Lazy Dog."; //$NON-NLS-1$ - Point ext=gc.textExtent(t); - if(ext.x != fCharSize.x * t.length()) { - //Bug 475422: On OSX with Retina display and due to scaling, - //a text many be shorter than the sum of its bounding boxes. - //Because even with fixed width font, bounding box size - //may not be an integer but a fraction eg 6.75 pixels. - // - //Painting in proportional mode ensures that each character - //is painted individually into its proper bounding box, rather - //than using an optimization where Strings would be drawn as - //a whole. This fixes the "fractional bounding box" problem. - fProportional=true; - } - //measure font in boldface, too, and if wider then treat like proportional - gc.setFont(getFont(fDefaultStyle.setBold(true))); - Point charSizeBold = gc.textExtent("W"); //$NON-NLS-1$ - if (fCharSize.x != charSizeBold.x) { - fProportional=true; - } - } - gc.dispose (); - } - /** - * @param gc - * @param c - * @param updateMax - * @return true if the the font is proportional - */ - private boolean measureChar(GC gc, char c, boolean updateMax) { - boolean proportional=false; - Point ext=gc.textExtent(String.valueOf(c)); - if(ext.x>0 && ext.y>0 && (fCharSize.x!=ext.x || fCharSize.y!=ext.y)) { - proportional=true; - if(updateMax) { - fCharSize.x=Math.max(fCharSize.x, ext.x); - fCharSize.y=Math.max(fCharSize.y, ext.y); - } - } - fOffsets[c]=ext.x; - return proportional; - } - public boolean isFontProportional() { - return fProportional; - } - /** - * Return the offset in pixels required to center a given character - * @param c the character to measure - * @return the offset in x direction to center this character - */ - public int getCharOffset(char c) { - if(c>=fOffsets.length) - return 0; - return fOffsets[c]; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java deleted file mode 100644 index a8b9508..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java +++ /dev/null @@ -1,470 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Michael Scharf (Wind River) - [240098] The cursor should not blink when the terminal is disconnected - * Uwe Stieber (Wind River) - [281328] The very first few characters might be missing in the terminal control if opened and connected programmatically - * Martin Oberhuber (Wind River) - [294327] After logging in, the remote prompt is hidden - * Anton Leherbauer (Wind River) - [294468] Fix scroller and text line rendering - * Uwe Stieber (Wind River) - [205486] Fix ScrollLock always moving to line 1 - * Anton Leherbauer (Wind River) - [219589] Copy an entire line selection - * Anton Leherbauer (Wind River) - [196465] Resizing Terminal changes Scroller location - * Anton Leherbauer (Wind River) - [324608] Terminal has strange scrolling behaviour - * Martin Oberhuber (Wind River) - [265352][api] Allow setting fonts programmatically - * Anton Leherbauer (Wind River) - [434749] UnhandledEventLoopException when copying to clipboard while the selection is empty - * Davy Landman (CWI) - [475267][api] Allow custom mouse listeners - *******************************************************************************/ -package org.eclipse.tm.internal.terminal.textcanvas; - - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.dnd.Clipboard; -import org.eclipse.swt.dnd.TextTransfer; -import org.eclipse.swt.dnd.Transfer; -import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.events.FocusListener; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.MouseMoveListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.tm.internal.terminal.control.ITerminalMouseListener; - -/** - * A cell oriented Canvas. Maintains a list of "cells". - * It can either be vertically or horizontally scrolled. - * The CellRenderer is responsible for painting the cell. - */ -public class TextCanvas extends GridCanvas { - protected final ITextCanvasModel fCellCanvasModel; - /** Renders the cells */ - private final ILinelRenderer fCellRenderer; - private boolean fScrollLock; - private Point fDraggingStart; - private Point fDraggingEnd; - private boolean fHasSelection; - private ResizeListener fResizeListener; - private final List fMouseListeners; - - // The minSize is meant to determine the minimum size of the backing store - // (grid) into which remote data is rendered. If the viewport is smaller - // than that minimum size, the backing store size remains at the minSize, - // and a scrollbar is shown instead. In reality, this has the following - // issues or effects today: - // (a) Bug 281328: For very early data coming in before the widget is - // realized, the minSize determines into what initial grid that is - // rendered. See also @link{#addResizeHandler(ResizeListener)}. - // (b) Bug 294468: Since we have redraw and size computation problems - // with horizontal scrollers, for now the minColumns must be small - // enough to avoid a horizontal scroller appearing in most cases. - // (b) Bug 294327: since we have problems with the vertical scroller - // showing the correct location, minLines must be small enough - // to avoid a vertical scroller or new data may be rendered off-screen. - // As a compromise, we have been working with a 20x4 since the Terminal - // inception, though many users would want a 80x24 minSize and backing - // store. Pros and cons of the small minsize: - // + consistent "remote size==viewport size", vi works as expected - // - dumb terminals which expect 80x24 render garbled on small viewport. - // If bug 294468 were resolved, an 80 wide minSize would be preferrable - // since it allows switching the terminal viewport small/large as needed, - // without destroying the backing store. For a complete solution, - // Bug 196462 tracks the request for a user-defined fixed-widow-size-mode. - private int fMinColumns=80; - private int fMinLines=4; - private boolean fCursorEnabled; - private boolean fResizing; - - /** - * Create a new CellCanvas with the given SWT style bits. - * (SWT.H_SCROLL and SWT.V_SCROLL are automatically added). - */ - public TextCanvas(Composite parent, ITextCanvasModel model, int style,ILinelRenderer cellRenderer) { - super(parent, style | SWT.H_SCROLL | SWT.V_SCROLL); - fCellRenderer=cellRenderer; - setCellWidth(fCellRenderer.getCellWidth()); - setCellHeight(fCellRenderer.getCellHeight()); - fCellCanvasModel=model; - fCellCanvasModel.addCellCanvasModelListener(new ITextCanvasModelListener(){ - public void rangeChanged(int col, int line, int width, int height) { - if(isDisposed()) return; - repaintRange(col,line,width,height); - } - public void dimensionsChanged(int cols, int rows) { - if(isDisposed()) return; - calculateGrid(); - } - public void terminalDataChanged() { - if(isDisposed()) return; - - // scroll to end (unless scroll lock is active) - if (!fResizing) { - calculateGrid(); - scrollToEnd(); - } - } - }); - // let the cursor blink if the text canvas gets the focus... - addFocusListener(new FocusListener(){ - public void focusGained(FocusEvent e) { - fCellCanvasModel.setCursorEnabled(fCursorEnabled); - } - public void focusLost(FocusEvent e) { - fCellCanvasModel.setCursorEnabled(false); - }}); - fMouseListeners = new ArrayList(); - addMouseListener(new MouseListener(){ - public void mouseDoubleClick(MouseEvent e) { - if (fMouseListeners.size() > 0) { - Point pt = screenPointToCell(e.x, e.y); - if (pt != null) { - for (ITerminalMouseListener l : fMouseListeners) { - l.mouseDoubleClick(fCellCanvasModel.getTerminalText(), pt.y, pt.x, e.button); - } - } - } - } - public void mouseDown(MouseEvent e) { - if(e.button==1) { // left button - fDraggingStart=screenPointToCell(e.x, e.y); - fHasSelection=false; - if((e.stateMask&SWT.SHIFT)!=0) { - Point anchor=fCellCanvasModel.getSelectionAnchor(); - if(anchor!=null) - fDraggingStart=anchor; - } else { - fCellCanvasModel.setSelectionAnchor(fDraggingStart); - } - fDraggingEnd=null; - } - if (fMouseListeners.size() > 0) { - Point pt = screenPointToCell(e.x, e.y); - if (pt != null) { - for (ITerminalMouseListener l : fMouseListeners) { - l.mouseDown(fCellCanvasModel.getTerminalText(), pt.y, pt.x, e.button); - } - } - } - } - public void mouseUp(MouseEvent e) { - if(e.button==1) { // left button - updateHasSelection(e); - if(fHasSelection) - setSelection(screenPointToCell(e.x, e.y)); - else - fCellCanvasModel.setSelection(-1,-1,-1,-1); - fDraggingStart=null; - } - if (fMouseListeners.size() > 0) { - Point pt = screenPointToCell(e.x, e.y); - if (pt != null) { - for (ITerminalMouseListener l : fMouseListeners) { - l.mouseUp(fCellCanvasModel.getTerminalText(), pt.y, pt.x, e.button); - } - } - } - } - }); - addMouseMoveListener(new MouseMoveListener() { - - public void mouseMove(MouseEvent e) { - if (fDraggingStart != null) { - updateHasSelection(e); - setSelection(screenPointToCell(e.x, e.y)); - } - } - }); - serVerticalBarVisible(true); - setHorizontalBarVisible(false); - } - - /** - * The user has to drag the mouse to at least one character to make a selection. - * Once this is done, even a one char selection is OK. - * - * @param e - */ - private void updateHasSelection(MouseEvent e) { - if(fDraggingStart!=null) { - Point p=screenPointToCell(e.x, e.y); - if(fDraggingStart.x!=p.x||fDraggingStart.y!=p.y) - fHasSelection=true; - } - } - - void setSelection(Point p) { - if (fDraggingStart !=null && !p.equals(fDraggingEnd)) { - fDraggingEnd = p; - if (compare(p, fDraggingStart) < 0) { - // bug 219589 - make sure selection start coordinates are non-negative - int startColumn = Math.max(0, p.x); - int startRow = Math.max(p.y, 0); - fCellCanvasModel.setSelection(startRow, fDraggingStart.y, startColumn, fDraggingStart.x); - } else { - fCellCanvasModel.setSelection(fDraggingStart.y, p.y, fDraggingStart.x, p.x); - - } - } - } - - int compare(Point p1, Point p2) { - if (p1.equals(p2)) - return 0; - if (p1.y == p2.y) { - if (p1.x > p2.x) - return 1; - else - return -1; - } - if (p1.y > p2.y) { - return 1; - } else { - return -1; - } - } - public ILinelRenderer getCellRenderer() { - return fCellRenderer; - } - - public int getMinColumns() { - return fMinColumns; - } - - public void setMinColumns(int minColumns) { - fMinColumns = minColumns; - } - - public int getMinLines() { - return fMinLines; - } - - public void setMinLines(int minLines) { - fMinLines = minLines; - } - - protected void onResize(boolean init) { - if(fResizeListener!=null) { - Rectangle bonds=getClientArea(); - int cellHeight = getCellHeight(); - int cellWidth = getCellWidth(); - int lines=bonds.height/cellHeight; - int columns=bonds.width/cellWidth; - // when the view is minimised, its size is set to 0 - // we don't sent this to the terminal! - if((lines>0 && columns>0) || init) { - if(columns=fMinColumns && isHorizontalBarVisble()) { - setHorizontalBarVisible(false); - bonds=getClientArea(); - lines=bonds.height/cellHeight; - columns=bonds.width/cellWidth; - } - if(lines 0) { - y = 0; - } - Rectangle v=getViewRectangle(); - if(v.y!=-y) { - setVirtualOrigin(v.x,y); - } - // make sure the scroll area is correct: - scrollY(getVerticalBar()); - scrollX(getHorizontalBar()); - } - } - /** - * - * @return true if the cursor should be shown on output.... - */ - public boolean isScrollLock() { - return fScrollLock; - } - /** - * If set then if the size changes - */ - public void setScrollLock(boolean scrollLock) { - fScrollLock=scrollLock; - } - protected void repaintRange(int col, int line, int width, int height) { - Point origin=cellToOriginOnScreen(col,line); - Rectangle r=new Rectangle(origin.x,origin.y,width*getCellWidth(),height*getCellHeight()); - repaint(r); - } - protected void drawLine(GC gc, int line, int x, int y, int colFirst, int colLast) { - fCellRenderer.drawLine(fCellCanvasModel, gc,line,x,y,colFirst, colLast); - } - protected Color getTerminalBackgroundColor() { - return fCellRenderer.getDefaultBackgroundColor(); - } - protected void visibleCellRectangleChanged(int x, int y, int width, int height) { - fCellCanvasModel.setVisibleRectangle(y,x,height,width); - update(); - } - protected int getCols() { - return fCellCanvasModel.getTerminalText().getWidth(); - } - protected int getRows() { - return fCellCanvasModel.getTerminalText().getHeight(); - } - public String getSelectionText() { - // TODO -- create a hasSelectionMethod! - return fCellCanvasModel.getSelectedText(); - } - public void copy() { - String selectionText = getSelectionText(); - if (selectionText != null && selectionText.length() > 0) { - Clipboard clipboard = new Clipboard(getDisplay()); - clipboard.setContents(new Object[] { selectionText }, new Transfer[] { TextTransfer.getInstance() }); - clipboard.dispose(); - } - } - public void selectAll() { - fCellCanvasModel.setSelection(0, fCellCanvasModel.getTerminalText().getHeight(), 0, fCellCanvasModel.getTerminalText().getWidth()); - fCellCanvasModel.setSelectionAnchor(new Point(0,0)); - } - - /** - * @since 4.1 - */ - public void clearSelection() { - fCellCanvasModel.setSelection(-1,-1,-1,-1); - } - - public boolean isEmpty() { - return false; - } - /** - * Gets notified when the visible size of the terminal changes. - * This should update the model! - * - */ - public interface ResizeListener { - void sizeChanged(int lines, int columns); - } - /** - * @param listener this listener gets notified, when the size of - * the widget changed. It should change the dimensions of the underlying - * terminaldata - */ - public void addResizeHandler(ResizeListener listener) { - if(fResizeListener!=null) - throw new IllegalArgumentException("There can be at most one listener at the moment!"); //$NON-NLS-1$ - fResizeListener=listener; - - // Bug 281328: [terminal] The very first few characters might be missing in - // the terminal control if opened and connected programmatically - // - // In case the terminal had not been visible yet or is too small (less than one - // line visible), the terminal should have a minimum size to avoid RuntimeExceptions. - Rectangle bonds=getClientArea(); - if (bonds.height=getTerminalText().getHeight() || colFirst>=getTerminalText().getWidth() || colFirst-colLast==0) { - fillBackground(gc, x, y, getCellWidth()*(colLast-colFirst), getCellHeight()); - } else { - colLast=Math.min(colLast, getTerminalText().getWidth()); - LineSegment[] segments=getTerminalText().getLineSegments(line, colFirst, colLast-colFirst); - for (int i = 0; i < segments.length; i++) { - LineSegment segment=segments[i]; - Style style=segment.getStyle(); - setupGC(gc, style); - String text=segment.getText(); - drawText(gc, x, y, colFirst, segment.getColumn(), text); - drawCursor(model, gc, line, x, y, colFirst); - } - if(fModel.hasLineSelection(line)) { - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT)); - gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_LIST_SELECTION)); - Point start=model.getSelectionStart(); - Point end=model.getSelectionEnd(); - char[] chars=model.getTerminalText().getChars(line); - if(chars==null) - return; - int offset=0; - if(start.y==line) - offset=start.x; - offset=Math.max(offset, colFirst); - int len; - if(end.y==line) - len=end.x-offset+1; - else - len=chars.length-offset+1; - len=Math.min(len,chars.length-offset); - if(len>0) { - String text=new String(chars,offset,len); - drawText(gc, x, y, colFirst, offset, text); - } - } - } - } - - private void fillBackground(GC gc, int x, int y, int width, int height) { - Color bg=gc.getBackground(); - gc.setBackground(getDefaultBackgroundColor()); - gc.fillRectangle (x,y,width,height); - gc.setBackground(bg); - - } - - public Color getDefaultBackgroundColor() { - // null == default style - return fStyleMap.getBackgroundColor(null); - } - - private void drawCursor(ITextCanvasModel model, GC gc, int row, int x, int y, int colFirst) { - if(!model.isCursorOn()) - return; - int cursorLine=model.getCursorLine(); - - if(row==cursorLine) { - int cursorColumn=model.getCursorColumn(); - if(cursorColumnCanvas showing a virtual object. - * Virtual: the extent of the total canvas. - * Screen: the visible client area in the screen. - */ -public abstract class VirtualCanvas extends Canvas { - - private final Rectangle fVirtualBounds = new Rectangle(0,0,0,0); - private Rectangle fClientArea; - /** - * prevent infinite loop in {@link #updateScrollbars()} - */ - private boolean fInUpdateScrollbars; - private static boolean fInUpdateScrollbarsLogged; - - public VirtualCanvas(Composite parent, int style) { - super(parent, style|SWT.NO_BACKGROUND|SWT.NO_REDRAW_RESIZE); - fClientArea=getClientArea(); - addListener(SWT.Paint, new Listener() { - public void handleEvent(Event event) { - paint(event.gc); - } - }); - addListener(SWT.Resize, new Listener() { - public void handleEvent(Event event) { - fClientArea=getClientArea(); - onResize(); - } - }); - getVerticalBar().addListener(SWT.Selection, new Listener() { - public void handleEvent(Event e) { - scrollY((ScrollBar)e.widget); - - } - - }); - getHorizontalBar().addListener(SWT.Selection, new Listener() { - public void handleEvent(Event e) { - scrollX((ScrollBar)e.widget); - - } - }); - } - protected void onResize() { - updateViewRectangle(); - } - protected void scrollX(ScrollBar hBar) { - int hSelection = hBar.getSelection (); - int destX = -hSelection - fVirtualBounds.x; - fVirtualBounds.x = -hSelection; - scrollSmart(destX, 0); - updateViewRectangle(); - } - protected void scrollXDelta(int delta) { - getHorizontalBar().setSelection(-fVirtualBounds.x+delta); - scrollX(getHorizontalBar()); - } - - protected void scrollY(ScrollBar vBar) { - int vSelection = vBar.getSelection (); - int destY = -vSelection - fVirtualBounds.y; - if(destY!=0) { - fVirtualBounds.y = -vSelection; - scrollSmart(0,destY); - updateViewRectangle(); - } - - } - protected void scrollYDelta(int delta) { - getVerticalBar().setSelection(-fVirtualBounds.y+delta); - scrollY(getVerticalBar()); - } - - - protected void scrollSmart(int deltaX, int deltaY) { - if (deltaX != 0 || deltaY != 0) { - Rectangle rect = getBounds(); - scroll (deltaX, deltaY, 0, 0, rect.width, rect.height, false); - } - } - - /** - * @param rect in virtual space - */ - protected void revealRect(Rectangle rect) { - Rectangle visibleRect=getScreenRectInVirtualSpace(); - // scroll the X part - int deltaX=0; - if(rect.x0||marginHeight>0){ - Color bg=getBackground(); - gc.setBackground(getTerminalBackgroundColor()); - if (marginWidth > 0) { - gc.fillRectangle (width, clipping.y, marginWidth, clipping.height); - } - if (marginHeight > 0) { - gc.fillRectangle (clipping.x, height, clipping.width, marginHeight); - } - gc.setBackground(bg); - } - } - /** - * @private - */ - protected boolean inClipping(Rectangle clipping, Rectangle r) { - // TODO check if this is OK in all cases (the <=!) - // - if(r.x+r.width<=clipping.x) - return false; - if(clipping.x+clipping.width<=r.x) - return false; - if(r.y+r.height<=clipping.y) - return false; - if(clipping.y+clipping.height<=r.y) - return false; - - return true; - } - /** - * @return the screen rect in virtual space (starting with (0,0)) - * of the visible screen. (x,y>=0) - */ - protected Rectangle getScreenRectInVirtualSpace() { - Rectangle r= new Rectangle(fClientArea.x-fVirtualBounds.x,fClientArea.y-fVirtualBounds.y,fClientArea.width,fClientArea.height); - return r; - } - /** - * @return the rect in virtual space (starting with (0,0)) - * of the visible screen. (x,y>=0) - */ - protected Rectangle getRectInVirtualSpace(Rectangle r) { - return new Rectangle(r.x-fVirtualBounds.x,r.y-fVirtualBounds.y,r.width,r.height); - } - - /** - * Sets the extent of the virtual display area - * @param width width of the display area - * @param height height of the display area - */ - protected void setVirtualExtend(int width, int height) { - fVirtualBounds.width=width; - fVirtualBounds.height=height; - updateScrollbars(); - updateViewRectangle(); - } - /** - * sets the scrolling origin. Also sets the scrollbars. - * Does NOT redraw! - * Use negative values (move the virtual origin to the top left - * to see something in the screen (which is located at (0,0)) - * @param x - * @param y - */ - protected void setVirtualOrigin(int x, int y) { - if (fVirtualBounds.x != x || fVirtualBounds.y != y) { - fVirtualBounds.x=x; - fVirtualBounds.y=y; - getHorizontalBar().setSelection(-x); - getVerticalBar().setSelection(-y); - updateViewRectangle(); - } - } - protected Rectangle getVirtualBounds() { - return cloneRectangle(fVirtualBounds); - } - /** - * @param x - * @return the virtual coordinate in screen space - */ - protected int virtualXtoScreen(int x) { - return x+fVirtualBounds.x; - } - protected int virtualYtoScreen(int y) { - return y+fVirtualBounds.y; - } - protected int screenXtoVirtual(int x) { - return x-fVirtualBounds.x; - } - protected int screenYtoVirtual(int y) { - return y-fVirtualBounds.y; - } - /** called when the viewed part is changing */ - private final Rectangle fViewRectangle=new Rectangle(0,0,0,0); - protected void updateViewRectangle() { - if( - fViewRectangle.x==-fVirtualBounds.x - && fViewRectangle.y==-fVirtualBounds.y - && fViewRectangle.width==fClientArea.width - && fViewRectangle.height==fClientArea.height - ) - return; - fViewRectangle.x=-fVirtualBounds.x; - fViewRectangle.y=-fVirtualBounds.y; - fViewRectangle.width=fClientArea.width; - fViewRectangle.height=fClientArea.height; - viewRectangleChanged(fViewRectangle.x,fViewRectangle.y,fViewRectangle.width,fViewRectangle.height); - } - protected Rectangle getViewRectangle() { - return cloneRectangle(fViewRectangle); - } - private Rectangle cloneRectangle(Rectangle r) { - return new Rectangle(r.x,r.y,r.width,r.height); - } - /** - * Called when the viewed part has changed. - * Override when you need this information.... - * Is only called if the values change! - * @param x visible in virtual space - * @param y visible in virtual space - * @param width - * @param height - */ - protected void viewRectangleChanged(int x, int y, int width, int height) { - } - /** - * @private - */ - private void updateScrollbars() { - // don't get into infinite loops.... - if(!fInUpdateScrollbars) { - fInUpdateScrollbars=true; - try { - doUpdateScrollbar(); - } finally { - fInUpdateScrollbars=false; - } - } else { - if(!fInUpdateScrollbarsLogged) { - fInUpdateScrollbarsLogged=true; - TerminalPlugin.getDefault().getLog().log(new Status(IStatus.WARNING, - TerminalPlugin.PLUGIN_ID, IStatus.OK, "Unexpected Recursion in terminal", //$NON-NLS-1$ - new RuntimeException())); - } - } - } - private void doUpdateScrollbar() { - Rectangle clientArea= getClientArea(); - ScrollBar horizontal= getHorizontalBar(); - // even if setVisible was called on the scrollbar, isVisible - // returns false if its parent is not visible. - if(!isVisible() || horizontal.isVisible()) { - horizontal.setPageIncrement(clientArea.width - horizontal.getIncrement()); - int max= fVirtualBounds.width; - horizontal.setMaximum(max); - horizontal.setThumb(clientArea.width); - } - ScrollBar vertical= getVerticalBar(); - // even if setVisible was called on the scrollbar, isVisible - // returns false if its parent is not visible. - if(!isVisible() || vertical.isVisible()) { - vertical.setPageIncrement(clientArea.height - vertical.getIncrement()); - int max= fVirtualBounds.height; - vertical.setMaximum(max); - vertical.setThumb(clientArea.height); - } - } - protected boolean isVertialBarVisible() { - return getVerticalBar().isVisible(); - } - protected void serVerticalBarVisible(boolean showVScrollBar) { - ScrollBar vertical= getVerticalBar(); - vertical.setVisible(showVScrollBar); - vertical.setSelection(0); - } - protected boolean isHorizontalBarVisble() { - return getHorizontalBar().isVisible(); - } - protected void setHorizontalBarVisible(boolean showHScrollBar) { - ScrollBar horizontal= getHorizontalBar(); - horizontal.setVisible(showHScrollBar); - horizontal.setSelection(0); - } -} - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/ITerminalTextData.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/ITerminalTextData.java deleted file mode 100644 index 5ce26ee..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/ITerminalTextData.java +++ /dev/null @@ -1,150 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - [261486][api][cleanup] Mark @noimplement interfaces as @noextend - * Anton Leherbauer (Wind River) - [453393] Add support for copying wrapped lines without line break - *******************************************************************************/ -package org.eclipse.tm.terminal.model; - -/** - * A writable matrix of characters and {@link Style}. This is intended to be the - * low level representation of the text of a Terminal. Higher layers are - * responsible to fill the text and styles into this representation. - *

            - * Note: Implementations of this interface has to be thread safe. - *

            - * - * @noimplement This interface is not intended to be implemented by clients. - * @noextend This interface is not intended to be extended by clients. - */ -public interface ITerminalTextData extends ITerminalTextDataReadOnly { - - /** - * Sets the dimensions of the data. If the dimensions are smaller than the current - * dimensions, the lines will be chopped. If the dimensions are bigger, then - * the new elements will be filled with 0 chars and null Style. - * @param height - * @param width - */ - void setDimensions(int height, int width); - - void setMaxHeight(int height); - int getMaxHeight(); - - /** - * Set a single character and the associated {@link Style}. - * @param line line must be >=0 and < height - * @param column column must be >=0 and < width - * @param c the new character at this position - * @param style the style or null - */ - void setChar(int line, int column, char c, Style style); - - /** - * Set an array of characters showing in the same {@link Style}. - * @param line line must be >=0 and < height - * @param column column must be >=0 and < width - * @param chars the new characters at this position - * @param style the style or null - */ - void setChars(int line, int column, char[] chars, Style style); - - /** - * Set a subrange of an array of characters showing in the same {@link Style}. - * @param line line must be >=0 and < height - * @param column column must be >=0 and < width - * @param chars the new characters at this position - * @param start the start index in the chars array - * @param len the number of characters to insert. Characters beyond width are not inserted. - * @param style the style or null - */ - void setChars(int line, int column, char[] chars, int start, int len, Style style); - - - /** - * Cleans the entire line. - * @param line - */ - void cleanLine(int line); - - /** - * Shifts some lines up or down. The "empty" space is filled with '\000' chars - * and null {@link Style} - *

            To illustrate shift, here is some sample data: - *

            -	 * 0 aaaa
            -	 * 1 bbbb
            -	 * 2 cccc
            -	 * 3 dddd
            -	 * 4 eeee
            -	 * 
            - * - * Shift a region of 3 lines up by one line shift(1,3,-1) - *
            -	 * 0 aaaa
            -	 * 1 cccc
            -	 * 2 dddd
            -	 * 3
            -	 * 4 eeee
            -	 * 
            - * - * - * Shift a region of 3 lines down by one line shift(1,3,1) - *
            -	 * 0 aaaa
            -	 * 1
            -	 * 2 bbbb
            -	 * 3 cccc
            -	 * 4 eeee
            -	 * 
            - * @param startLine the start line of the shift - * @param size the number of lines to shift - * @param shift how much scrolling is done. New scrolled area is filled with '\000'. - * Negative number means scroll down, positive scroll up (see example above). - */ - void scroll(int startLine, int size, int shift); - - /**Adds a new line to the terminal. If maxHeigth is reached, the entire terminal - * will be scrolled. Else a line will be added. - */ - void addLine(); - /** - * Copies the entire source into this and changes the size accordingly - * @param source - */ - void copy(ITerminalTextData source); - /** - * Copy a sourceLine from source to this at destLine. - * @param source - * @param sourceLine - * @param destLine - */ - void copyLine(ITerminalTextData source,int sourceLine, int destLine); - /** - * Copy length lines from source starting at sourceLine into this starting at - * destLine. - * @param source - * @param sourceStartLine - * @param destStartLine - * @param length - */ - void copyRange(ITerminalTextData source, int sourceStartLine, int destStartLine,int length); - - void setCursorLine(int line); - void setCursorColumn(int column); - - /** - * Makes this line a wrapped line which logically continues on next line. - * - * @param line - * @since 3.3 - */ - void setWrappedLine(int line); - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/ITerminalTextDataReadOnly.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/ITerminalTextDataReadOnly.java deleted file mode 100644 index d7a63ae..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/ITerminalTextDataReadOnly.java +++ /dev/null @@ -1,85 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - [261486][api][cleanup] Mark @noimplement interfaces as @noextend - * Anton Leherbauer (Wind River) - [453393] Add support for copying wrapped lines without line break - *******************************************************************************/ -package org.eclipse.tm.terminal.model; - -/** - * @noimplement This interface is not intended to be implemented by clients. - * @noextend This interface is not intended to be extended by clients. - */ -public interface ITerminalTextDataReadOnly { - - /** - * @return the width of the terminal - */ - int getWidth(); - - /** - * @return the height of the terminal - */ - int getHeight(); - - /** - * @param line be >=0 and < height - * @param startCol must be >=0 and < width - * @param numberOfCols must be > 0 - * @return a the line segments of the specified range - */ - LineSegment[] getLineSegments(int line, int startCol, int numberOfCols); - - /** - * @param line must be >=0 and < height - * @param column must be >=0 and < width - * @return the character at column,line - */ - char getChar(int line, int column); - - /** - * @param line must be >=0 and < height - * @param column must be >=0 and < width - * @return style at column,line or null - */ - Style getStyle(int line, int column); - - /** - * Creates a new instance of {@link ITerminalTextDataSnapshot} that - * can be used to track changes. Make sure to call {@link ITerminalTextDataSnapshot#detach()} - * if you don't need the snapshots anymore. - *

            Note: A new snapshot is empty and needs a call to {@link ITerminalTextDataSnapshot#updateSnapshot(boolean)} to - * get its initial values. You might want to setup the snapshot to your needs by calling - * {@link ITerminalTextDataSnapshot#setInterestWindow(int, int)}. - *

            - * @return a new instance of {@link ITerminalTextDataSnapshot} that "listens" to changes of - * this. - */ - public ITerminalTextDataSnapshot makeSnapshot(); - - char[] getChars(int line); - Style[] getStyles(int line); - - /** - * @return the line in which the cursor is at the moment - */ - int getCursorLine(); - /** - * @return the column at which the cursor is at the moment - */ - int getCursorColumn(); - - /** - * @param line - * @return true if this line got wrapped, ie. logically continues on next line - * @since 3.3 - */ - boolean isWrappedLine(int line); - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/ITerminalTextDataSnapshot.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/ITerminalTextDataSnapshot.java deleted file mode 100644 index 0d5960a..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/ITerminalTextDataSnapshot.java +++ /dev/null @@ -1,226 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - * Martin Oberhuber (Wind River) - [261486][api][cleanup] Mark @noimplement interfaces as @noextend - *******************************************************************************/ -package org.eclipse.tm.terminal.model; - -/** - * This class maintains a snapshot of an instance of {@link ITerminalTextData}. - * While the {@link ITerminalTextData} continues changing, the snapshot remains - * unchanged until the next snapshot is taken by calling - * {@link #updateSnapshot(boolean)}. This is important, because the - * {@link ITerminalTextData} might get modified by another thread. Suppose you - * would want to draw the content of the {@link ITerminalTextData} using the - * following loop: - * - *
            - * for (int line = 0; line < term.getHeight(); line++)
            - * 	for (int column = 0; column < term.getWidth(); column++)
            - * 		drawCharacter(column, line, term.getChar(column, line), term.getStyle(column, line));
            - * 
            - * - * This might fail because the background thread could change the dimensions of - * the {@link ITerminalTextData} while you iterate the loop. One solution would - * be to put a synchronized(term){} statement around the code. This - * has two problems: 1. you would have to know about the internals of the - * synchronisation of {@link ITerminalTextData}. 2. The other thread that - * changes {@link ITerminalTextData} is blocked while the potentially slow - * drawing is done. - *

            - * Solution: Take a snapshot of the terminal and use the snapshot to draw - * the content. There is no danger that the data structure get changed while you - * draw. There are also methods to find out what has changed to minimize the - * number of lines that get redrawn. - *

            - * - *

            - * Drawing optimization: To optimize redrawing of changed lines, this - * class keeps track of lines that have changed since the previous snapshot. - *

            - * - *
            - * // iterate over the potentially changed lines
            - * for (int line = snap.getFirstChangedLine(); line <= snap.getLastChangedLine(); line++)
            - * 	// redraw only if the line has changed
            - * 	if (snap.hasLineChanged(line))
            - * 		for (int column = 0; column < snap.getWidth(); column++)
            - * 			drawCharacter(column, line, snap.getChar(column, line), snap.getStyle(column, line));
            - * 
            - * - *

            - * Scroll optimization: Often new lines are appended at the bottom of the - * terminal and the rest of the lines are scrolled up. In this case all lines - * would be marked as changed. To optimize for this case, - * {@link #updateSnapshot(boolean)} can be called with true for the - * detectScrolling parameter. The object will keep track of - * scrolling. The UI must first handle the scrolling and then use the - * {@link #hasLineChanged(int)} method to determine scrolling: - * - *

            - * // scroll the visible region of the UI <b>before</b> drawing the changed lines.
            - * doUIScrolling(snap.getScrollChangeY(), snap.getScrollChangeN(), snap.getScrollChangeShift());
            - * // iterate over the potentially changed lines
            - * for (int line = snap.getFirstChangedLine(); line <= snap.getFirstChangedLine(); line++)
            - * 	// redraw only if the line has changed
            - * 	if (snap.hasLineChanged(line))
            - * 		for (int column = 0; column < snap.getWidth(); column++)
            - * 			drawCharacter(column, line, snap.getChar(column, line), snap.getStyle(column, line));
            - * 
            - * - *

            - *

            - * Threading Note: This class is not thread safe! All methods have to be - * called by the a same thread, that created the instance by calling - * {@link ITerminalTextDataReadOnly#makeSnapshot()}. - *

            - * - * @noimplement This interface is not intended to be implemented by clients. - * @noextend This interface is not intended to be extended by clients. - */ -public interface ITerminalTextDataSnapshot extends ITerminalTextDataReadOnly { - /** - * This listener gets called when the current snapshot - * is out of date. Calling {@link ITerminalTextDataSnapshot#updateSnapshot(boolean)} - * will have an effect. Once the {@link #snapshotOutOfDate(ITerminalTextDataSnapshot)} method is called, - * it will not be called until {@link ITerminalTextDataSnapshot#updateSnapshot(boolean)} - * is called and a new snapshot needs to be updated again. - *

            - * A typical terminal view would not update the snapshot immediately - * after the {@link #snapshotOutOfDate(ITerminalTextDataSnapshot)} has been called. It would introduce a - * delay to update the UI (and the snapshot} 10 or 20 times per second. - * - *

            Make sure you don't spend too much time in this method. - */ - interface SnapshotOutOfDateListener { - /** - * Gets called when the snapshot is out of date. To get the snapshot up to date, - * call {@link ITerminalTextDataSnapshot#updateSnapshot(boolean)}. - * @param snapshot The snapshot that is out of date - */ - void snapshotOutOfDate(ITerminalTextDataSnapshot snapshot); - } - void addListener(SnapshotOutOfDateListener listener); - void removeListener(SnapshotOutOfDateListener listener); - - /** - * Ends the listening to the {@link ITerminalTextData}. After this - * has been called no new snapshot data is collected. - */ - void detach(); - /** - * @return true if the data has changed since the previous snapshot. - */ - boolean isOutOfDate(); - - /** - * The window of interest is the region the snapshot should track. - * Changes outside this region are ignored. The change takes effect after - * an update! - * @param startLine -1 means track the end of the data - * @param size number of lines to track. A size of -1 means track all. - */ - void setInterestWindow(int startLine, int size); - int getInterestWindowStartLine(); - int getInterestWindowSize(); - - /** - * Create a new snapshot of the {@link ITerminalTextData}. It will efficiently - * copy the data of the {@link ITerminalTextData} into an internal representation. - * The snapshot also keeps track of the changes since the previous snapshot. - *

            With the methods {@link #getFirstChangedLine()}, {@link #getLastChangedLine()} and - * {@link #hasLineChanged(int)} - * you can find out what has changed in the current snapshot since the previous snapshot. - * @param detectScrolling if true the snapshot tries to identify scroll - * changes since the last snapshot. In this case the information about scrolling - * can be retrieved using the following methods: - * {@link #getScrollWindowStartLine()}, {@link #getScrollWindowSize()} and {@link #getScrollWindowShift()} - *
            Note: The method {@link #hasLineChanged(int)} returns changes after the - * scrolling has been applied. - */ - void updateSnapshot(boolean detectScrolling); - - /** - * @return The first line changed in this snapshot compared - * to the previous snapshot. - * - *

            Note: If no line has changed, this - * returns {@link Integer#MAX_VALUE} - * - *

            Note: if {@link #updateSnapshot(boolean)} has been called with true, - * then this does not include lines that only have been scrolled. This is the - * first line that has changed after the scroll has been applied. - */ - int getFirstChangedLine(); - - /** - * @return The last line changed in this snapshot compared - * to the previous snapshot. If the height has changed since the - * last update of the snapshot, then the returned value is within - * the new dimensions. - * - *

            Note: If no line has changed, this returns -1 - * - *

            Note: if {@link #updateSnapshot(boolean)} has been called with true, - * then this does not include lines that only have been scrolled. This is the - * last line that has changed after the scroll has been applied. - * - *

            A typical for loop using this method would look like this (note the <= in the for loop): - *

            -	 * for(int line=snap.{@link #getFirstChangedLine()}; line <= snap.getLastChangedLine(); line++)
            -	 *    if(snap.{@link #hasLineChanged(int) hasLineChanged(line)})
            -	 *       doSomething(line);
            -	 * 
            - */ - int getLastChangedLine(); - - /** - * @param line - * @return true if the line has changed since the previous snapshot - */ - boolean hasLineChanged(int line); - - boolean hasDimensionsChanged(); - - /** - * @return true if the terminal has changed (and not just the - * window of interest) - */ - boolean hasTerminalChanged(); - /** - * If {@link #updateSnapshot(boolean)} was called with true, then this method - * returns the top of the scroll region. - * @return The first line scrolled in this snapshot compared - * to the previous snapshot. See also {@link ITerminalTextData#scroll(int, int, int)}. - */ - int getScrollWindowStartLine(); - - /** - * If {@link #updateSnapshot(boolean)} was called with true, then this method - * returns the size of the scroll region. - * @return The number of lines scrolled in this snapshot compared - * to the previous snapshot. See also {@link ITerminalTextData#scroll(int, int, int)} - * If nothing has changed, 0 is returned. - */ - int getScrollWindowSize(); - - /** - * If {@link #updateSnapshot(boolean)} was called with true, then this method - * returns number of lines moved by the scroll region. - * @return The the scroll shift of this snapshot compared - * to the previous snapshot. See also {@link ITerminalTextData#scroll(int, int, int)} - */ - int getScrollWindowShift(); - - /** - * @return The {@link ITerminalTextData} on that this instance is observing. - */ - ITerminalTextData getTerminalTextData(); - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/LineSegment.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/LineSegment.java deleted file mode 100644 index 3f153dd..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/LineSegment.java +++ /dev/null @@ -1,35 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.model; - - -public class LineSegment { - private final String fText; - private final int fCol; - private final Style fStyle; - public LineSegment(int col, String text, Style style) { - fCol = col; - fText = text; - fStyle = style; - } - public Style getStyle() { - return fStyle; - } - public String getText() { - return fText; - } - public int getColumn() { - return fCol; - } - public String toString() { - return "LineSegment("+fCol+", \""+fText+"\","+fStyle+")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - } -} \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/Style.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/Style.java deleted file mode 100644 index 001ad68..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/Style.java +++ /dev/null @@ -1,154 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.model; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author scharf - * Flyweight - * Threadsafe. - * - */ -// TODO add an Object for user data, use weak map to keep track of styles with associated -// user data -public class Style { - private final StyleColor fForground; - private final StyleColor fBackground; - private final boolean fBold; - private final boolean fBlink; - private final boolean fUnderline; - private final boolean fReverse; - private final static Map fgStyles=new HashMap(); - private Style(StyleColor forground, StyleColor background, boolean bold, boolean blink, boolean underline, boolean reverse) { - fForground = forground; - fBackground = background; - fBold = bold; - fBlink = blink; - fUnderline = underline; - fReverse = reverse; - } - public static Style getStyle(StyleColor forground, StyleColor background, boolean bold, boolean blink, boolean underline, boolean reverse) { - Style style = new Style(forground,background, bold, blink,underline,reverse); - Style cached; - synchronized (fgStyles) { - cached=fgStyles.get(style); - if(cached==null) { - cached=style; - fgStyles.put(cached, cached); - } - } - return cached; - } - public static Style getStyle(String forground, String background) { - return getStyle(StyleColor.getStyleColor(forground), StyleColor.getStyleColor(background),false,false,false,false); - } - public static Style getStyle(StyleColor forground, StyleColor background) { - return getStyle(forground, background,false,false,false,false); - } - public Style setForground(StyleColor forground) { - return getStyle(forground,fBackground,fBold,fBlink,fUnderline,fReverse); - } - public Style setBackground(StyleColor background) { - return getStyle(fForground,background,fBold,fBlink,fUnderline,fReverse); - } - public Style setForground(String colorName) { - return getStyle(StyleColor.getStyleColor(colorName),fBackground,fBold,fBlink,fUnderline,fReverse); - } - public Style setBackground(String colorName) { - return getStyle(fForground,StyleColor.getStyleColor(colorName),fBold,fBlink,fUnderline,fReverse); - } - public Style setBold(boolean bold) { - return getStyle(fForground,fBackground,bold,fBlink,fUnderline,fReverse); - } - public Style setBlink(boolean blink) { - return getStyle(fForground,fBackground,fBold,blink,fUnderline,fReverse); - } - public Style setUnderline(boolean underline) { - return getStyle(fForground,fBackground,fBold,fBlink,underline,fReverse); - } - public Style setReverse(boolean reverse) { - return getStyle(fForground,fBackground,fBold,fBlink,fUnderline,reverse); - } - public StyleColor getBackground() { - return fBackground; - } - public boolean isBlink() { - return fBlink; - } - public boolean isBold() { - return fBold; - } - public StyleColor getForground() { - return fForground; - } - public boolean isReverse() { - return fReverse; - } - public boolean isUnderline() { - return fUnderline; - } - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((fBackground == null) ? 0 : fBackground.hashCode()); - result = prime * result + (fBlink ? 1231 : 1237); - result = prime * result + (fBold ? 1231 : 1237); - result = prime * result + ((fForground == null) ? 0 : fForground.hashCode()); - result = prime * result + (fReverse ? 1231 : 1237); - result = prime * result + (fUnderline ? 1231 : 1237); - return result; - } - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - final Style other = (Style) obj; - // background == is the same as equals - if (fBackground != other.fBackground) - return false; - if (fBlink != other.fBlink) - return false; - if (fBold != other.fBold) - return false; - if (fForground != other.fForground) - return false; - if (fReverse != other.fReverse) - return false; - if (fUnderline != other.fUnderline) - return false; - return true; - } - public String toString() { - StringBuffer result=new StringBuffer(); - result.append("Style(foreground="); //$NON-NLS-1$ - result.append(fForground); - result.append(", background="); //$NON-NLS-1$ - result.append(fBackground); - if(fBlink) - result.append(", blink"); //$NON-NLS-1$ - if(fBold) - result.append(", bold"); //$NON-NLS-1$ - if(fBlink) - result.append(", blink"); //$NON-NLS-1$ - if(fReverse) - result.append(", reverse"); //$NON-NLS-1$ - if(fUnderline) - result.append(", underline"); //$NON-NLS-1$ - result.append(")"); //$NON-NLS-1$ - return result.toString(); - } - -} \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/StyleColor.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/StyleColor.java deleted file mode 100644 index 98b19ad..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/StyleColor.java +++ /dev/null @@ -1,54 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.model; - -import java.util.HashMap; -import java.util.Map; - -/** - * - * Flyweight - * Threadsafe. - */ -public class StyleColor { - private final static Map fgStyleColors=new HashMap(); - final String fName; - - /** - * @param name the name of the color. It is up to the UI to associate a - * named color with a visual representation - * @return a StyleColor - */ - public static StyleColor getStyleColor(String name) { - StyleColor result; - synchronized (fgStyleColors) { - result=fgStyleColors.get(name); - if(result==null) { - result=new StyleColor(name); - fgStyleColors.put(name, result); - } - } - return result; - } - // nobody except the factory method is allowed to instantiate this class! - private StyleColor(String name) { - fName = name; - } - - public String getName() { - return fName; - } - - public String toString() { - return fName; - } - // no need to override equals and hashCode, because Object uses object identity -} \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/TerminalTextDataFactory.java b/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/TerminalTextDataFactory.java deleted file mode 100644 index 364f810..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.control/src/org/eclipse/tm/terminal/model/TerminalTextDataFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2015 Wind River Systems, Inc. and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Michael Scharf (Wind River) - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.model; - -import org.eclipse.tm.internal.terminal.model.SynchronizedTerminalTextData; -import org.eclipse.tm.internal.terminal.model.TerminalTextData; - -public class TerminalTextDataFactory { - static public ITerminalTextData makeTerminalTextData() { - return new SynchronizedTerminalTextData(new TerminalTextData()); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.control/tm32.png b/rtosTMTerminal/org.eclipse.tm.terminal.control/tm32.png deleted file mode 100644 index 668b05b79135152cc0d518da0873c4426bed32e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1349 zcmV-L1-kl)P)`(46b=_T=mH%KWS%@{pgd=vJ7=FgXrav5 z=lZ;J_mm#YqHa@FRS^##9T+$&AW$qKRV!Vab%B_9g`0SUnsR`cGGd?n*Q)BKRdH=* zCm%~IT%2)zmCx<_bAOlHt8g|qJ0Kc8EnuW(bB>3Xz zvVIpB8zmh^E+bepDP=h=Z!cu3U~h|JagFM&V=yLOJTP@cHia-}uv=<}c8IrXe5_t^ zp+;JaUTlf~`0;UUWgr?pH!EsFG=MT|wpC?>SZ9X5pnDP!AUG^+Kr(wYZoE`vgHlvg zC?HKWDP=w|b~bRnPiBlzWs6T|jX-$7+_8Qb6fG_!SUfIrJT7rJY`HgXx;JgOHf^{z zXt9Qnq58IEmy3dRa)r&x*6{E1{rvs>{QUFs^|P?RNk~;&Tw{-mpvJ?|%E;Bt%Gt}v z*2u-vsinFzGC=vSRzE*TEhASjC0t=)ZJL&@wzI{G&DYm zgn@i`jnmQGwX?!YOI6#pi!CWbO+;{7QF>ifeO^|6Usrx#SASnteqL66TvU8uSAShp zd|Fa^Qc83?HCL6Dn)#?mKtV?-AWt70FYfN{zNU#46Dc7ZKY@aSBO5~|C@k;q?Ec=+fsy0l=Qitw%5m#wuR!2QnMD=6}uDk^^0FPmr~fg4sg5%S6^Di_aR)j|a( z*RCMTUvk&N0GFXE41wmK$0Dz#C3yiPA1R_DoPGwIyq4zKa}WzooYcY&PMroCprUg4 z$Wa^$w2mDI`Eb+bEnBy3+rDGRj-5Mp?cTO$&z@~N_U_%Wd*A*82M;k+tEjA9w_XZ6 zXxgxm0qDf#D^{-RzzSBaUc;cG(zh6B*^;H0U;oVoKFu-Y(x!NNsA1}^zkQMzvqb6ixf{8%!LXaa{+uA!iIx#_4M|V#z$eT5_b@f;s(b&}7 z0t%>tLZDei#b8iUQc^4>RayoFV|Oag^_ zatahkrKXufK|(4dx}%~&Dq>XY+8lDKGY;4W#>>V7PoTXfBpvh81 z#mHD4mh7cW&0r>2n8GrSvWkeRn!1K2Sb?^Vt{w#F8zAzQkg$lTn79Nm=SfM+$jZqp zD9FpnDJmi7FE(}#PDtkE;^yJy - - - - - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.gitignore b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.gitignore deleted file mode 100644 index ae3c172..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.options b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.options deleted file mode 100644 index a0a2c87..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.options +++ /dev/null @@ -1 +0,0 @@ -org.eclipse.tm.terminal.view.core/debugmode = 0 diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.project b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.project deleted file mode 100644 index f6e4e7e..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.project +++ /dev/null @@ -1,45 +0,0 @@ - - - org.eclipse.tm.terminal.view.core - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - org.eclipse.pde.api.tools.apiAnalysisBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - org.eclipse.pde.api.tools.apiAnalysisNature - - - - 1329501981620 - - 10 - - org.eclipse.ui.ide.multiFilter - 1.0-name-matches-false-false-target - - - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.settings/org.eclipse.jdt.core.prefs b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7fc8175..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,380 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=warning -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=warning -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error -org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning -org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.6 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=0 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=0 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true -org.eclipse.jdt.core.formatter.comment.indent_root_tags=true -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=100 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=4 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=4 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=true -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=true -org.eclipse.jdt.core.formatter.lineSplit=100 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=false -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=true -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.settings/org.eclipse.jdt.ui.prefs b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 0d73226..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,62 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_Target Explorer Java STD -formatter_settings_version=12 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=false -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=false -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=true -sp_cleanup.organize_imports=true -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=true -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=false -sp_cleanup.remove_unnecessary_nls_tags=true -sp_cleanup.remove_unused_imports=true -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=false -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true -sp_cleanup.use_type_arguments=false diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.settings/org.eclipse.pde.prefs b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.settings/org.eclipse.pde.prefs deleted file mode 100644 index cf80c8b..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/.settings/org.eclipse.pde.prefs +++ /dev/null @@ -1,32 +0,0 @@ -compilers.f.unresolved-features=1 -compilers.f.unresolved-plugins=1 -compilers.incompatible-environment=1 -compilers.p.build=1 -compilers.p.build.bin.includes=1 -compilers.p.build.encodings=2 -compilers.p.build.java.compiler=2 -compilers.p.build.java.compliance=1 -compilers.p.build.missing.output=2 -compilers.p.build.output.library=1 -compilers.p.build.source.library=1 -compilers.p.build.src.includes=1 -compilers.p.deprecated=1 -compilers.p.discouraged-class=1 -compilers.p.internal=1 -compilers.p.missing-packages=1 -compilers.p.missing-version-export-package=2 -compilers.p.missing-version-import-package=1 -compilers.p.missing-version-require-bundle=1 -compilers.p.no-required-att=0 -compilers.p.not-externalized-att=2 -compilers.p.unknown-attribute=1 -compilers.p.unknown-class=1 -compilers.p.unknown-element=1 -compilers.p.unknown-identifier=1 -compilers.p.unknown-resource=1 -compilers.p.unresolved-ex-points=0 -compilers.p.unresolved-import=0 -compilers.s.create-docs=false -compilers.s.doc-folder=doc -compilers.s.open-tags=1 -eclipse.preferences.version=1 diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/META-INF/MANIFEST.MF b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/META-INF/MANIFEST.MF deleted file mode 100644 index a811429..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/META-INF/MANIFEST.MF +++ /dev/null @@ -1,21 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %pluginName -Bundle-SymbolicName: org.eclipse.tm.terminal.view.core;singleton:=true -Bundle-Version: 4.2.0.qualifier -Bundle-Activator: org.eclipse.tm.terminal.view.core.activator.CoreBundleActivator -Bundle-Vendor: %providerName -Require-Bundle: org.eclipse.core.expressions;bundle-version="3.4.400", - org.eclipse.core.runtime;bundle-version="3.8.0" -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -Bundle-ActivationPolicy: lazy -Bundle-Localization: plugin -Export-Package: org.eclipse.tm.terminal.view.core, - org.eclipse.tm.terminal.view.core.activator;x-internal:=true, - org.eclipse.tm.terminal.view.core.interfaces, - org.eclipse.tm.terminal.view.core.interfaces.constants, - org.eclipse.tm.terminal.view.core.internal;x-internal:=true, - org.eclipse.tm.terminal.view.core.nls;x-internal:=true, - org.eclipse.tm.terminal.view.core.preferences, - org.eclipse.tm.terminal.view.core.tracing, - org.eclipse.tm.terminal.view.core.utils diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.html b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.html deleted file mode 100644 index 0f07cf0..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -About - - -

            About This Content

            - -

            May 24, 2012

            -

            License

            - -

            The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise -indicated below, the Content is provided to you under the terms and conditions of the -Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available -at http://www.eclipse.org/legal/epl-v10.html. -For purposes of the EPL, "Program" will mean the Content.

            - -

            If you did not receive this Content directly from the Eclipse Foundation, the Content is -being redistributed by another party ("Redistributor") and different terms and conditions may -apply to your use of any object code in the Content. Check the Redistributor's license that was -provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise -indicated below, the terms and conditions of the EPL still apply to any source code in the Content -and such source code may be obtained at http://www.eclipse.org.

            - - - \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.ini b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.ini deleted file mode 100644 index 3adc27a..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.ini +++ /dev/null @@ -1,27 +0,0 @@ -# about.ini -# contains information about a feature -# java.io.Properties file (ISO 8859-1 with "\" escapes) -# "%key" are externalized strings defined in about.properties -# This file does not need to be translated. - -# Property "aboutText" contains blurb for "About" dialog (translated) -aboutText=%blurb - -# Property "windowImage" contains path to window icon (16x16) -# needed for primary features only - -# Property "featureImage" contains path to feature image (32x32) -featureImage=tm32.png - -# Property "aboutImage" contains path to product image (500x330 or 115x164) -# needed for primary features only - -# Property "appName" contains name of the application (not translated) -# needed for primary features only - -# Property "welcomePage" contains path to welcome page (special XML-based format) -# optional - -# Property "welcomePerspective" contains the id of the perspective in which the -# welcome page is to be opened. -# optional \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.mappings b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.mappings deleted file mode 100644 index bddaab4..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.mappings +++ /dev/null @@ -1,6 +0,0 @@ -# about.mappings -# contains fill-ins for about.properties -# java.io.Properties file (ISO 8859-1 with "\" escapes) -# This file does not need to be translated. - -0=@build@ \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.properties b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.properties deleted file mode 100644 index 35d7bbe..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/about.properties +++ /dev/null @@ -1,24 +0,0 @@ -################################################################################ -# Copyright (c) 2006, 2016 Wind River Systems, Inc. and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Eclipse Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/epl-v10.html -# -# Contributors: -# Martin Oberhuber - initial API and implementation -################################################################################ -# about.properties -# contains externalized strings for about.ini -# java.io.Properties file (ISO 8859-1 with "\" escapes) -# fill-ins are supplied by about.mappings -# This file should be translated. -# -# Do not translate any values surrounded by {} - -blurb=TM Terminal\n\ -\n\ -Version: {featureVersion}\n\ -\n\ -(c) Copyright Wind River Systems, Inc. and others 2011, 2016. All rights reserved.\n\ -Visit http://marketplace.eclipse.org/content/tm-terminal diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/build.properties b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/build.properties deleted file mode 100644 index 01e440a..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/build.properties +++ /dev/null @@ -1,20 +0,0 @@ -############################################################################### -# Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. -# This program and the accompanying materials are made available under the terms -# of the Eclipse Public License v1.0 which accompanies this distribution, and is -# available at http://www.eclipse.org/legal/epl-v10.html -# -# Contributors: -# Wind River Systems - initial API and implementation -############################################################################### -source.. = src/ -output.. = bin/ -bin.includes = META-INF/,\ - .,\ - plugin.properties,\ - about.html,\ - plugin.xml,\ - about.ini,\ - about.mappings,\ - about.properties,\ - tm32.png diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/plugin.properties b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/plugin.properties deleted file mode 100644 index 15d6077..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/plugin.properties +++ /dev/null @@ -1,14 +0,0 @@ -################################################################################## -# Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. -# This program and the accompanying materials are made available under the terms -# of the Eclipse Public License v1.0 which accompanies this distribution, and is -# available at http://www.eclipse.org/legal/epl-v10.html -# -# Contributors: -# Wind River Systems - initial API and implementation -################################################################################## - -pluginName = Terminal View Core -providerName = Eclipse.org - Target Management - -ExtensionPoint.contextPropertiesProviders = Terminal Context Properties Providers diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/plugin.xml b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/plugin.xml deleted file mode 100644 index c9373fa..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/plugin.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/pom.xml b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/pom.xml deleted file mode 100644 index 4acad71..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/pom.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 4.0.0 - - - org.eclipse.tm.terminal - org.eclipse.tm.terminal.maven-build - 4.2.0-SNAPSHOT - ../../admin/pom-build.xml - - - 4.2.0-SNAPSHOT - org.eclipse.tm.terminal.view.core - eclipse-plugin - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/schema/contextPropertiesProviders.exsd b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/schema/contextPropertiesProviders.exsd deleted file mode 100644 index 42db131..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/schema/contextPropertiesProviders.exsd +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - This extension point is used to contribute terminal context properties providers. The context properties provider allows querying desired properties for a given context. -<p> -The terminal context is passed in as default variable to the enablement expression evaluation. The terminal context is not expected to be iteratable or countable. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Declares a terminal context properties provider contribution. - - - - - - - - - - The class that implements <code>org.eclipse.tm.terminal.view.core.interfaces.ITerminalContextPropertiesProvider</code>. - - - - - - - - - - - - - - - TM Terminal 4.0.0 - - - - - - - - - This is an example of the extension point usage: -<p> -<pre><code> - <extension point="org.eclipse.tm.terminal.view.core.contextPropertiesProviders"> - <contextPropertiesProvider - class="com.my.contribution.MyContextPropertiesProviderImpl"> - </contextPropertiesProvider> - </extension> -</code></pre> - - - - - - - - - The provider of a terminal context properties provider must implement <samp>org.eclipse.tm.terminal.view.core.interfaces.ITerminalContextPropertiesProvider</samp>. - - - - - - - - - - Copyright (c) 2015 Wind River Systems, Inc. and others. - -All rights reserved. - -This program and the accompanying materials are made available under the terms -of the Eclipse Public License v1.0 which accompanies this distribution, and is -available at http://www.eclipse.org/legal/epl-v10.html. - - - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/TerminalContextPropertiesProviderFactory.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/TerminalContextPropertiesProviderFactory.java deleted file mode 100644 index 9d26a00..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/TerminalContextPropertiesProviderFactory.java +++ /dev/null @@ -1,228 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.core.expressions.EvaluationContext; -import org.eclipse.core.expressions.EvaluationResult; -import org.eclipse.core.expressions.Expression; -import org.eclipse.core.expressions.ExpressionConverter; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; -import org.eclipse.core.runtime.IExecutableExtension; -import org.eclipse.core.runtime.IExtension; -import org.eclipse.core.runtime.IExtensionPoint; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.osgi.util.NLS; -import org.eclipse.tm.terminal.view.core.activator.CoreBundleActivator; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalContextPropertiesProvider; -import org.eclipse.tm.terminal.view.core.nls.Messages; - -/** - * Terminal context properties provider factory. - */ -public final class TerminalContextPropertiesProviderFactory { - // Flag to remember if the contributions got loaded - private static boolean contributionsLoaded = false; - - // The list of all loaded contributions - private static final List contributions = new ArrayList(); - - // The proxy used to achieve lazy class loading and plug-in activation - private static class Proxy implements IExecutableExtension { - // Reference to the configuration element - private IConfigurationElement configElement = null; - // The class implementing the provider - public String clazz; - // The context properties provider instance - private ITerminalContextPropertiesProvider provider = null; - // The converted expression - private Expression expression; - - /** - * Constructor. - */ - protected Proxy() { - } - - /* (non-Javadoc) - * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement, java.lang.String, java.lang.Object) - */ - @Override - public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException { - Assert.isNotNull(config); - this.configElement = config; - - // Read the class attribute. - // Throws an exception if the attribute value is empty or null. - clazz = config.getAttribute("class"); //$NON-NLS-1$ - if (clazz == null || "".equals(clazz.trim())) { //$NON-NLS-1$ - throw new CoreException(new Status(IStatus.ERROR, - CoreBundleActivator.getUniqueIdentifier(), - NLS.bind(Messages.Extension_error_missingRequiredAttribute, "class", config.getContributor().getName()))); //$NON-NLS-1$ - } - - // Read the "enablement" sub element of the extension - IConfigurationElement[] children = configElement.getChildren("enablement"); //$NON-NLS-1$ - if (children == null || children.length == 0) { - throw new CoreException(new Status(IStatus.ERROR, - CoreBundleActivator.getUniqueIdentifier(), - NLS.bind(Messages.Extension_error_missingRequiredAttribute, "enablement", config.getContributor().getName()))); //$NON-NLS-1$ - } - // Only one "enablement" element is expected - expression = ExpressionConverter.getDefault().perform(children[0]); - } - - /** - * Return the real terminal context properties provider instance for this proxy. - */ - protected ITerminalContextPropertiesProvider getProvider() { - if (provider == null && configElement != null) { - try { - // Create the service class instance via the configuration element - Object provider = configElement.createExecutableExtension("class"); //$NON-NLS-1$ - if (provider instanceof ITerminalContextPropertiesProvider) { - this.provider = (ITerminalContextPropertiesProvider)provider; - } - else { - IStatus status = new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), "Terminal context properties provider '" + provider.getClass().getName() + "' not of type ITerminalContextPropertiesProvider."); //$NON-NLS-1$ //$NON-NLS-2$ - Platform.getLog(CoreBundleActivator.getContext().getBundle()).log(status); - } - } - catch (CoreException e) { - IStatus status = new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), "Cannot create terminal context properties provider '" + clazz + "'.", e); //$NON-NLS-1$ //$NON-NLS-2$ - Platform.getLog(CoreBundleActivator.getContext().getBundle()).log(status); - } - } - return provider; - } - - /** - * Returns if or if not the context properties provider contribution is enabled for - * the given terminal context. - * - * @param context The terminal context or null. - * @return True if the context properties provider contribution is enabled - * for the given terminal context, false otherwise. - */ - protected boolean isEnabled(Object context) { - if (context == null) { - return getEnablement() == null; - } - - Expression enablement = getEnablement(); - - // The service contribution is enabled by default if no expression is specified. - boolean enabled = enablement == null; - - if (enablement != null) { - // Set the default variable to the service context. - EvaluationContext evalContext = new EvaluationContext(null, context); - // Allow plug-in activation - evalContext.setAllowPluginActivation(true); - // Evaluate the expression - try { - enabled = enablement.evaluate(evalContext).equals(EvaluationResult.TRUE); - } catch (CoreException e) { - IStatus status = new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), e.getLocalizedMessage(), e); - Platform.getLog(CoreBundleActivator.getContext().getBundle()).log(status); - } - } - - return enabled; - } - - /** - * Returns the enablement expression. - * - * @return The enablement expression or null. - */ - protected Expression getEnablement() { - return expression; - } - } - - - /** - * Creates a new terminal context properties provider proxy instance and initialize it. - * - * @param config The configuration element. Must not be null. - * @return The new terminal context properties provider proxy instance. - */ - private static Proxy getProxy(IConfigurationElement config) { - Assert.isNotNull(config); - Proxy proxy = new Proxy(); - try { - proxy.setInitializationData(config, null, null); - } catch (CoreException e) { - if (Platform.inDebugMode()) { - Platform.getLog(CoreBundleActivator.getContext().getBundle()).log(e.getStatus()); - } - } - return proxy; - } - - /** - * Load the terminal context properties provider contributions. - */ - private static void loadContributions() { - IExtensionPoint ep = Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.tm.terminal.view.core.contextPropertiesProviders"); //$NON-NLS-1$ - if (ep != null) { - IExtension[] extensions = ep.getExtensions(); - if (extensions != null) { - for (IExtension extension : extensions) { - IConfigurationElement[] configElements = extension.getConfigurationElements(); - if (configElements != null) { - for (IConfigurationElement configElement : configElements) { - if ("contextPropertiesProvider".equals(configElement.getName())) { //$NON-NLS-1$ - Proxy proxy = getProxy(configElement); - contributions.add(proxy); - } - } - } - } - } - } - } - - /** - * Get the terminal context properties provider for the given context. The first terminal - * context properties provider which is enabled is returned. - * - * @param context The terminal context. Must not be null. - * - * @return The service or null. - */ - public static ITerminalContextPropertiesProvider getProvider(Object context) { - Assert.isNotNull(context); - - // Load the contributions if not yet loaded - synchronized (contributions) { - if (!contributionsLoaded) { - loadContributions(); - contributionsLoaded = true; - } - } - - for (Proxy proxy : contributions) { - if (proxy.isEnabled(context)) { - return proxy.getProvider(); - } - } - - return null; - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/TerminalServiceFactory.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/TerminalServiceFactory.java deleted file mode 100644 index 7dd819a..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/TerminalServiceFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core; - -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.tm.terminal.view.core.activator.CoreBundleActivator; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalService; -import org.eclipse.tm.terminal.view.core.nls.Messages; -import org.osgi.framework.Bundle; - -/** - * Terminal service factory implementation. - *

            - * Provides access to the terminal service instance. - */ -public final class TerminalServiceFactory { - private static ITerminalService instance = null; - - static { - // Tries to instantiate the terminal service implementation - // from the o.e.tm.terminal.view.ui bundle - Bundle bundle = Platform.getBundle("org.eclipse.tm.terminal.view.ui"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - try { - Class clazz = bundle.loadClass("org.eclipse.tm.terminal.view.ui.services.TerminalService"); //$NON-NLS-1$ - instance = (ITerminalService) clazz.newInstance(); - } - catch (Exception e) { - if (Platform.inDebugMode()) { - Platform.getLog(bundle).log(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), Messages.TerminalServiceFactory_error_serviceImplLoadFailed, e)); - } - } - } - } - - /** - * Returns the terminal service instance. - */ - public static ITerminalService getService() { - return instance; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/activator/CoreBundleActivator.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/activator/CoreBundleActivator.java deleted file mode 100644 index 16e0ed8..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/activator/CoreBundleActivator.java +++ /dev/null @@ -1,56 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core.activator; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; - -/** - * The activator class controls the plug-in life cycle - */ -public class CoreBundleActivator implements BundleActivator { - // The bundle context - private static BundleContext context; - - /** - * Returns the bundle context - * - * @return the bundle context - */ - public static BundleContext getContext() { - return context; - } - - /** - * Convenience method which returns the unique identifier of this plug-in. - */ - public static String getUniqueIdentifier() { - if (getContext() != null && getContext().getBundle() != null) { - return getContext().getBundle().getSymbolicName(); - } - return "org.eclipse.tm.terminal.view.core"; //$NON-NLS-1$ - } - - /* (non-Javadoc) - * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) - */ - @Override - public void start(BundleContext bundleContext) throws Exception { - CoreBundleActivator.context = bundleContext; - } - - /* (non-Javadoc) - * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) - */ - @Override - public void stop(BundleContext bundleContext) throws Exception { - CoreBundleActivator.context = null; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalContextPropertiesProvider.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalContextPropertiesProvider.java deleted file mode 100644 index 86dd363..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalContextPropertiesProvider.java +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core.interfaces; - -import java.util.Map; - -/** - * Terminal context properties provider. - *

            - * The context properties provider allows querying desired properties - * for a given context. The context is typically an element from a selection - * and the inner structure of the element is unknown to the terminal. - */ -public interface ITerminalContextPropertiesProvider { - - /** - * Returns a unmodifiable map containing the target address and port for the given context, - * if it can be determined. - *

            - * A context may return multiple target addresses and ports if the context can be reached using - * different connection methods. - *

            - * Note: - *

              - *
            • See the constants defined in the context provider constants interface for default - * address and port types.
            • - *
            • The target address returned must not necessarily be an IP address.
            • - *
            • The values of the address or port properties might be null.
            • - *
            - * - * @param context The context to get the target addresses and ports from. Must not be null. - * @return The unmodifiable map containing the target addresses and ports, or null. - */ - public Map getTargetAddress(Object context); - - /** - * Returns the property value stored under the given property key. If the property does not - * exist, null is returned. - * - * @param context The context to get the property from. Must not be null. - * @param key The property key. Must not be null. - * - * @return The stored property value or null. - */ - public Object getProperty(Object context, String key); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalService.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalService.java deleted file mode 100644 index 7633762..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalService.java +++ /dev/null @@ -1,73 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 - 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core.interfaces; - -import java.util.Map; - -import org.eclipse.core.runtime.IStatus; - -/** - * Terminal service. - */ -public interface ITerminalService { - - /** - * Client call back interface. - */ - public interface Done { - /** - * Called when the terminal service operation is done. - * - * @param status The status of the terminal service operation. - */ - public void done(IStatus status); - } - - /** - * Opens a terminal asynchronously and invokes the given callback if done. - * - * @param properties The terminal properties. Must not be null. - * @param done The callback to invoke if finished or null. - */ - public void openConsole(Map properties, Done done); - - /** - * Close the terminal asynchronously and invokes the given callback if done. - * - * @param properties The terminal properties. Must not be null. - * @param done The callback to invoke if finished or null. - */ - public void closeConsole(Map properties, Done done); - - /** - * Terminate (disconnect) the terminal asynchronously and invokes the given callback if done. - * - * @param properties The terminal properties. Must not be null. - * @param done The callback to invoke if finished or null. - */ - public void terminateConsole(Map properties, Done done); - - /** - * Register the given listener to receive notifications about terminal events. - * Calling this method multiple times with the same listener has no effect. - - * @param listener The terminal tab listener. Must not be null. - */ - public void addTerminalTabListener(ITerminalTabListener listener); - - /** - * Unregister the given listener from receiving notifications about terminal - * events. Calling this method multiple times with the same listener - * has no effect. - * - * @param listener The terminal tab listener. Must not be null. - */ - public void removeTerminalTabListener(ITerminalTabListener listener); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalServiceOutputStreamMonitorListener.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalServiceOutputStreamMonitorListener.java deleted file mode 100644 index 0205f4c..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalServiceOutputStreamMonitorListener.java +++ /dev/null @@ -1,27 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014 - 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core.interfaces; - -/** - * An interface to be implemented by listeners who want to listen - * to the streams data without interfering with the original data receiver. - *

            - * Listeners are invoked within the monitor processing thread. - */ -public interface ITerminalServiceOutputStreamMonitorListener { - - /** - * Signals that some content has been read from the monitored stream. - * - * @param byteBuffer The byte stream. Must not be null. - * @param bytesRead The number of bytes that were read into the read buffer. - */ - public void onContentReadFromStream(byte[] byteBuffer, int bytesRead); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalTabListener.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalTabListener.java deleted file mode 100644 index e4e35fa..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/ITerminalTabListener.java +++ /dev/null @@ -1,27 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core.interfaces; - -/** - * Listener to implement and to register to get notified about - * terminal tabs events, like the disposal of a terminal tab. - */ -public interface ITerminalTabListener { - - /** - * Invoked once a terminal tab got disposed. The source object is - * the disposed tab item and data is the custom data object associated - * with the disposed tab item. - * - * @param source The disposed tab item. Must not be null. - * @param data The custom data object associated with the disposed tab item or null. - */ - public void terminalTabDisposed(Object source, Object data); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/IContextPropertiesConstants.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/IContextPropertiesConstants.java deleted file mode 100644 index b9d2b55..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/IContextPropertiesConstants.java +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core.interfaces.constants; - -/** - * Defines the terminal context properties constants. - */ -public interface IContextPropertiesConstants { - - /** - * Target name. - *

            - * The target name is not meant to be identical with the targets network name. It can - * be the targets network name, but it can be any other string identifying the target - * to the user as well. The name is for display only, it is not meant to be used for - * communicating with the target. - */ - public static String PROP_NAME = "name"; //$NON-NLS-1$ - - /** - * Target agent address. - *

            - * The value is typically the address an agent running at the target. - */ - public static String PROP_ADDRESS = "address"; //$NON-NLS-1$ - - /** - * Target agent port. - *

            - * The value is typically the port an agent running at the target. - */ - public static String PROP_PORT = "port"; //$NON-NLS-1$ - - /** - * The default user name to use to log into the target. - */ - public static String PROP_DEFAULT_USER = "defaultUser"; //$NON-NLS-1$ - - /** - * The default encoding to use. - */ - public static String PROP_DEFAULT_ENCODING = "defaultEncoding"; //$NON-NLS-1$ -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/ILineSeparatorConstants.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/ILineSeparatorConstants.java deleted file mode 100644 index 7f147c3..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/ILineSeparatorConstants.java +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 - 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core.interfaces.constants; - -/** - * Line separator constants. - */ -public interface ILineSeparatorConstants { - - /** - * The line separator setting CR (carriage return only; for example, used by Mac OS 9). - */ - public final static String LINE_SEPARATOR_CR = "\\r"; //$NON-NLS-1$ - - /** - * The line separator setting CRLF (carriage return and line feed; for example, used by - * Windows). - */ - public final static String LINE_SEPARATOR_CRLF = "\\r\\n"; //$NON-NLS-1$ - - /** - * The line separator setting LF (line feed only; used by all UNIX-based systems). - */ - public final static String LINE_SEPARATOR_LF = "\\n"; //$NON-NLS-1$ -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/ITerminalsConnectorConstants.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/ITerminalsConnectorConstants.java deleted file mode 100644 index ebd5dd8..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/interfaces/constants/ITerminalsConnectorConstants.java +++ /dev/null @@ -1,336 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2016 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Max Weninger (Wind River) - [361352] [TERMINALS][SSH] Add SSH terminal support - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core.interfaces.constants; - -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalServiceOutputStreamMonitorListener; - - -/** - * Defines the terminals connector constants. - * - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - */ -public interface ITerminalsConnectorConstants { - - /** - * Property: The unique id of the terminals view to open. - *

            - * Property Type: {@link String} - */ - public static final String PROP_ID = "id"; //$NON-NLS-1$ - - /** - * Property: The unique secondary id of the terminals view to open. - *

            - * Property Type: {@link String} - */ - public static final String PROP_SECONDARY_ID = "secondaryId"; //$NON-NLS-1$ - - /** - * Property: The title of the terminal tab to open. - *

            - * Property Type: {@link String} - */ - public static final String PROP_TITLE = "title"; //$NON-NLS-1$ - - /** - * Property: The encoding of the terminal tab to open. - *

            - * Property Type: {@link String} - */ - public static final String PROP_ENCODING = "encoding"; //$NON-NLS-1$ - - /** - * Property: Custom data object to associate with the terminal tab. - *

            - * Property Type: {@link Object} - */ - public static final String PROP_DATA = "data"; //$NON-NLS-1$ - - /** - * Property: External selection to associate with the terminal tab. - *

            - * Property Type: {@link org.eclipse.jface.viewers.ISelection} - */ - public static final String PROP_SELECTION = "selection"; //$NON-NLS-1$ - - /** - * Property: Flag to force a new terminal tab. - *

            - * Property Type: {@link Boolean} - */ - public static final String PROP_FORCE_NEW = "terminal.forceNew"; //$NON-NLS-1$ - - /** - * Property: Terminal launcher delegate id. - *

            - * Property Type: {@link String} - */ - public static final String PROP_DELEGATE_ID = "delegateId"; //$NON-NLS-1$ - - /** - * Property: Specific terminal connector type id. Allows clients to - * override the specifically used terminal connector - * implementation for a given type. - *

            - * Property Type: {@link String} - */ - public static final String PROP_TERMINAL_CONNECTOR_ID = "tm.terminal.connector.id"; //$NON-NLS-1$ - - // ***** Generic terminals connector properties ***** - - /** - * Property: Timeout to be passed to the terminal connector. The specific terminal - * connector implementation may interpret this value differently. If not - * set, the terminal connector may use a default value. - *

            - * Property Type: {@link Integer} - */ - public static final String PROP_TIMEOUT = "timeout"; //$NON-NLS-1$ - - /** - * Property: Flag to control if a local echo is needed from the terminal widget. - *

            Typical for process and streams terminals. - *

            - * Property Type: {@link Boolean} - */ - public static final String PROP_LOCAL_ECHO = "localEcho"; //$NON-NLS-1$ - - /** - * Property: Data flag to tell the terminal to not reconnect when hitting enter - * in a disconnected terminal. - *

            - * Property Type: {@link Boolean} - */ - public static final String PROP_DATA_NO_RECONNECT = "data.noReconnect"; //$NON-NLS-1$ - - /** - * Property: The line separator expected by the remote terminal on input streams and - * send by the remote terminal on output streams. - *

            Typical for process and streams terminals. - *

            - * Property Type: {@link String} - */ - public static final String PROP_LINE_SEPARATOR = "lineSeparator"; //$NON-NLS-1$ - - /** - * Property: The list of stdout listeners to attach to the corresponding stream monitor. - *

            Typical for process and streams terminals. - *

            - * Property Type: {@link ITerminalServiceOutputStreamMonitorListener} array - */ - public static final String PROP_STDOUT_LISTENERS = "stdoutListeners"; //$NON-NLS-1$ - - /** - * Property: The list of stderr listeners to attach to the corresponding stream monitor. - *

            Typical for process and streams terminals. - *

            - * Property Type: {@link ITerminalServiceOutputStreamMonitorListener} array - */ - public static final String PROP_STDERR_LISTENERS = "stderrListeners"; //$NON-NLS-1$ - - /** - * Property: If set to true, backslashes are translated to - * slashes before pasting the text to the terminal widget. - *

            - * Property Type: {@link Boolean} - */ - public static final String PROP_TRANSLATE_BACKSLASHES_ON_PASTE = "translateBackslashesOnPaste"; //$NON-NLS-1$ - - // ***** IP based terminals connector properties ***** - - /** - * Property: Host name or IP address the terminal server is running. - *

            Typical for telnet or ssh terminals. - *

            - * Property Type: {@link String} - */ - public static final String PROP_IP_HOST = "ip.host"; //$NON-NLS-1$ - - /** - * Property: Port at which the terminal server is providing the console input and output. - *

            Typical for telnet or ssh terminals. - *

            - * Property Type: {@link Integer} - */ - public static final String PROP_IP_PORT = "ip.port"; //$NON-NLS-1$ - - /** - * Property: An offset to add to the specified port number. - *

            Typical for telnet or ssh terminals. - *

            - * Property Type: {@link Integer} - */ - public static final String PROP_IP_PORT_OFFSET = "ip.port.offset"; //$NON-NLS-1$ - - // ***** Process based terminals connector properties ***** - - /** - * Property: Process image path. - *

            Typical for process terminals. - *

            - * Property Type: {@link String} - */ - public static final String PROP_PROCESS_PATH = "process.path"; //$NON-NLS-1$ - - /** - * Property: Process arguments. - *

            Typical for process terminals. - *

            - * Property Type: {@link String} - */ - public static final String PROP_PROCESS_ARGS = "process.args"; //$NON-NLS-1$ - - /** - * Property: Process arguments. - *

            Typical for process terminals. - *

            - * Property Type: {@link String} - */ - public static final String PROP_PROCESS_WORKING_DIR = "process.working_dir"; //$NON-NLS-1$ - - /** - * Property: Process environment. - *

            Typical for process terminals. - *

            - * Property Type: {@link String} array - */ - public static final String PROP_PROCESS_ENVIRONMENT = "process.environment"; //$NON-NLS-1$ - - /** - * Property: Flag to merge process environment with native environment. - *

            Typical for process terminals. - *

            - * Property Type: {@link Boolean} - */ - public static final String PROP_PROCESS_MERGE_ENVIRONMENT = "process.environment.merge"; //$NON-NLS-1$ - - /** - * Property: Runtime process instance. - *

            Typical for process terminals. - *

            - * Property Type: {@link Process} - */ - public static final String PROP_PROCESS_OBJ = "process"; //$NON-NLS-1$ - - /** - * Property: Runtime process PTY instance. - *

            Typical for process terminals. - *

            - * Property Type: {@link org.eclipse.cdt.utils.pty.PTY} - */ - public static final String PROP_PTY_OBJ = "pty"; //$NON-NLS-1$ - - // ***** Streams based terminals connector properties ***** - - /** - * Property: Stdin streams instance. - *

            Typical for streams terminals. - *

            - * Property Type: {@link OutputStream} - */ - public static final String PROP_STREAMS_STDIN = "streams.stdin"; //$NON-NLS-1$ - - /** - * Property: Stdout streams instance. - *

            Typical for streams terminals. - *

            - * Property Type: {@link InputStream} - */ - public static final String PROP_STREAMS_STDOUT = "streams.stdout"; //$NON-NLS-1$ - - /** - * Property: Stderr streams instance. - *

            Typical for streams terminals. - *

            - * Property Type: {@link InputStream} - */ - public static final String PROP_STREAMS_STDERR = "streams.stderr"; //$NON-NLS-1$ - - // ***** Ssh specific properties ***** - - /** - * Property: ssh keep alive value. - *

            - * Property Type: {@link Integer} - */ - public static final String PROP_SSH_KEEP_ALIVE = "ssh.keep_alive"; //$NON-NLS-1$ - - /** - * Property: Ssh password. - *

            - * Property Type: {@link String} - */ - public static final String PROP_SSH_PASSWORD = "ssh.password"; //$NON-NLS-1$ - - /** - * Property: Ssh user. - *

            - * Property Type: {@link String} - */ - public static final String PROP_SSH_USER = "ssh.user"; //$NON-NLS-1$ - - // ***** Serial specific properties ***** - - /** - * The serial device name. - *

            - * Property Type: {@link String} - */ - public static final String PROP_SERIAL_DEVICE = "serial.device"; //$NON-NLS-1$ - - /** - * The baud rate. - *

            - * Property Type: {@link String} - */ - public static final String PROP_SERIAL_BAUD_RATE = "serial.baudrate"; //$NON-NLS-1$ - - /** - * The data bits - *

            - * Property Type: {@link String} - */ - public static final String PROP_SERIAL_DATA_BITS = "serial.databits"; //$NON-NLS-1$ - - /** - * The parity - *

            - * Property Type: {@link String} - */ - public static final String PROP_SERIAL_PARITY = "serial.parity"; //$NON-NLS-1$ - - /** - * The stop bits - *

            - * Property Type: {@link String} - */ - public static final String PROP_SERIAL_STOP_BITS = "serial.stopbits"; //$NON-NLS-1$ - - /** - * The flow control - *

            - * Property Type: {@link String} - */ - public static final String PROP_SERIAL_FLOW_CONTROL = "serial.flowcontrol"; //$NON-NLS-1$ - - // ***** Telnet specific properties ***** - - /** - * The end-of-line sequence to be sent to the server on "Enter". - *

            - * Property Type: {@link String} - * @since 4.2 - */ - public static final String PROP_TELNET_EOL = "telnet.eol"; //$NON-NLS-1$ - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/internal/PropertyTester.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/internal/PropertyTester.java deleted file mode 100644 index ceca0ef..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/internal/PropertyTester.java +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 - 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core.internal; - -import org.eclipse.tm.terminal.view.core.TerminalContextPropertiesProviderFactory; - - - -/** - * Property tester implementation. - */ -public class PropertyTester extends org.eclipse.core.expressions.PropertyTester { - - /* (non-Javadoc) - * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object) - */ - @Override - public boolean test(Object receiver, String property, Object[] args, Object expectedValue) { - - // "hasContextPropertiesProvider": Checks if a context properties provider is available for the given receiver. - if ("hasContextPropertiesProvider".equals(property)) { //$NON-NLS-1$ - boolean hasProvider = TerminalContextPropertiesProviderFactory.getProvider(receiver) != null; - return expectedValue instanceof Boolean ? ((Boolean)expectedValue).equals(Boolean.valueOf(hasProvider)) : hasProvider; - } - - return false; - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/nls/Messages.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/nls/Messages.java deleted file mode 100644 index f382eea..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/nls/Messages.java +++ /dev/null @@ -1,35 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core.nls; - -import org.eclipse.osgi.util.NLS; - -/** - * Externalized strings management. - */ -public class Messages extends NLS { - - // The plug-in resource bundle name - private static final String BUNDLE_NAME = "org.eclipse.tm.terminal.view.core.nls.Messages"; //$NON-NLS-1$ - - /** - * Static constructor. - */ - static { - // Load message values from bundle file - NLS.initializeMessages(BUNDLE_NAME, Messages.class); - } - - // **** Declare externalized string id's down here ***** - - public static String TerminalServiceFactory_error_serviceImplLoadFailed; - - public static String Extension_error_missingRequiredAttribute; -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/nls/Messages.properties b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/nls/Messages.properties deleted file mode 100644 index 212cd18..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/nls/Messages.properties +++ /dev/null @@ -1,14 +0,0 @@ -############################################################################### -# Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. -# This program and the accompanying materials are made available under the terms -# of the Eclipse Public License v1.0 which accompanies this distribution, and is -# available at http://www.eclipse.org/legal/epl-v10.html -# -# Contributors: -# Wind River Systems - initial API and implementation -############################################################################### - -TerminalServiceFactory_error_serviceImplLoadFailed=Failed to load terminal service implementation. - -Extension_error_missingRequiredAttribute=Required attribute "{0}" missing for extension "{1}"! - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/preferences/ScopedEclipsePreferences.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/preferences/ScopedEclipsePreferences.java deleted file mode 100644 index d9e974b..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/preferences/ScopedEclipsePreferences.java +++ /dev/null @@ -1,459 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core.preferences; - -import java.io.OutputStream; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.ISafeRunnable; -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.SafeRunner; -import org.eclipse.core.runtime.preferences.DefaultScope; -import org.eclipse.core.runtime.preferences.IEclipsePreferences; -import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener; -import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; -import org.eclipse.core.runtime.preferences.IPreferenceFilter; -import org.eclipse.core.runtime.preferences.IScopeContext; -import org.eclipse.core.runtime.preferences.InstanceScope; -import org.osgi.service.prefs.BackingStoreException; - -/** - * Helper class to handle scoped Eclipse preferences for plug-in's. Scoped - * preferences means a given preference context plus the default preferences - * scope. - *

            - * On changes a {@link PreferenceChangeEvent} is sent to inform all listeners of the change. - * - * @see IEclipsePreferences - * @see IEclipsePreferences.PreferenceChangeEvent - * @see IEclipsePreferences.IPreferenceChangeListener - */ -public class ScopedEclipsePreferences { - /** - * The preferences scope qualifier. - */ - private final String qualifier; - - /** - * The default scope preference node. - */ - protected final IEclipsePreferences defaultPrefs; - - /** - * The context scope preference node. - */ - protected final IEclipsePreferences contextScopePrefs; - - /** - * The registered preference change listeners. - */ - private final ListenerList listeners = new ListenerList(); - - /** - * Constructor. - *

            - * Initialize the scoped preferences with a new instance scope for the given qualifier. The default - * scope is determined by calling DefaultScope().getNode(qualifier). - * - * @param qualifier The qualifier for the preferences (in example the unique identifier of a plugin). Must not be null. - */ - public ScopedEclipsePreferences(String qualifier) { - this(InstanceScope.INSTANCE, qualifier); - } - - /** - * Constructor. - *

            - * Initialize the scoped preferences with the given scope. The default scope - * is determined by calling DefaultScope().getNode(qualifier). - * - * @param context The preference scope context. Must not be null. - * @param qualifier The qualifier for the preferences (in example the unique identifier of a plugin). Must not be null. - */ - public ScopedEclipsePreferences(IScopeContext context, String qualifier) { - Assert.isNotNull(context); - Assert.isNotNull(qualifier); - this.qualifier = qualifier; - defaultPrefs = DefaultScope.INSTANCE.getNode(getQualifier()); - contextScopePrefs = context.getNode(getQualifier()); - } - - /** - * Returns the qualifier that is used to get the preferences. - * For plugin preferences, this is the unique identifier of the plugin. - */ - protected final String getQualifier() { - return qualifier; - } - - /** - * Exports the preferences to the stream. - *

            - * Note: The stream will be closed after the export. - * - * @param stream The stream to where preferences and defaults should be exported. - */ - public void exportPreferences(OutputStream stream) { - Assert.isNotNull(stream); - try { - IPreferenceFilter filter = new IPreferenceFilter() { - /* (non-Javadoc) - * @see org.eclipse.core.runtime.preferences.IPreferenceFilter#getScopes() - */ - @Override - public String[] getScopes() { - return new String[] { InstanceScope.SCOPE }; - } - /* (non-Javadoc) - * @see org.eclipse.core.runtime.preferences.IPreferenceFilter#getMapping(java.lang.String) - */ - @Override - public Map getMapping(String scope) { - return null; - } - }; - - Platform.getPreferencesService().exportPreferences(contextScopePrefs, new IPreferenceFilter[] { filter }, stream); - stream.close(); - } - catch (Exception e) { - } - } - - /** - * Check whether a key is set or not. - * - * @param key The key to check. - * @return null if the key does not exist. - */ - public boolean containsKey(String key) { - return Platform.getPreferencesService().getString(getQualifier(), key, null, null) != null; - } - - /** - * Get a String preference value. - * - * @param key The preference key. - * @return The value of the preference key or the default value if not set. - */ - public final String getString(String key) { - return Platform.getPreferencesService().getString(getQualifier(), key, null, null); - } - - /** - * Get a boolean preference value. - * - * @param key The preference key. - * @return The value of the preference key or the default value if not set. - */ - public final boolean getBoolean(String key) { - return Platform.getPreferencesService().getBoolean(getQualifier(), key, false, null); - } - - /** - * Get an int preference value. - * - * @param key The preference key. - * @return The value of the preference key or the default value if not set. - */ - public final int getInt(String key) { - return Platform.getPreferencesService().getInt(getQualifier(), key, 0, null); - } - - /** - * Get a long preference value. - * - * @param key The preference key. - * @return The value of the preference key or the default value if not set. - */ - public final long getLong(String key) { - return Platform.getPreferencesService().getLong(getQualifier(), key, 0, null); - } - - /** - * Get a default String preference value. - * - * @param key The preference key. - * @return The default value of the preference key or null. - */ - public final String getDefaultString(String key) { - return defaultPrefs.get(key, null); - } - - /** - * Get a default boolean preference value. - * - * @param key The preference key. - * @return The default value of the preference key or null. - */ - public final boolean getDefaultBoolean(String key) { - return defaultPrefs.getBoolean(key, false); - } - - /** - * Get a default int preference value. - * - * @param key The preference key. - * @return The default value of the preference key or null. - */ - public final int getDefaultInt(String key) { - return defaultPrefs.getInt(key, 0); - } - - /** - * Get a default long preference value. - * - * @param key The preference key. - * @return The default value of the preference key or null. - */ - public final long getDefaultLong(String key) { - return defaultPrefs.getLong(key, 0); - } - - /** - * Set a String preference value. If the value is null or is equal to - * the default value, the entry will be removed. - *

            - * A {@link PreferenceChangeEvent} is fired, if the value has changed. - * - * @param key The preference key. - * @return The value of the preference key. - */ - public void putString(String key, String value) { - String defValue = defaultPrefs.get(key, null); - String instValue = getString(key); - if (value == null || value.equals(defValue)) { - contextScopePrefs.remove(key); - flushAndNotify(contextScopePrefs, key, instValue, defValue); - } - else if (!value.equals(instValue)) { - contextScopePrefs.put(key, value); - flushAndNotify(contextScopePrefs, key, instValue, value); - } - } - - /** - * Set a boolean preference value. If the value is equal the default value, - * the entry will be removed. - *

            - * A {@link PreferenceChangeEvent} is fired, if the value has changed. - * - * @param key The preference key. - * @return The value of the preference key. - */ - public void putBoolean(String key, boolean value) { - boolean defValue = defaultPrefs.getBoolean(key, false); - boolean instValue = getBoolean(key); - if (value == defValue) { - contextScopePrefs.remove(key); - flushAndNotify(contextScopePrefs, key, Boolean.toString(instValue), Boolean.toString(defValue)); - } - else if (value != instValue) { - contextScopePrefs.putBoolean(key, value); - flushAndNotify(contextScopePrefs, key, Boolean.toString(instValue), Boolean.toString(value)); - } - } - - /** - * Set an int preference value. If the value is equal to the default value, - * the entry will be removed. - *

            - * A {@link PreferenceChangeEvent} is fired, if the value has changed. The old - * and new values are string representation in base 10. - * - * @param key The preference key. - * @return The value of the preference key. - */ - public void putInt(String key, int value) { - int defValue = defaultPrefs.getInt(key, 0); - int instValue = getInt(key); - if (value == defValue) { - contextScopePrefs.remove(key); - flushAndNotify(contextScopePrefs, key, Integer.toString(instValue), Integer.toString(defValue)); - } - else if (value != instValue) { - contextScopePrefs.putInt(key, value); - flushAndNotify(contextScopePrefs, key, Integer.toString(instValue), Integer.toString(value)); - } - } - - /** - * Set a long preference value. If the given value is equal to the default - * value, the entry will be removed. - *

            - * A {@link PreferenceChangeEvent} is fired, if the value has changed. The old - * and new values are string representation in base 10. - * - * @param key The preference key. - * @return The value of the preference key. - */ - public void putLong(String key, long value) { - long defValue = defaultPrefs.getLong(key, 0); - long instValue = getLong(key); - if (value == defValue) { - contextScopePrefs.remove(key); - flushAndNotify(contextScopePrefs, key, Long.toString(instValue), Long.toString(defValue)); - } - else if (value != instValue) { - contextScopePrefs.putLong(key, value); - flushAndNotify(contextScopePrefs, key, Long.toString(instValue), Long.toString(value)); - } - } - - /** - * Set a default String preference value. If the given value is null, - * the entry will be removed. - *

            - * A {@link PreferenceChangeEvent} is fired, if the value has changed. - * - * @param key The preference key. - * @return The default value of the preference key. - */ - public void putDefaultString(String key, String value) { - String defValue = defaultPrefs.get(key, null); - if (value == null) { - defaultPrefs.remove(key); - flushAndNotify(defaultPrefs, key, defValue, null); - } - else if (!value.equals(defValue)) { - defaultPrefs.put(key, value); - flushAndNotify(defaultPrefs, key, defValue, value); - } - } - - /** - * Set a default boolean preference value. - *

            - * A {@link PreferenceChangeEvent} is fired, if the value has changed. - * - * @param key The preference key. - * @return The default value of the preference key. - */ - public void putDefaultBoolean(String key, boolean value) { - boolean defValue = defaultPrefs.getBoolean(key, false); - if (value != defValue) { - defaultPrefs.putBoolean(key, value); - flushAndNotify(defaultPrefs, key, Boolean.toString(defValue), Boolean.toString(value)); - } - } - - /** - * Set a default int preference value. - *

            - * A {@link PreferenceChangeEvent} is fired, if the value has changed. The old - * and new values are string representation in base 10. - * - * @param key The preference key. - * @return The default value of the preference key. - */ - public void putDefaultInt(String key, int value) { - int defValue = defaultPrefs.getInt(key, 0); - if (value != defValue) { - defaultPrefs.putInt(key, value); - flushAndNotify(defaultPrefs, key, Integer.toString(defValue), Integer.toString(value)); - } - } - - /** - * Set a default long preference value. - *

            - * A {@link PreferenceChangeEvent} is fired, if the value has changed. The old - * and new values are string representation in base 10. - * - * @param key The preference key. - * @return The default value of the preference key. - */ - public void putDefaultLong(String key, long value) { - long defValue = defaultPrefs.getLong(key, 0); - if (value != defValue) { - defaultPrefs.putLong(key, value); - flushAndNotify(defaultPrefs, key, Long.toString(defValue), Long.toString(value)); - } - } - - /** - * Write back the changes to the store and notify all listeners about the changed key. - * - * @param node The preference node which has changed. Must not be null. - * @param key The key of the changed preference. Must not be null. - * @param oldValue The old value as a {@link String}, or null. - * @param newValue The new value as a {@link String}, or null. - */ - protected final void flushAndNotify(IEclipsePreferences node, String key, String oldValue, String newValue) { - // Flush the preferences to the persistence store - try { node.flush(); } catch (BackingStoreException e) { /* Ignored on purpose */ } - - // Notify the listeners - firePreferenceEvent(node, key, oldValue, newValue); - } - - /** - * Register the given listener to receive notifications of preference changes to this node. - * Calling this method multiple times with the same listener has no effect. The given listener - * argument must not be null. - * - * @param listener The preference change listener. Must not be null. - */ - public void addPreferenceChangeListener(IPreferenceChangeListener listener) { - Assert.isNotNull(listener); - listeners.add(listener); - } - - /** - * De-register the given listener from receiving notifications of preference changes - * to this node. Calling this method multiple times with the same listener has no - * effect. The given listener argument must not be null. - * - * @param listener The preference change listener. Must not be null. - */ - public void removePreferenceChangeListener(IPreferenceChangeListener listener) { - Assert.isNotNull(listener); - listeners.remove(listener); - } - - /** - * Convenience method for notifying the registered preference change listeners. - * - * @param node The preference node which has changed. Must not be null. - * @param key The key of the changed preference. Must not be null. - * @param oldValue The old value as a {@link String}, or null. - * @param newValue The new value as a {@link String}, or null. - */ - protected void firePreferenceEvent(IEclipsePreferences node, String key, String oldValue, String newValue) { - Assert.isNotNull(node); - Assert.isNotNull(key); - - // If no listener is registered, we are done here - if (listeners.isEmpty()) return; - - // Get the list or currently registered listeners - Object[] l = listeners.getListeners(); - // Create the preference change event - final PreferenceChangeEvent event = new PreferenceChangeEvent(node, key, oldValue, newValue); - for (int i = 0; i < l.length; i++) { - final IPreferenceChangeListener listener = (IPreferenceChangeListener) l[i]; - ISafeRunnable job = new ISafeRunnable() { - @Override - public void handleException(Throwable exception) { - // already logged in Platform#run() - } - - @Override - public void run() throws Exception { - listener.preferenceChange(event); - } - }; - SafeRunner.run(job); - } - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/tracing/TraceHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/tracing/TraceHandler.java deleted file mode 100644 index fd8bdeb..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/tracing/TraceHandler.java +++ /dev/null @@ -1,295 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core.tracing; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.tm.terminal.view.core.activator.CoreBundleActivator; - -/** - * Helper class to handle tracing using the platforms debug capabilities. - */ -public class TraceHandler { - /** - * The bundle identifier. - */ - private final String identifier; - - /** - * The tracer instance. - */ - private Tracer tracer = null; - - /** - * The tracer is responsible for writing the trace message to the desired - * output media. - */ - protected static class Tracer { - - /** - * The bundle identifier. - */ - private final String fIdentifier; - - /** - * The qualifier for the default "<bundle identifier>/debugmode" - * tracing slot. - */ - private final String fDebugModeQualifier; - - /** - * Constructor. - * - * @param identifier The bundle identifier. Must not be null. - */ - public Tracer(String identifier) { - Assert.isNotNull(identifier); - fIdentifier = identifier; - - // Initialize the debug mode qualifier - fDebugModeQualifier = fIdentifier + "/debugmode"; //$NON-NLS-1$ - } - - /** - * Returns the value of the debug mode tracing slot. - *

            - * If not set, or the value is not an {@link Integer}, the method returns 0. - * - * @return The debug mode value. - */ - protected int getDebugMode() { - try { - String mode = Platform.getDebugOption(fDebugModeQualifier); - if (mode != null && Integer.decode(mode).intValue() > 0) { - return Integer.decode(mode).intValue(); - } - } catch (NumberFormatException e) { /* ignored on purpose */ } - - return 0; - } - - /** - * Check if the specified trace slot is enabled. - * - * @param slotId The name of the slot. - * @return true if the slot is defined and enabled, false otherwise. - */ - protected boolean isSlotEnabled(String slotId) { - return fIdentifier != null ? Boolean.parseBoolean(Platform.getDebugOption(fIdentifier + "/" + slotId)) : false; //$NON-NLS-1$ - } - - /** - * Check if tracing is enabled for given mode and slot. - * - * @param debugMode The debug mode for the current debug. - * @param slotId The name of the slot. - * - * @return true if the debug should be written, false otherwise. - */ - protected final boolean isEnabled(int debugMode, String slotId) { - return getDebugMode() < 0 || - (debugMode <= getDebugMode() && - (slotId == null || slotId.trim().length() == 0 || isSlotEnabled(slotId))); - } - - /** - * Format the trace message. - * - * @param message The trace message. - * @param debugMode The debug mode. - * @param slotId The name of the slot. - * @param severity The severity. See {@link IStatus} for valid severity values. - * @param clazz The class that calls this tracer. - * - * @see IStatus - */ - protected String getFormattedDebugMessage(String message, int debugMode, String slotId, int severity, Object clazz) { - StringBuffer debug = new StringBuffer(); - if (slotId != null || clazz != null) { - if (clazz != null) { - String name = clazz instanceof Class ? ((Class)clazz).getSimpleName() : clazz.getClass().getSimpleName(); - debug.append(name.trim().length() > 0 ? name.trim() : clazz instanceof Class ? ((Class)clazz).getName() : clazz.getClass().getName()); - } - if (slotId != null) { - debug.append(" at "); //$NON-NLS-1$ - debug.append(slotId); - } - if (debugMode >= 0) { - debug.append(" (Mode "); //$NON-NLS-1$ - debug.append(debugMode); - debug.append(')'); - } - debug.append('\n'); - debug.append('\t'); - } - debug.append(message); - - return debug.toString(); - } - - /** - * Write the trace message. - * - * @param message The trace message. - * @param debugMode The debug mode. - * @param slotId The name of the slot. - * @param severity The severity. See {@link IStatus} for valid severity values. - * @param clazz The class that calls this tracer. - * - * @see IStatus - */ - protected void write(String message, int debugMode, String slotId, int severity, Object clazz) { - String formattedMessage = getFormattedDebugMessage(message, debugMode, slotId, severity, clazz); - if (severity == IStatus.ERROR || severity == IStatus.WARNING) { - System.err.println(formattedMessage); - } - else { - System.out.println(formattedMessage); - } - } - - /** - * Trace the given message with the given debug mode and slot. - * - * @param message The trace message. - * @param debugMode The debug mode. - * @param slotId The name of the slot. - * @param severity The severity. See {@link IStatus} for valid severity values. - * @param clazz The class that calls this tracer. - * - * @see IStatus - */ - public final void trace(String message, int debugMode, String slotId, int severity, Object clazz) { - if (isEnabled(debugMode, slotId)) { - write(message, debugMode, slotId, severity, clazz); - } - } - } - - /** - * Constructor. - *

            - * Initializes the tracing handler with the given bundle identifier. - * - * @param identifier The bundle identifier or null. - */ - public TraceHandler(String identifier) { - this.identifier = identifier != null ? identifier : CoreBundleActivator.getUniqueIdentifier(); - Assert.isNotNull(this.identifier); - } - - /** - * Returns the identifier. - */ - protected final String getIdentifier() { - return identifier; - } - - /** - * Returns the tracer instance. Create a new tracer instance - * on first invocation. - * - * @return The tracer instance. - */ - protected Tracer getTracer() { - if (tracer == null) { - tracer = new Tracer(identifier); - } - return tracer; - } - - /** - * Return the current debug mode. - */ - public final int getDebugMode() { - return getTracer().getDebugMode(); - } - - /** - * Check whether a trace slot is enabled. The debug mode defaults - * to 0. - * - * @param slotId The name of the slot. - * - * @return true if the slot is enabled, false otherwise. - */ - public final boolean isSlotEnabled(String slotId) { - return isSlotEnabled(0, slotId); - } - - /** - * Check whether a trace slot is enabled with the given debug mode. - * - * @param debugMode The debug mode - * @param slotId The name of the slot. - * - * @return true if the slot is enabled, false otherwise. - */ - public final boolean isSlotEnabled(int debugMode, String slotId) { - return getTracer().isEnabled(debugMode, slotId); - } - - /** - * Trace the given message. - *

            - * The message severity will be {@link IStatus#INFO} and the message will be - * traced unconditionally. - * - * @param message The message. - * @param clazz The class that calls this tracer or null. - */ - public final void trace(String message, Object clazz) { - getTracer().trace(message, 0, null, IStatus.INFO, clazz); - } - - /** - * Trace the given message. - *

            - * The message severity will be {@link IStatus#INFO}. - * - * @param message The message. - * @param debugMode The minimum debug mode that has to be set to write out the message. - * @param clazz The class that calls this tracer or null. - */ - public final void trace(String message, int debugMode, Object clazz) { - getTracer().trace(message, debugMode, null, IStatus.INFO, clazz); - } - - /** - * Trace the given message. - *

            - * The message severity will be {@link IStatus#INFO} and the debug mode - * will default to 0. - * - * @param message The message. - * @param slotId The slot that has to be enabled to write out the message. - * @param clazz The class that calls this tracer or null. - */ - public final void trace(String message, String slotId, Object clazz) { - getTracer().trace(message, 0, slotId, IStatus.INFO, clazz); - } - - /** - * Trace the given message. - * - * @param message The message. - * @param debugMode The minimum debug mode that has to be set to write out the message. - * @param slotId The slot that has to be enabled to write out the message. - * @param severity The severity. See {@link IStatus} for valid severity values. - * @param clazz The class that calls this tracer or null. - * - * @see IStatus - */ - public final void trace(String message, int debugMode, String slotId, int severity, Object clazz) { - getTracer().trace(message, debugMode, slotId, severity, clazz); - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/utils/Env.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/utils/Env.java deleted file mode 100644 index cdd2c58..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/src/org/eclipse/tm/terminal/view/core/utils/Env.java +++ /dev/null @@ -1,233 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.core.utils; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.Platform; -import org.eclipse.osgi.service.environment.Constants; - -/** - * Environment handling utility methods. - */ -public class Env { - - // Reference to the monitor to lock if determining the native environment - private final static Object ENV_GET_MONITOR = new Object(); - - // Reference to the native environment with the case of the variable names preserved - private static Map nativeEnvironmentCasePreserved = null; - - /** - * Returns the merged environment of the native environment and the passed - * in environment. Passed in variables will overwrite the native environment - * if the same variables are set there. - *

            - * For use with terminals, the parameter terminal should be set to - * true. In this case, the method will assure that the TERM - * environment variable is always set to ANSI and is not overwritten - * by the passed in environment. - * - * @param envp The environment to set on top of the native environment or null. - * @param terminal True if used with an terminal, false otherwise. - * - * @return The merged environment. - */ - public static String[] getEnvironment(String[] envp, boolean terminal) { - // Get the cached native environment - Map nativeEnv = getNativeEnvironmentCasePreserved(); - // Make a copy of the native environment so it can be manipulated without changing - // the cached environment - Map env = new LinkedHashMap(nativeEnv); - // Set the TERM environment variable if in terminal mode - if (terminal) env.put("TERM", "xterm"); //$NON-NLS-1$ //$NON-NLS-2$ - - // On Windows, the environment variable names are not case-sensitive. However, - // we desire to preserve the original case. Build up a translation map between - // an all lowercase name and the original environment name - Map k2n = null; - if (Platform.OS_WIN32.equals(Platform.getOS())) { - k2n = new HashMap(); - for (String name : env.keySet()) { - k2n.put(name.toLowerCase(), name); - } - } - - // If a "local" environment is provided, merge it with the native - // environment. - if (envp != null) { - for (int i = 0; i < envp.length; i++) { - // The full provided variable in form "name=value" - String envpPart = envp[i]; - // Split the variable - int eqIdx = envpPart.indexOf('='); - if (eqIdx < 1) - continue; - String name = envpPart.substring(0, eqIdx); - // Map the variable name to the real environment name (Windows only) - if (Platform.OS_WIN32.equals(Platform.getOS())) { - if (k2n.containsKey(name.toLowerCase())) { - String candidate = k2n.get(name.toLowerCase()); - Assert.isNotNull(candidate); - name = candidate; - } - // Filter out environment variables with bad names - if ("".equals(name.trim()) || name.contains(":")) { //$NON-NLS-1$ //$NON-NLS-2$ - continue; - } - } - // Get the variable value - String value = envpPart.substring(eqIdx+1); - // Don't overwrite the TERM variable if in terminal mode - if (terminal && "TERM".equals(name)) continue; //$NON-NLS-1$ - // If a variable with the name does not exist, just append it - if (!env.containsKey(name) && !"".equals(value)) { //$NON-NLS-1$ - env.put(name, value); - } else if (env.containsKey(name)) { - // If the value contains the special placeholder "", remove the variable from the environment - if ("".equals(value)) {//$NON-NLS-1$ - env.remove(name); - } else { - // A variable with the name already exist, check if the value is different - String oldValue = env.get(name); - if (oldValue != null && !oldValue.equals(value) || oldValue == null && value != null) { - env.put(name, value); - } - } - } - } - } - - // Convert into an array of strings - List keys = new ArrayList(env.keySet()); - // On Windows hosts, sort the environment keys - if (Platform.OS_WIN32.equals(Platform.getOS())) Collections.sort(keys); - Iterator iter = keys.iterator(); - List strings = new ArrayList(env.size()); - StringBuilder buffer = null; - while (iter.hasNext()) { - String key = iter.next(); - buffer = new StringBuilder(key); - buffer.append('=').append(env.get(key)); - strings.add(buffer.toString()); - } - - return strings.toArray(new String[strings.size()]); - } - - /** - * Determine the native environment. - * - * @return The native environment, or an empty map. - */ - private static Map getNativeEnvironmentCasePreserved() { - synchronized (ENV_GET_MONITOR) { - if (nativeEnvironmentCasePreserved == null) { - nativeEnvironmentCasePreserved = new LinkedHashMap(); - cacheNativeEnvironment(nativeEnvironmentCasePreserved); - } - return new LinkedHashMap(nativeEnvironmentCasePreserved); - } - } - - /** - * Query the native environment and store it to the specified cache. - * - * @param cache The environment cache. Must not be null. - */ - private static void cacheNativeEnvironment(Map cache) { - Assert.isNotNull(cache); - - try { - String nativeCommand = null; - if (Platform.getOS().equals(Constants.OS_WIN32)) { - nativeCommand = "cmd.exe /C set"; //$NON-NLS-1$ - } else if (!Platform.getOS().equals(Constants.OS_UNKNOWN)) { - nativeCommand = "env"; //$NON-NLS-1$ - } - if (nativeCommand == null) { return; } - Process process = Runtime.getRuntime().exec(nativeCommand); - - // read process directly on other platforms - // we need to parse out matching '{' and '}' for function declarations in .bash environments - // pattern is [function name]=() { and we must find the '}' on its own line with no trailing ';' - InputStream stream = process.getInputStream(); - InputStreamReader isreader = new InputStreamReader(stream); - BufferedReader reader = new BufferedReader(isreader); - try { - String line = reader.readLine(); - while (line != null) { - String key = null; - String value = null; - int func = line.indexOf("=()"); //$NON-NLS-1$ - if (func > 0) { - key = line.substring(0, func); - // scan until we find the closing '}' with no following chars - value = line.substring(func + 1); - do { - line = reader.readLine(); - if (line == null) - break; - if (line.equals("}")) //$NON-NLS-1$ - value += ';'; - value += ' ' + line; - } while (!line.equals("}")); //$NON-NLS-1$ - line = reader.readLine(); - } else { - int separator = line.indexOf('='); - if (separator > 0) { - key = line.substring(0, separator); - value = line.substring(separator + 1); - StringBuilder bufValue = new StringBuilder(value); - line = reader.readLine(); - if (line != null) { - // this line has a '=' read ahead to check next line for '=', might be broken on more - // than one line - separator = line.indexOf('='); - while (separator < 0) { - bufValue.append(line.trim()); - line = reader.readLine(); - if (line == null) { - // if next line read is the end of the file quit the loop - break; - } - separator = line.indexOf('='); - } - } - value = bufValue.toString(); - } - } - if (key != null) { - cache.put(key, value); - } else { - line = reader.readLine(); - } - } - } finally { - reader.close(); - } - } catch (IOException e) { - // Native environment-fetching code failed. - // This can easily happen and is not useful to log. - } - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.core/tm32.png b/rtosTMTerminal/org.eclipse.tm.terminal.view.core/tm32.png deleted file mode 100644 index 668b05b79135152cc0d518da0873c4426bed32e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1349 zcmV-L1-kl)P)`(46b=_T=mH%KWS%@{pgd=vJ7=FgXrav5 z=lZ;J_mm#YqHa@FRS^##9T+$&AW$qKRV!Vab%B_9g`0SUnsR`cGGd?n*Q)BKRdH=* zCm%~IT%2)zmCx<_bAOlHt8g|qJ0Kc8EnuW(bB>3Xz zvVIpB8zmh^E+bepDP=h=Z!cu3U~h|JagFM&V=yLOJTP@cHia-}uv=<}c8IrXe5_t^ zp+;JaUTlf~`0;UUWgr?pH!EsFG=MT|wpC?>SZ9X5pnDP!AUG^+Kr(wYZoE`vgHlvg zC?HKWDP=w|b~bRnPiBlzWs6T|jX-$7+_8Qb6fG_!SUfIrJT7rJY`HgXx;JgOHf^{z zXt9Qnq58IEmy3dRa)r&x*6{E1{rvs>{QUFs^|P?RNk~;&Tw{-mpvJ?|%E;Bt%Gt}v z*2u-vsinFzGC=vSRzE*TEhASjC0t=)ZJL&@wzI{G&DYm zgn@i`jnmQGwX?!YOI6#pi!CWbO+;{7QF>ifeO^|6Usrx#SASnteqL66TvU8uSAShp zd|Fa^Qc83?HCL6Dn)#?mKtV?-AWt70FYfN{zNU#46Dc7ZKY@aSBO5~|C@k;q?Ec=+fsy0l=Qitw%5m#wuR!2QnMD=6}uDk^^0FPmr~fg4sg5%S6^Di_aR)j|a( z*RCMTUvk&N0GFXE41wmK$0Dz#C3yiPA1R_DoPGwIyq4zKa}WzooYcY&PMroCprUg4 z$Wa^$w2mDI`Eb+bEnBy3+rDGRj-5Mp?cTO$&z@~N_U_%Wd*A*82M;k+tEjA9w_XZ6 zXxgxm0qDf#D^{-RzzSBaUc;cG(zh6B*^;H0U;oVoKFu-Y(x!NNsA1}^zkQMzvqb6ixf{8%!LXaa{+uA!iIx#_4M|V#z$eT5_b@f;s(b&}7 z0t%>tLZDei#b8iUQc^4>RayoFV|Oag^_ zatahkrKXufK|(4dx}%~&Dq>XY+8lDKGY;4W#>>V7PoTXfBpvh81 z#mHD4mh7cW&0r>2n8GrSvWkeRn!1K2Sb?^Vt{w#F8zAzQkg$lTn79Nm=SfM+$jZqp zD9FpnDJmi7FE(}#PDtkE;^yJy - - - - - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.gitignore b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.gitignore deleted file mode 100644 index ae3c172..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.options b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.options deleted file mode 100644 index 2b37de4..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.options +++ /dev/null @@ -1,3 +0,0 @@ -org.eclipse.tm.terminal.view.ui/debugmode = 0 -org.eclipse.tm.terminal.view.ui/trace/outputStreamMonitor = false -org.eclipse.tm.terminal.view.ui/trace/launchTerminalCommandHandler = false diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.project b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.project deleted file mode 100644 index 3686758..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.project +++ /dev/null @@ -1,45 +0,0 @@ - - - org.eclipse.tm.terminal.view.ui - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - org.eclipse.pde.api.tools.apiAnalysisBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - org.eclipse.pde.api.tools.apiAnalysisNature - - - - 1329502074611 - - 10 - - org.eclipse.ui.ide.multiFilter - 1.0-name-matches-false-false-target - - - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.settings/org.eclipse.jdt.core.prefs b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 5cb95e2..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,362 +0,0 @@ -#Fri Oct 07 16:14:53 CEST 2011 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=warning -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=warning -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error -org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning -org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.6 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=0 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=0 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true -org.eclipse.jdt.core.formatter.comment.indent_root_tags=true -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=100 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=4 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=4 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=true -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=true -org.eclipse.jdt.core.formatter.lineSplit=100 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=false -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=true -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.settings/org.eclipse.jdt.ui.prefs b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 0d73226..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,62 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_Target Explorer Java STD -formatter_settings_version=12 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=false -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=false -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=true -sp_cleanup.organize_imports=true -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=true -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=false -sp_cleanup.remove_unnecessary_nls_tags=true -sp_cleanup.remove_unused_imports=true -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=false -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true -sp_cleanup.use_type_arguments=false diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.settings/org.eclipse.pde.prefs b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.settings/org.eclipse.pde.prefs deleted file mode 100644 index cf80c8b..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/.settings/org.eclipse.pde.prefs +++ /dev/null @@ -1,32 +0,0 @@ -compilers.f.unresolved-features=1 -compilers.f.unresolved-plugins=1 -compilers.incompatible-environment=1 -compilers.p.build=1 -compilers.p.build.bin.includes=1 -compilers.p.build.encodings=2 -compilers.p.build.java.compiler=2 -compilers.p.build.java.compliance=1 -compilers.p.build.missing.output=2 -compilers.p.build.output.library=1 -compilers.p.build.source.library=1 -compilers.p.build.src.includes=1 -compilers.p.deprecated=1 -compilers.p.discouraged-class=1 -compilers.p.internal=1 -compilers.p.missing-packages=1 -compilers.p.missing-version-export-package=2 -compilers.p.missing-version-import-package=1 -compilers.p.missing-version-require-bundle=1 -compilers.p.no-required-att=0 -compilers.p.not-externalized-att=2 -compilers.p.unknown-attribute=1 -compilers.p.unknown-class=1 -compilers.p.unknown-element=1 -compilers.p.unknown-identifier=1 -compilers.p.unknown-resource=1 -compilers.p.unresolved-ex-points=0 -compilers.p.unresolved-import=0 -compilers.s.create-docs=false -compilers.s.doc-folder=doc -compilers.s.open-tags=1 -eclipse.preferences.version=1 diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/META-INF/MANIFEST.MF b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/META-INF/MANIFEST.MF deleted file mode 100644 index 07f0081..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/META-INF/MANIFEST.MF +++ /dev/null @@ -1,40 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %pluginName -Bundle-SymbolicName: org.eclipse.tm.terminal.view.ui;singleton:=true -Bundle-Version: 4.2.0.qualifier -Bundle-Activator: org.eclipse.tm.terminal.view.ui.activator.UIPlugin -Bundle-Vendor: %providerName -Require-Bundle: org.eclipse.core.expressions;bundle-version="3.4.400", - org.eclipse.core.runtime;bundle-version="3.8.0", - org.eclipse.core.resources;bundle-version="3.8.1";resolution:=optional, - org.eclipse.core.variables;bundle-version="3.2.600", - org.eclipse.debug.ui;bundle-version="3.8.1";resolution:=optional, - org.eclipse.egit.ui;bundle-version="2.0.0";resolution:=optional, - org.eclipse.tm.terminal.view.core;bundle-version="4.0.0", - org.eclipse.tm.terminal.control;bundle-version="4.0.0", - org.eclipse.ui;bundle-version="3.8.0" -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -Bundle-ActivationPolicy: lazy -Bundle-Localization: plugin -Export-Package: org.eclipse.tm.terminal.view.ui.actions, - org.eclipse.tm.terminal.view.ui.activator;x-internal:=true, - org.eclipse.tm.terminal.view.ui.controls, - org.eclipse.tm.terminal.view.ui.help, - org.eclipse.tm.terminal.view.ui.interfaces, - org.eclipse.tm.terminal.view.ui.interfaces.tracing;x-internal:=true, - org.eclipse.tm.terminal.view.ui.internal;x-internal:=true, - org.eclipse.tm.terminal.view.ui.internal.dialogs;x-internal:=true, - org.eclipse.tm.terminal.view.ui.internal.handler;x-internal:=true, - org.eclipse.tm.terminal.view.ui.launcher, - org.eclipse.tm.terminal.view.ui.listeners, - org.eclipse.tm.terminal.view.ui.local.showin;x-internal:=true, - org.eclipse.tm.terminal.view.ui.manager, - org.eclipse.tm.terminal.view.ui.nls;x-internal:=true, - org.eclipse.tm.terminal.view.ui.panels, - org.eclipse.tm.terminal.view.ui.preferences;x-internal:=true, - org.eclipse.tm.terminal.view.ui.services, - org.eclipse.tm.terminal.view.ui.streams, - org.eclipse.tm.terminal.view.ui.tabs, - org.eclipse.tm.terminal.view.ui.view, - org.eclipse.tm.terminal.view.ui.view.showin;x-internal:=true diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/about.html b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/about.html deleted file mode 100644 index 0f07cf0..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/about.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -About - - -

            About This Content

            - -

            May 24, 2012

            -

            License

            - -

            The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise -indicated below, the Content is provided to you under the terms and conditions of the -Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available -at http://www.eclipse.org/legal/epl-v10.html. -For purposes of the EPL, "Program" will mean the Content.

            - -

            If you did not receive this Content directly from the Eclipse Foundation, the Content is -being redistributed by another party ("Redistributor") and different terms and conditions may -apply to your use of any object code in the Content. Check the Redistributor's license that was -provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise -indicated below, the terms and conditions of the EPL still apply to any source code in the Content -and such source code may be obtained at http://www.eclipse.org.

            - - - \ No newline at end of file diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/build.properties b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/build.properties deleted file mode 100644 index b92d23a..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/build.properties +++ /dev/null @@ -1,19 +0,0 @@ -############################################################################### -# Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. -# This program and the accompanying materials are made available under the terms -# of the Eclipse Public License v1.0 which accompanies this distribution, and is -# available at http://www.eclipse.org/legal/epl-v10.html -# -# Contributors: -# Wind River Systems - initial API and implementation -############################################################################### -source.. = src/ -output.. = bin/ -bin.includes = META-INF/,\ - .,\ - plugin.properties,\ - plugin.xml,\ - about.html,\ - icons/,\ - contexts.xml -src.includes = schema/ diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/contexts.xml b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/contexts.xml deleted file mode 100644 index bb0f006..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/contexts.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - Select the terminal type and specify the connections settings to connect a new terminal. - - - Select the new encoding for the active terminal. - - - Add or modify an external executable added to the 'Show in Local Terminal' context menu. - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/clcl16/command_input_field.gif b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/clcl16/command_input_field.gif deleted file mode 100644 index 9e3a547c145798fa08fb692df015a793213fbd1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385 zcmV-{0e=2RNk%w1VGsZi0M!5h^!EGh@%r)f`-qjU_W1ny`uv8PzKoy3y2szCv&G-& z_`%54;_CS2?D^^M`je){nykyBv(Mk?_vY>SZY`|a}j_4xfuZlYv_wT+pp z;p+I}>-gd7_vr8W@%8)n`TXDM_u=dKh|$WarlE(qt$M7agU7XT#Itn2uy(Vk zfB*mgA^8LW002J#EC2ui01yBW000J_z+Xm#&}4qdq%wJ2I+@R~k4bKxePc$9H1`IS$H3||U5)uj`H9-J7aY@tZ diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/clcl16/new_terminal_view.gif b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/clcl16/new_terminal_view.gif deleted file mode 100644 index 008962684244e23e41eb580ae10bc6755ad685f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 934 zcmW+#O-NN?5WS&AhN!K}$`)l%yB7T{MiuC9{ zZ8un-Hy*v&R1p(#5r~9HiinD;n2M`FB~(&tNKMSdO<)oxX$4akb8#2AgiCr6Da0TS z0VE&^A+?5Bh=(8~LNbJ6nqn!Qf|N+f6e)4FB32YgQN)iP5zg=v_k zDVOGuxwtoRz?kF!ct7s zw8YJe*rGtjDfU=y2D30r;@r3*TkZz8a7#Ca$fY^tFu($qFvdz7gn1akA}qrgG>wtS z(~uTvnI_`2N@}l|Jt{&Mb=4B{GU`z#Tx!9R_mUzpX$ay78&z-*_aqaXk#R+~01tS= zd8rJMOLGX}5uV|^X2wbzgdsiBGhGA>n#M?kx@4q46sl#F)To$|3Nfgad5WQo(iTl{ zWiD9qC@B(?h9HixQ58S}63~D}t%yJb^6%#I@=Dvb$=`W4xpna5C)UuP?yhPdwP+Zq4T-puL2&iAzkFXw*V9v<#|+uvOOx1;y*>deEXu3i0?-pwx^99{f% z>fZCtldoe7J-N`mzJB%mo!`?v+s5A>8l4=u(bxI-WA#k4XK3H?*@?kti(ONFmuDyL qU!2)}_|?km@%i^_lXq@Ey*72^#oYt_ZTHlLW6k#F!>8Vz&FTN+NbnZ` diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/dlcl16/command_input_field.gif b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/dlcl16/command_input_field.gif deleted file mode 100644 index f538ca707fc7480b4586effcebbb307e1979ae3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmZ?wbhEHb6krfwIKsg2`}dz;zkdJx`Rnk}Q|B&RId$g3@snpifBE+5^Vg4`zARt8 z>C%P9Hse>gdT6M-Cl4_~*}`|Ns9p zU;xFREQ|~ck_h2{l~5|Km=i5pyLr;i3Ob2Z#xiV)yxV|=ihgM~q8`yJoey=qLxRSFfIA-s)E fymhU7Rhj(uX5s>U{Q`A*>>bSPleA1#6d9}maD{N$ diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/dlcl16/disconnect.gif b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/dlcl16/disconnect.gif deleted file mode 100644 index 1ca9213a43c54fca85561b261bc7f0d765c33636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmZ?wbhEHb6krfw*v!E2|Nnn&ZSDR0_q({bT)TFysi`R=BZHBVasK@I@87>?zyOLr zSr|crIv@gM1_O(QzzNUQd#}fYn3&#c;o$hes2DKCtzePxjb-z6&W8SaS9$cR+Kdhn Zk!4{D;XW1Kue!E3ylYz-WhlsC4FCuQF5dtE diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/dlcl16/new_terminal_view.gif b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/dlcl16/new_terminal_view.gif deleted file mode 100644 index 25adc24b2a6e2f0afd73f174670b52ec640dbc6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmZ?wbhEHb6krfwXl7ve|NpSNQfx%cpCC%P9Hse>gdT6M-Cl4_~*}`|Ns9p zU;xFREQ|~ck_h2{l~5|Km=i5pyLr;i3Ob2Z#xiV)yxV|=ihgM~q8`yJoey=qLxRSFfIA-s)E fymhU7Rhj(uX5s>U{Q`A*>>bSPleA1#6d9}maD{N$ diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/elcl16/disconnect.gif b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/elcl16/disconnect.gif deleted file mode 100644 index d61dd776e39b99fa80233b53a1ce6e05bcbcd8bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 890 zcmW+#F>6#|5PYI&5=1UmCnSZY6Cs@_qT@l-h&HCNT*T7adY?%nSczb}0TZ!IB?!VK zt^NgZoBV))g-9UlY!)8h-M*cfo%!w_J$`uW_KV3d8U7AkmhTvBOG+3qr71j@IV9@$UsFC8R0|_B$6mX)Ryo>B$&uV zB_w7AFGPWbEK~t4Zr;Sk23f(>Q@L4~(JakMQ{F9i3pcu@Te)dz4S86EF)YI>Og02_ zTF^*KTG3=oM4lFDOv|)NlT}fBS(LFX%c=};iFq4!wh1pd%&o;en%J{Jt||3Y;ZFB- zFX6(qqFNEo@C>hTg{Y-96m-&)UUbDO8-hhT(=)x&6|{_rD9Tx$WlJWsvKDN4wv>oPBalYa=t{Ck zBrWOLD>9kMIzHOo-WkWS^gFMiP7j^>q`La=+?j6Q&`bRzCc`lIe5m=Q^}X$btqWI{ zzW@0&o1I^n|NZUt&TQ??!s^NKv-h)Mb8+?N-t_*<^|#X}_tw5FuKe7*xO}oT-MIGP g-Pu={4%aUqKHXfo`*m%8WB1_W+=uJS)5&n>KL)7TF8}}l diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/elcl16/new_terminal_view.gif b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/icons/elcl16/new_terminal_view.gif deleted file mode 100644 index b81882b503d20b1dccc8cf1c46c35699eaf0ea5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmZ?wbhEHb6krfwXl7ve|NsBBYu938VhRchgoK0{7#Nh4l=ko6-_+FP;NUQS{`~v* z_uJdYzkmPUz`$Vr`t^!GS(t%}7<51c$P5RTD1j56OIJ9svNZi~d=SEwV9=w`qO>84 zF@S^9Eojy4pr@V776xjD-MC>iv)3s=L$#gWP&mlIC&%G%V1r^46B`$sK!HM|Yd62LSV6;uMg|TcDTyf>3sO!p zvT!)4L>4xBvq>`gln5|79hzvws<1?00YeLyg({nbSILTlo$QmedMhU+F|q2;J|?;5|=b=70_{LC}2!?U|_HY0P>7m*#H0l diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/plugin.properties b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/plugin.properties deleted file mode 100644 index fdd4f54..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/plugin.properties +++ /dev/null @@ -1,73 +0,0 @@ -################################################################################## -# Copyright (c) 2011, 2016 Wind River Systems, Inc. and others. All rights reserved. -# This program and the accompanying materials are made available under the terms -# of the Eclipse Public License v1.0 which accompanies this distribution, and is -# available at http://www.eclipse.org/legal/epl-v10.html -# -# Contributors: -# Wind River Systems - initial API and implementation -################################################################################## - -pluginName = Terminal View -providerName = Eclipse.org - Target Management - -# ----- Terminal View ----- - -ViewCategory.name=Terminal - -TerminalsView.name=Terminal -TerminalsView.name.old=Terminals (Old) -TerminalsView.context.name=In Terminal View -TerminalsView.context.description=Show modified keyboard shortcuts in context menu - -# ----- Terminal Connectors ----- - -TerminalConnector.streams=Streams Connector (hidden) - -# ----- Terminal Launcher Delegates ----- - -StreamsLauncherDelegate.label=Streams Terminal - -# ----- Commands and Menu contributions ----- -command.category.name=Terminal Commands - -toolbar.terminal.label=Terminal - -command.launch.selection.name=Open Terminal on Selection -command.launch.name=Open Terminal -command.launch.label=Open Terminal... -command.launch.tooltip=Open a Terminal - -command.disconnect.name=Disconnect Terminal -command.disconnect.label=Disconnect -command.disconnect.tooltip=Disconnect Terminal Connection - -command.newview.name=New Terminal View - -menu.showIn.label = Show in Local Terminal -menu.showIn.mnemonic=I - -LocalLauncherDelegate.label=Local Terminal - -command.launch.name=Open Local Terminal on Selection - -menu.showIn.localterminal.label = Terminal - -TerminalConnector.local=Local - -# ----- Extension Points ----- - -ExtensionPoint.launcherDelegates.name=Terminal Launcher Delegates - -# ----- Activity contributions ----- - -activities.category.terminals.name=Terminal -activities.category.terminals.description=Use the terminal to connect to remote hosts via telnet, ssh and others. - -activities.activity.terminals.views.name=Terminal Views -activities.activity.terminals.views.description=Terminal related views. - -# ----- Preference Pages ----- - -preference.page.name=Local Terminal - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/plugin.xml b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/plugin.xml deleted file mode 100644 index db83344..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/plugin.xml +++ /dev/null @@ -1,470 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/pom.xml b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/pom.xml deleted file mode 100644 index b907bdf..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/pom.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - 4.0.0 - - - org.eclipse.tm.terminal - org.eclipse.tm.terminal.maven-build - 4.2.0-SNAPSHOT - ../../admin/pom-build.xml - - - 4.2.0-SNAPSHOT - org.eclipse.tm.terminal.view.ui - eclipse-plugin - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/schema/launcherDelegates.exsd b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/schema/launcherDelegates.exsd deleted file mode 100644 index e3454e0..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/schema/launcherDelegates.exsd +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - This extension point is used to contribute terminal launcher delegates. -<p> -Terminal launcher delegates contributes terminal settings widget to the <code>LaunchTerminalSettingsDialog</code> required to open a remote terminal through a specific communication channel, like TCF or SSH. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Declares a terminal launcher delegate contribution. - - - - - - - - - - - - The unique id of the terminal launcher delegate contribution. - - - - - - - The label representing the terminal launcher delegate within the UI. - - - - - - - The class that implements <code>org.eclipse.tcf.te.ui.terminals.interfaces.ILauncherDelegate</code> or extends <code>org.eclipse.tcf.te.ui.terminals.launcher.AbstractLauncherDelegate</code>. -<p> -The terminal launcher delegate implementation class must be specified either by the class attribute or the class child element! - - - - - - - - - - If <code>true</code>, than the terminal launcher delegate is not visible in the UI, even if a possible <code>enablement</code> will evaluate to <code>true</code>. - - - - - - - - - - A short description of the terminal connector type to be presented in the UI. - - - - - - - - Used when creating an <code>IExecutableExtension</code> with a named parameter, or more than one. - - - - - - - - - - The class that implements <code>org.eclipse.tcf.te.ui.terminals.interfaces.ILauncherDelegate</code> or extends <code>org.eclipse.tcf.te.ui.terminals.launcher.AbstractLauncherDelegate</code>. -<p> -The terminal launcher delegate implementation class must be specified either by the class attribute or the class child element! - - - - - - - - - - - - - A parameter for an <code>IExecutableExtension</code>. - - - - - - - <p>The parameter name.</p> - - - - - - - <p>The parameter value.</p> - - - - - - - - - - - - Target Explorer 1.0.0 - - - - - - - - - This is an example of the extension point usage: -<p> -<pre><code> - <extension point="org.eclipse.tcf.te.ui.terminals.launcherDelegates"> - <delegate - id="org.eclipse.tcf.te.ui.terminals.launcher.tcf" - class="org.eclipse.tcf.te.tcf.terminals.ui.internal.TerminalLauncherDelegate" - label="TCF Terminal"> - <enablement> - ... - </enablement> - </delegate> - </extension> -</code></pre> - - - - - - - - - The provider of a launcher delegate must implement <samp>org.eclipse.tcf.te.ui.terminals.interfaces.ILauncherDelegate</samp>. - - - - - - - - - - Copyright (c) 2011 Wind River Systems, Inc. and others. - -All rights reserved. - -This program and the accompanying materials are made available under the terms -of the Eclipse Public License v1.0 which accompanies this distribution, and is -available at http://www.eclipse.org/legal/epl-v10.html. - - - - diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/AbstractAction.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/AbstractAction.java deleted file mode 100644 index e3c4a3e..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/AbstractAction.java +++ /dev/null @@ -1,189 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.actions; - -import org.eclipse.core.commands.Command; -import org.eclipse.core.commands.ParameterizedCommand; -import org.eclipse.core.expressions.EvaluationContext; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.tm.terminal.view.ui.tabs.TabFolderManager; -import org.eclipse.tm.terminal.view.ui.tabs.TabFolderToolbarHandler; -import org.eclipse.ui.ISources; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.commands.ICommandService; -import org.eclipse.ui.handlers.IHandlerService; - -/** - * Abstract terminal action wrapper implementation. - */ -public abstract class AbstractAction extends AbstractTerminalAction { - // Reference to the parent toolbar handler - private final TabFolderToolbarHandler parent; - - /** - * Constructor. - * - * @param parent - * The parent toolbar handler instance. Must not be - * null. - * @param id - * The terminal action id. Must not be null. - */ - public AbstractAction(TabFolderToolbarHandler parent, String id) { - super(id); - - Assert.isNotNull(parent); - this.parent = parent; - } - - /** - * Returns the parent toolbar handler. - * - * @return The parent toolbar handler. - */ - protected final TabFolderToolbarHandler getParent() { - return parent; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#getTarget() - */ - @Override - protected ITerminalViewControl getTarget() { - return getParent().getActiveTerminalViewControl(); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#run() - */ - @Override - public void run() { - // Get the active tab item from the tab folder manager - TabFolderManager manager = (TabFolderManager)getParent().getAdapter(TabFolderManager.class); - if (manager != null) { - // If we have the active tab item, we can get the active terminal control - CTabItem activeTabItem = manager.getActiveTabItem(); - if (activeTabItem != null) { - // And execute the command - executeCommand(activeTabItem.getData("customData")); //$NON-NLS-1$ - } - } - } - - /** - * Executes the command for the given data node as current and active menu selection. - *

            - * Node: If the provided data node is null, the method will trigger - * the command with an empty selection. - * - * @param data The terminal custom data node or null. - */ - @SuppressWarnings("cast") - protected void executeCommand(Object data) { - // Get the command service from the workbench - ICommandService service = (ICommandService)PlatformUI.getWorkbench().getAdapter(ICommandService.class); - if (service != null && getCommandId() != null) { - // Get the command - final Command command = service.getCommand(getCommandId()); - if (command != null && command.isDefined()) { - IHandlerService handlerSvc = (IHandlerService)PlatformUI.getWorkbench().getService(IHandlerService.class); - Assert.isNotNull(handlerSvc); - - // Construct a selection element - IStructuredSelection selection = data != null ? new StructuredSelection(data) : new StructuredSelection(); - // Construct the application context - EvaluationContext context = new EvaluationContext(handlerSvc.getCurrentState(), selection); - // Apply the selection to the "activeMenuSelection" and "selection" variable too - context.addVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME, selection); - context.addVariable(ISources.ACTIVE_MENU_SELECTION_NAME, selection); - // Allow plug-in activation - context.setAllowPluginActivation(true); - // And execute the event - try { - ParameterizedCommand pCmd = ParameterizedCommand.generateCommand(command, null); - Assert.isNotNull(pCmd); - - handlerSvc.executeCommandInContext(pCmd, null, context); - } catch (Exception e) { - IStatus status = new Status(IStatus.ERROR, UIPlugin.getUniqueIdentifier(), - NLS.bind(Messages.AbstractAction_error_commandExecutionFailed, getCommandId(), e.getLocalizedMessage()), - e); - UIPlugin.getDefault().getLog().log(status); - } - } - } - } - - /** - * Returns the command id of the command to execute. - * - * @return The command id. Must be never null. - */ - protected abstract String getCommandId(); - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#updateAction(boolean) - */ - @Override - public void updateAction(boolean aboutToShow) { - // Ignore the flag given from outside. We have to decide ourself - // what the enabled state of the action is - boolean enabled = getTarget() != null; - - // If a target terminal control is available, we need to find the corresponding - // VLM target object which we need to trigger the handler - if (enabled) { - // The action will be enabled if we can determine the VLM target object - enabled = false; - // Get the active tab item from the tab folder manager - TabFolderManager manager = (TabFolderManager)getParent().getAdapter(TabFolderManager.class); - if (manager != null) { - // If we have the active tab item, we can get the active terminal control - CTabItem activeTabItem = manager.getActiveTabItem(); - if (activeTabItem != null) { - enabled = checkEnableAction(activeTabItem.getData("customData")); //$NON-NLS-1$ - } - } - } - - setEnabled(enabled); - } - - /** - * Checks if the action should be enabled based on the given terminal data object. - * - * @param data The terminal data node or null. - * @return True to enable the action, false otherwise. - */ - protected boolean checkEnableAction(Object data) { - return data != null; - } - - /** - * Returns if the action is a separator. Returning true here - * means that an additional separator toolbar element is added right or - * above of the action. - * - * @return True if the action is separating the parent contribution manager, false otherwise. - */ - public boolean isSeparator() { - return false; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/NewTerminalViewAction.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/NewTerminalViewAction.java deleted file mode 100644 index a9e8093..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/NewTerminalViewAction.java +++ /dev/null @@ -1,77 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.actions; - -import org.eclipse.core.commands.Command; -import org.eclipse.core.commands.ParameterizedCommand; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.action.IAction; -import org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.interfaces.ITerminalsView; -import org.eclipse.tm.terminal.view.ui.interfaces.ImageConsts; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.commands.ICommandService; -import org.eclipse.ui.handlers.IHandlerService; - -/** - * Opens a new terminal view with a new secondary view ID. - * - * @since 4.1 - */ -public class NewTerminalViewAction extends AbstractTerminalAction { - - //private ITerminalsView view = null; - - /** - * Constructor. - */ - public NewTerminalViewAction(ITerminalsView view) { - super(null, NewTerminalViewAction.class.getName(), IAction.AS_PUSH_BUTTON); - - //this.view = view; - setupAction(Messages.NewTerminalViewAction_menu, Messages.NewTerminalViewAction_tooltip, - UIPlugin.getImageDescriptor(ImageConsts.ACTION_NewTerminalView_Hover), - UIPlugin.getImageDescriptor(ImageConsts.ACTION_NewTerminalView_Enabled), - UIPlugin.getImageDescriptor(ImageConsts.ACTION_NewTerminalView_Disabled), true); - setEnabled(true); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#run() - */ - @SuppressWarnings("cast") - @Override - public void run() { - ICommandService service = (ICommandService)PlatformUI.getWorkbench().getService(ICommandService.class); - Command command = service != null ? service.getCommand("org.eclipse.tm.terminal.view.ui.command.newview") : null; //$NON-NLS-1$ - if (command != null && command.isDefined() && command.isEnabled()) { - try { - ParameterizedCommand pCmd = ParameterizedCommand.generateCommand(command, null); - Assert.isNotNull(pCmd); - IHandlerService handlerSvc = (IHandlerService)PlatformUI.getWorkbench().getService(IHandlerService.class); - Assert.isNotNull(handlerSvc); - handlerSvc.executeCommandInContext(pCmd, null, handlerSvc.getCurrentState()); - } catch (Exception e) { - // If the platform is in debug mode, we print the exception to the log view - if (Platform.inDebugMode()) { - IStatus status = new Status(IStatus.ERROR, UIPlugin.getUniqueIdentifier(), - Messages.AbstractTriggerCommandHandler_error_executionFailed, e); - UIPlugin.getDefault().getLog().log(status); - } - } - } - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/SelectEncodingAction.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/SelectEncodingAction.java deleted file mode 100644 index 1d8513a..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/SelectEncodingAction.java +++ /dev/null @@ -1,79 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.actions; - -import java.io.UnsupportedEncodingException; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.window.Window; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.terminal.view.ui.internal.dialogs.EncodingSelectionDialog; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.tm.terminal.view.ui.tabs.TabFolderManager; - -/** - * Terminal control select encoding action implementation. - */ -public class SelectEncodingAction extends AbstractTerminalAction { - // Reference to the parent tab folder manager - private final TabFolderManager tabFolderManager; - - /** - * Constructor. - * - * @param tabFolderManager The parent tab folder manager. Must not be null. - */ - public SelectEncodingAction(TabFolderManager tabFolderManager) { - super(null, SelectEncodingAction.class.getName(), IAction.AS_PUSH_BUTTON); - - Assert.isNotNull(tabFolderManager); - this.tabFolderManager = tabFolderManager; - - setupAction(Messages.SelectEncodingAction_menu, - Messages.SelectEncodingAction_tooltip, - (ImageDescriptor)null, - (ImageDescriptor)null, - (ImageDescriptor)null, - true); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#run() - */ - @Override - public void run() { - ITerminalViewControl target = getTarget(); - if (target == null) return; - - EncodingSelectionDialog dialog = new EncodingSelectionDialog(null); - dialog.setEncoding(target.getEncoding()); - if (dialog.open() == Window.OK) { - try { - target.setEncoding(dialog.getEncoding()); - tabFolderManager.updateStatusLine(); - } - catch (UnsupportedEncodingException e) { e.printStackTrace(); } - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#updateAction(boolean) - */ - @Override - public void updateAction(boolean aboutToShow) { - setEnabled(aboutToShow - && getTarget() != null && getTarget().getState() == TerminalState.CONNECTED); - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/TabScrollLockAction.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/TabScrollLockAction.java deleted file mode 100644 index b9645a1..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/TabScrollLockAction.java +++ /dev/null @@ -1,58 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.actions; - -import org.eclipse.jface.action.IAction; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.interfaces.ImageConsts; -import org.eclipse.tm.terminal.view.ui.nls.Messages; - -/** - * Terminal console tab scroll lock action. - */ -public class TabScrollLockAction extends AbstractTerminalAction { - - /** - * Constructor. - */ - public TabScrollLockAction() { - super(null, TabScrollLockAction.class.getName(), IAction.AS_RADIO_BUTTON); - - setupAction(Messages.TabScrollLockAction_text, - Messages.TabScrollLockAction_tooltip, - UIPlugin.getImageDescriptor(ImageConsts.ACTION_ScrollLock_Hover), - UIPlugin.getImageDescriptor(ImageConsts.ACTION_ScrollLock_Enabled), - UIPlugin.getImageDescriptor(ImageConsts.ACTION_ScrollLock_Disabled), - true); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#run() - */ - @Override - public void run() { - ITerminalViewControl target = getTarget(); - if (target != null) { - target.setScrollLock(!target.isScrollLock()); - setChecked(target.isScrollLock()); - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#updateAction(boolean) - */ - @Override - public void updateAction(boolean aboutToShow) { - setEnabled(aboutToShow && getTarget() != null && getTarget().getState() == TerminalState.CONNECTED); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/ToggleCommandFieldAction.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/ToggleCommandFieldAction.java deleted file mode 100644 index dcdbbe9..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/actions/ToggleCommandFieldAction.java +++ /dev/null @@ -1,89 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.actions; - -import org.eclipse.jface.action.IAction; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.interfaces.ITerminalsView; -import org.eclipse.tm.terminal.view.ui.interfaces.ImageConsts; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.tm.terminal.view.ui.tabs.TabCommandFieldHandler; -import org.eclipse.tm.terminal.view.ui.tabs.TabFolderManager; - -/** - * Toggle command input field. - */ -public class ToggleCommandFieldAction extends AbstractTerminalAction { - private ITerminalsView view = null; - - /** - * Constructor. - */ - public ToggleCommandFieldAction(ITerminalsView view) { - super(null, ToggleCommandFieldAction.class.getName(), IAction.AS_CHECK_BOX); - - this.view = view; - setupAction(Messages.ToggleCommandFieldAction_menu, Messages.ToggleCommandFieldAction_toolTip, - UIPlugin.getImageDescriptor(ImageConsts.ACTION_ToggleCommandField_Hover), - UIPlugin.getImageDescriptor(ImageConsts.ACTION_ToggleCommandField_Enabled), - UIPlugin.getImageDescriptor(ImageConsts.ACTION_ToggleCommandField_Disabled), true); - - TabCommandFieldHandler handler = getCommandFieldHandler(); - setChecked(handler != null && handler.hasCommandInputField()); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.action.IAction#run() - */ - @Override - public void run() { - TabCommandFieldHandler handler = getCommandFieldHandler(); - if (handler != null) { - handler.setCommandInputField(!handler.hasCommandInputField()); - } - setChecked(handler != null && handler.hasCommandInputField()); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#updateAction(boolean) - */ - @Override - public void updateAction(boolean aboutToShow) { - TabCommandFieldHandler handler = getCommandFieldHandler(); - ITerminalViewControl target = getTarget(); - setEnabled(aboutToShow && handler != null - && target != null && target.getState() == TerminalState.CONNECTED); - setChecked(handler != null && handler.hasCommandInputField()); - } - - /** - * Returns the command input field handler for the active tab. - * - * @return The command input field handler or null. - */ - @SuppressWarnings("cast") - protected TabCommandFieldHandler getCommandFieldHandler() { - TabCommandFieldHandler handler = null; - // Get the active tab item from the tab folder manager - TabFolderManager manager = (TabFolderManager)view.getAdapter(TabFolderManager.class); - if (manager != null) { - // If we have the active tab item, we can get the active terminal control - CTabItem activeTabItem = manager.getActiveTabItem(); - if (activeTabItem != null && !activeTabItem.isDisposed()) { - handler = manager.getTabCommandFieldHandler(activeTabItem); - } - } - return handler; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/activator/UIPlugin.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/activator/UIPlugin.java deleted file mode 100644 index ac6b57d..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/activator/UIPlugin.java +++ /dev/null @@ -1,264 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Max Weninger (Wind River) - [361363] [TERMINALS] Implement "Pin&Clone" for the "Terminals" view - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.activator; - -import java.net.URL; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.resource.ImageRegistry; -import org.eclipse.swt.custom.CTabFolder; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.terminal.view.core.preferences.ScopedEclipsePreferences; -import org.eclipse.tm.terminal.view.core.tracing.TraceHandler; -import org.eclipse.tm.terminal.view.ui.interfaces.ImageConsts; -import org.eclipse.tm.terminal.view.ui.listeners.WorkbenchWindowListener; -import org.eclipse.tm.terminal.view.ui.view.TerminalsView; -import org.eclipse.tm.terminal.view.ui.view.TerminalsViewMementoHandler; -import org.eclipse.ui.IViewPart; -import org.eclipse.ui.IViewReference; -import org.eclipse.ui.IWindowListener; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchListener; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; - -/** - * The activator class controls the plug-in life cycle - */ -public class UIPlugin extends AbstractUIPlugin { - // The shared instance - private static UIPlugin plugin; - // The scoped preferences instance - private static volatile ScopedEclipsePreferences scopedPreferences; - // The trace handler instance - private static volatile TraceHandler traceHandler; - // The workbench listener instance - private IWorkbenchListener listener; - // The global window listener instance - private IWindowListener windowListener; - - /** - * The constructor - */ - public UIPlugin() { - } - - /** - * Returns the shared instance - * - * @return the shared instance - */ - public static UIPlugin getDefault() { - return plugin; - } - - /** - * Convenience method which returns the unique identifier of this plug-in. - */ - public static String getUniqueIdentifier() { - if (getDefault() != null && getDefault().getBundle() != null) { - return getDefault().getBundle().getSymbolicName(); - } - return "org.eclipse.tm.terminal.view.ui"; //$NON-NLS-1$ - } - - /** - * Return the scoped preferences for this plug-in. - */ - public static ScopedEclipsePreferences getScopedPreferences() { - if (scopedPreferences == null) { - scopedPreferences = new ScopedEclipsePreferences(getUniqueIdentifier()); - } - return scopedPreferences; - } - - /** - * Returns the bundles trace handler. - * - * @return The bundles trace handler. - */ - public static TraceHandler getTraceHandler() { - if (traceHandler == null) { - traceHandler = new TraceHandler(getUniqueIdentifier()); - } - return traceHandler; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) - */ - @Override - public void start(BundleContext context) throws Exception { - super.start(context); - plugin = this; - - // Create and register the workbench listener instance - listener = new IWorkbenchListener() { - - @Override - public boolean preShutdown(IWorkbench workbench, boolean forced) { - if (workbench != null && workbench.getActiveWorkbenchWindow() != null && workbench.getActiveWorkbenchWindow().getActivePage() != null) { - // Find all "Terminal" views - IViewReference[] refs = workbench.getActiveWorkbenchWindow().getActivePage().getViewReferences(); - for (IViewReference ref : refs) { - IViewPart part = ref.getView(false); - if (part instanceof TerminalsView) { - /* - * The terminal tabs to save to the views memento on shutdown can - * be determined only _before_ the saveState(memento) method of the - * view is called. Within saveState, it is already to late and the - * terminals might be in CLOSED state already. This depends on the - * terminal type and the corresponding connector implementation. - * - * To be safe, we determine the still opened terminals on shutdown - * separately here in the preShutdown. - */ - final List saveables = new ArrayList(); - - // Get the tab folder - CTabFolder tabFolder = (CTabFolder)((TerminalsView)part).getAdapter(CTabFolder.class); - if (tabFolder != null && !tabFolder.isDisposed()) { - // Get the list of tab items - CTabItem[] items = tabFolder.getItems(); - // Loop the tab items and find the still connected ones - for (CTabItem item : items) { - // Ignore disposed items - if (item.isDisposed()) continue; - // Get the terminal view control - ITerminalViewControl terminal = (ITerminalViewControl)item.getData(); - if (terminal == null || terminal.getState() != TerminalState.CONNECTED) { - continue; - } - // Still connected -> Add to the list - saveables.add(item); - } - } - - // Push the determined saveable items to the memento handler - TerminalsViewMementoHandler mementoHandler = (TerminalsViewMementoHandler)((TerminalsView)part).getAdapter(TerminalsViewMementoHandler.class); - if (mementoHandler != null) mementoHandler.setSaveables(saveables); - } - } - } - - return true; - } - - @Override - public void postShutdown(IWorkbench workbench) { - } - }; - PlatformUI.getWorkbench().addWorkbenchListener(listener); - - if (windowListener == null && PlatformUI.getWorkbench() != null) { - windowListener = new WorkbenchWindowListener(); - PlatformUI.getWorkbench().addWindowListener(windowListener); - activateContexts(); - } - } - - void activateContexts() { - if (Display.getCurrent() != null) { - IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); - if (window != null && windowListener != null) windowListener.windowOpened(window); - } - else { - PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){ - @Override - public void run() { - activateContexts(); - }}); - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) - */ - @Override - public void stop(BundleContext context) throws Exception { - if (windowListener != null && PlatformUI.getWorkbench() != null) { - PlatformUI.getWorkbench().removeWindowListener(windowListener); - windowListener = null; - } - - plugin = null; - scopedPreferences = null; - traceHandler = null; - if (listener != null) { PlatformUI.getWorkbench().removeWorkbenchListener(listener); listener = null; } - super.stop(context); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeImageRegistry(org.eclipse.jface.resource.ImageRegistry) - */ - @Override - protected void initializeImageRegistry(ImageRegistry registry) { - Bundle bundle = Platform.getBundle("org.eclipse.ui.console"); //$NON-NLS-1$ - if (bundle != null) { - URL url = bundle.getEntry(ImageConsts.IMAGE_DIR_ROOT + "full/" + ImageConsts.IMAGE_DIR_EVIEW + "console_view.gif"); //$NON-NLS-1$ //$NON-NLS-2$ - registry.put(ImageConsts.VIEW_Terminals, ImageDescriptor.createFromURL(url)); - - url = bundle.getEntry(ImageConsts.IMAGE_DIR_ROOT + "full/" + ImageConsts.IMAGE_DIR_CLCL + "lock_co.gif"); //$NON-NLS-1$ //$NON-NLS-2$ - registry.put(ImageConsts.ACTION_ScrollLock_Hover, ImageDescriptor.createFromURL(url)); - url = bundle.getEntry(ImageConsts.IMAGE_DIR_ROOT + "full/" + ImageConsts.IMAGE_DIR_ELCL + "lock_co.gif"); //$NON-NLS-1$ //$NON-NLS-2$ - registry.put(ImageConsts.ACTION_ScrollLock_Enabled, ImageDescriptor.createFromURL(url)); - url = bundle.getEntry(ImageConsts.IMAGE_DIR_ROOT + "full/" + ImageConsts.IMAGE_DIR_DLCL + "lock_co.gif"); //$NON-NLS-1$ //$NON-NLS-2$ - registry.put(ImageConsts.ACTION_ScrollLock_Disabled, ImageDescriptor.createFromURL(url)); - } - - bundle = getBundle(); - URL url = bundle.getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_CLCL + "command_input_field.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.ACTION_ToggleCommandField_Hover, ImageDescriptor.createFromURL(url)); - url = bundle.getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_ELCL + "command_input_field.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.ACTION_ToggleCommandField_Enabled, ImageDescriptor.createFromURL(url)); - url = bundle.getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_DLCL + "command_input_field.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.ACTION_ToggleCommandField_Disabled, ImageDescriptor.createFromURL(url)); - - url = bundle.getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_CLCL + "new_terminal_view.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.ACTION_NewTerminalView_Hover, ImageDescriptor.createFromURL(url)); - url = bundle.getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_ELCL + "new_terminal_view.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.ACTION_NewTerminalView_Enabled, ImageDescriptor.createFromURL(url)); - url = bundle.getEntry(ImageConsts.IMAGE_DIR_ROOT + ImageConsts.IMAGE_DIR_DLCL + "new_terminal_view.gif"); //$NON-NLS-1$ - registry.put(ImageConsts.ACTION_NewTerminalView_Disabled, ImageDescriptor.createFromURL(url)); - } - - /** - * Loads the image registered under the specified key from the image - * registry and returns the Image object instance. - * - * @param key The key the image is registered with. - * @return The Image object instance or null. - */ - public static Image getImage(String key) { - return getDefault().getImageRegistry().get(key); - } - - /** - * Loads the image registered under the specified key from the image - * registry and returns the ImageDescriptor object instance. - * - * @param key The key the image is registered with. - * @return The ImageDescriptor object instance or null. - */ - public static ImageDescriptor getImageDescriptor(String key) { - return getDefault().getImageRegistry().getDescriptor(key); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/controls/ConfigurationPanelControl.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/controls/ConfigurationPanelControl.java deleted file mode 100644 index 1a3e70d..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/controls/ConfigurationPanelControl.java +++ /dev/null @@ -1,421 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.controls; - -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.dialogs.IMessageProvider; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.StackLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Group; -import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel; -import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; -import org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel; - -/** - * Base control to deal with wizard or property page controls - * which should share the same UI space. - */ -public class ConfigurationPanelControl implements IConfigurationPanelContainer, IMessageProvider { - private final Map configurationPanels = new Hashtable(); - - private String message = null; - private int messageType = IMessageProvider.NONE; - - private boolean isGroup; - - private Composite panel; - private StackLayout panelLayout; - - private String activeConfigurationPanelKey = null; - private IConfigurationPanel activeConfigurationPanel = null; - - private final AbstractConfigurationPanel EMPTY_PANEL; - - /** - * An empty configuration panel implementation. - */ - private static final class EmptySettingsPanel extends AbstractConfigurationPanel { - - /** - * Constructor. - * - * @param container The configuration panel container or null. - */ - public EmptySettingsPanel(IConfigurationPanelContainer container) { - super(container); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#setupPanel(org.eclipse.swt.widgets.Composite) - */ - @Override - public void setupPanel(Composite parent) { - Composite panel = new Composite(parent, SWT.NONE); - panel.setLayout(new GridLayout()); - panel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - - panel.setBackground(parent.getBackground()); - - setControl(panel); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#isValid() - */ - @Override - public boolean isValid() { - return false; - } - } - - /** - * Cleanup all resources the control might have been created. - */ - public void dispose() { - EMPTY_PANEL.dispose(); - } - - /** - * Constructor. - */ - public ConfigurationPanelControl() { - EMPTY_PANEL = new EmptySettingsPanel(this); - clear(); - setPanelIsGroup(false); - } - - /** - * Sets if or if not the controls panel is a Group. - * - * @param isGroup True if the controls panel is a group, false otherwise. - */ - public void setPanelIsGroup(boolean isGroup) { - this.isGroup = isGroup; - } - - /** - * Returns if or if not the controls panel is a Group. - * - * @return True if the controls panel is a group, false otherwise. - */ - public boolean isPanelIsGroup() { - return isGroup; - } - - /** - * Returns the controls panel. - * - * @return The controls panel or null. - */ - public Composite getPanel() { - return panel; - } - - /** - * Returns the label text to set for the group (if the panel is a group). - * - * @return The label text to apply or null. - */ - public String getGroupLabel() { - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer#validate() - */ - @Override - public void validate() { - } - - /** - * To be called from the embedding control to setup the controls UI elements. - * - * @param parent The parent control. Must not be null! - */ - public void setupPanel(Composite parent, String[] configurationPanelKeys) { - Assert.isNotNull(parent); - - if (isPanelIsGroup()) { - panel = new Group(parent, SWT.NONE); - if (getGroupLabel() != null) ((Group)panel).setText(getGroupLabel()); - } else { - panel = new Composite(parent, SWT.NONE); - } - Assert.isNotNull(panel); - panel.setFont(parent.getFont()); - panel.setBackground(parent.getBackground()); - - panelLayout = new StackLayout(); - panel.setLayout(panelLayout); - - setupConfigurationPanels(panel, configurationPanelKeys); - EMPTY_PANEL.setupPanel(panel); - } - - /** - * Removes all configuration panels. - */ - public void clear() { - configurationPanels.clear(); - } - - /** - * Returns a unsorted list of all registered configuration panel id's. - * - * @return A list of registered configuration panel id's. - */ - public String[] getConfigurationPanelIds() { - return configurationPanels.keySet().toArray(new String[configurationPanels.keySet().size()]); - } - - /** - * Returns the configuration panel instance registered for the given configuration panel key. - * - * @param key The key to get the configuration panel for. Must not be null! - * @return The configuration panel instance or an empty configuration panel if the key is unknown. - */ - public IConfigurationPanel getConfigurationPanel(String key) { - IConfigurationPanel panel = key != null ? configurationPanels.get(key) : null; - return panel != null ? panel : EMPTY_PANEL; - } - - /** - * Returns if or if not the given configuration panel is equal to the - * empty configuration panel. - * - * @param panel The configuration panel or null. - * @return True if the configuration panel is equal to the empty configuration panel. - */ - public final boolean isEmptyConfigurationPanel(IConfigurationPanel panel) { - return EMPTY_PANEL == panel; - } - - /** - * Adds the given configuration panel under the given configuration panel key to the - * list of known panels. If the given configuration panel is null, any - * configuration panel stored under the given key is removed from the list of known panels. - * - * @param key The key to get the configuration panel for. Must not be null! - * @param panel The configuration panel instance or null. - */ - public void addConfigurationPanel(String key, IConfigurationPanel panel) { - if (key == null) return; - if (panel != null) { - configurationPanels.put(key, panel); - } else { - configurationPanels.remove(key); - } - } - - /** - * Setup the configuration panels for being presented to the user. This method is called by the - * controls doSetupPanel(...) and initialize all possible configuration panels to show. - * The default implementation iterates over the given list of configuration panel keys and calls - * setupPanel(...) for each of them. - * - * @param parent The parent composite to use for the configuration panels. Must not be null! - * @param configurationPanelKeys The list of configuration panels to initialize. Might be null or empty! - */ - public void setupConfigurationPanels(Composite parent, String[] configurationPanelKeys) { - Assert.isNotNull(parent); - - if (configurationPanelKeys != null) { - for (int i = 0; i < configurationPanelKeys.length; i++) { - IConfigurationPanel configPanel = getConfigurationPanel(configurationPanelKeys[i]); - Assert.isNotNull(configPanel); - configPanel.setupPanel(parent); - } - } - } - - /** - * Make the wizard configuration panel registered under the given configuration panel key the - * most top configuration panel. If no configuration panel is registered under the given key, - * nothing will happen. - * - * @param key The key to get the wizard configuration panel for. Must not be null! - */ - public void showConfigurationPanel(String key) { - String activeKey = getActiveConfigurationPanelKey(); - if (key != null && key.equals(activeKey) && activeConfigurationPanel != null) { - return; - } - IConfigurationPanel configPanel = getActiveConfigurationPanel(); - Map data = new HashMap(); - if (configPanel != null) configPanel.extractData(data); - configPanel = getConfigurationPanel(key); - Assert.isNotNull(configPanel); - if (configPanel.getControl() != null) { - activeConfigurationPanel = configPanel; - activeConfigurationPanelKey = key; - panelLayout.topControl = configPanel.getControl(); - panel.layout(); - if (!data.isEmpty()) configPanel.updateData(data); - configPanel.activate(); - } - else { - activeConfigurationPanelKey = key; - } - } - - /** - * Returns the currently active configuration panel. - * - * @return The active configuration panel or null. - */ - public IConfigurationPanel getActiveConfigurationPanel() { - return activeConfigurationPanel; - } - - /** - * Returns the currently active configuration panel key. - * - * @return The active configuration panel key or null. - */ - public String getActiveConfigurationPanelKey() { - return activeConfigurationPanelKey; - } - - /** - * Returns the dialog settings to use to save and restore control specific - * widget values. - * - * @param settings The parent dialog settings. Must not be null. - * @return The dialog settings to use. - */ - public final IDialogSettings getDialogSettings(IDialogSettings settings) { - Assert.isNotNull(settings); - - // Store the settings of the control within it's own section. - String sectionName = this.getClass().getSimpleName(); - Assert.isNotNull(sectionName); - - IDialogSettings section = settings.getSection(sectionName); - if (section == null) { - section = settings.addNewSection(sectionName); - } - - return section; - } - - /** - * Restore the widget values from the dialog settings store to recreate the control history. - *

            - * Note: - * The control is saving the widget values into a section equal to the class name {@link Class#getName()}. - * After the sections has been created, the method calls doRestoreWidgetValues for restoring - * the single properties from the dialog settings. Subclasses may override doRestoreWidgetValues - * only to deal with the single properties only or restoreWidgetValues when to override the - * creation of the subsections. - * - * @param settings The dialog settings object instance to restore the widget values from. Must not be null! - * @param idPrefix The prefix to use for every dialog settings slot keys. If null, the dialog settings slot keys are not to prefix. - */ - public final void restoreWidgetValues(IDialogSettings settings, String idPrefix) { - Assert.isNotNull(settings); - - // now, call the hook for actually reading the single properties from the dialog settings. - doRestoreWidgetValues(getDialogSettings(settings), idPrefix); - } - - /** - * Hook to restore the widget values finally plain from the given dialog settings. This method should - * not fragment the given dialog settings any further. - * - * @param settings The dialog settings to restore the widget values from. Must not be null! - * @param idPrefix The prefix to use for every dialog settings slot keys. If null, the dialog settings slot keys are not to prefix. - */ - public void doRestoreWidgetValues(IDialogSettings settings, String idPrefix) { - Assert.isNotNull(settings); - - for (String panelKey : configurationPanels.keySet()) { - IConfigurationPanel configPanel = getConfigurationPanel(panelKey); - if (configPanel != null && !isEmptyConfigurationPanel(configPanel)) { - IDialogSettings configPanelSettings = settings.getSection(panelKey); - if (configPanelSettings == null) configPanelSettings = settings.addNewSection(panelKey); - configPanel.doRestoreWidgetValues(configPanelSettings, idPrefix); - } - } - } - - /** - * Saves the widget values to the dialog settings store for remembering the history. The control might - * be embedded within multiple pages multiple times handling different properties. Because the single - * controls should not mix up the history, we create subsections within the given dialog settings if - * they do not already exist. After the sections has been created, the method calls doSaveWidgetValues - * for saving the single properties to the dialog settings. Subclasses may override doSaveWidgetValues - * only to deal with the single properties only or saveWidgetValues when to override the - * creation of the subsections. - * - * @param settings The dialog settings object instance to save the widget values to. Must not be null! - * @param idPrefix The prefix to use for every dialog settings slot keys. If null, the dialog settings slot keys are not to prefix. - */ - public final void saveWidgetValues(IDialogSettings settings, String idPrefix) { - Assert.isNotNull(settings); - - // now, call the hook for actually writing the single properties to the dialog settings. - doSaveWidgetValues(getDialogSettings(settings), idPrefix); - } - - /** - * Hook to save the widget values finally plain to the given dialog settings. This method should - * not fragment the given dialog settings any further. - * - * @param settings The dialog settings to save the widget values to. Must not be null! - * @param idPrefix The prefix to use for every dialog settings slot keys. If null, the dialog settings slot keys are not to prefix. - */ - public void doSaveWidgetValues(IDialogSettings settings, String idPrefix) { - Assert.isNotNull(settings); - - IConfigurationPanel configPanel = getActiveConfigurationPanel(); - if (configPanel != null && !isEmptyConfigurationPanel(configPanel)) { - String key = getActiveConfigurationPanelKey(); - IDialogSettings configPanelSettings = settings.getSection(key); - if (configPanelSettings == null) configPanelSettings = settings.addNewSection(key); - configPanel.doSaveWidgetValues(configPanelSettings, idPrefix); - } - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.IMessageProvider#getMessage() - */ - @Override - public final String getMessage() { - return message; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.IMessageProvider#getMessageType() - */ - @Override - public final int getMessageType() { - return messageType; - } - - /** - * Set the message and the message type to display. - * - * @param message The message or null. - * @param messageType The message type or IMessageProvider.NONE. - */ - @Override - public final void setMessage(String message, int messageType) { - this.message = message; - this.messageType = messageType; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/controls/NoteCompositeHelper.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/controls/NoteCompositeHelper.java deleted file mode 100644 index a861234..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/controls/NoteCompositeHelper.java +++ /dev/null @@ -1,173 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.controls; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.tm.terminal.view.ui.nls.Messages; - -/** - * A helper class to create a composite with a highlighted note - * entry and a message text. - */ -public class NoteCompositeHelper { - - /** - * The common label text to show on a note. Defaults to "Note:". - */ - public static final String NOTE_LABEL = Messages.NoteCompositeHelper_note_label; - - private static class NoteComposite extends Composite { - - public NoteComposite(Composite parent, int style) { - super(parent, style); - } - - @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - Control[] childs = getChildren(); - for (int iChild = 0; iChild < childs.length; iChild++) { - Control child = childs[iChild]; - child.setEnabled(enabled); - } - } - } - - /** - * Creates a composite with a highlighted Note entry and a message text. - * This is designed to take up the full width of the page. - * - * @see PreferencePage#createNoteComposite, this is a plain copy of that! - * @param font - * the font to use - * @param composite - * the parent composite - * @param title - * the title of the note - * @param message - * the message for the note - * - * @return the composite for the note - */ - public static Composite createNoteComposite(Font font, Composite composite, String title, String message) { - return createNoteComposite(font, composite, title, message, SWT.DEFAULT); - } - - /** - * Creates a composite with a highlighted Note entry and a message text. - * This is designed to take up the full width of the page. - * - * @see PreferencePage#createNoteComposite, this is a plain copy of that! - * @param font - * the font to use - * @param composite - * the parent composite - * @param title - * the title of the note - * @param message - * the message for the note - * @param minCharsPerLine - * the minimum number of characters per line. Defaults to '65' if less than '20'. - * - * @return the composite for the note - */ - public static Composite createNoteComposite(Font font, Composite composite, String title, String message, int minCharsPerLine) { - final GC gc = new GC(composite); - gc.setFont(font); - - Composite messageComposite = new NoteComposite(composite, SWT.NONE); - - GridLayout messageLayout = new GridLayout(); - messageLayout.numColumns = 2; - messageLayout.marginWidth = 0; - messageLayout.marginHeight = 0; - messageComposite.setLayout(messageLayout); - - GridData layoutData = new GridData(GridData.HORIZONTAL_ALIGN_FILL); - if (composite.getLayout() instanceof GridLayout) { - layoutData.horizontalSpan = ((GridLayout) composite.getLayout()).numColumns; - } - messageComposite.setLayoutData(layoutData); - messageComposite.setFont(font); - - final Label noteLabel = new Label(messageComposite, SWT.BOLD); - noteLabel.setText(title); - noteLabel.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT)); - noteLabel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); - - final IPropertyChangeListener fontListener = new IPropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent event) { - // Note: This is actually wrong but the same as in platforms - // PreferencePage - if (JFaceResources.BANNER_FONT.equals(event.getProperty())) { - noteLabel.setFont(JFaceResources.getFont(JFaceResources.BANNER_FONT)); - } - } - }; - JFaceResources.getFontRegistry().addListener(fontListener); - noteLabel.addDisposeListener(new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent event) { - JFaceResources.getFontRegistry().removeListener(fontListener); - } - }); - - Label messageLabel = new Label(messageComposite, SWT.WRAP); - messageLabel.setText(message); - messageLabel.setFont(font); - - /** - * Set the controls style to FILL_HORIZONTAL making it multi-line if - * needed - */ - layoutData = new GridData(GridData.FILL_HORIZONTAL); - layoutData.widthHint = Dialog.convertWidthInCharsToPixels(gc.getFontMetrics(), minCharsPerLine >= 20 ? minCharsPerLine : 65); - messageLabel.setLayoutData(layoutData); - - gc.dispose(); - - return messageComposite; - } - - /** - * change the text of the second label - * - * @param messageComposite - * the NoteComposite that gets returned from createNoteComposite - * @param msg - * the new text - */ - public static void setMessage(Composite messageComposite, String msg) { - if (messageComposite instanceof NoteComposite) { - Control[] children = messageComposite.getChildren(); - if (children.length == 2) { - Control c = children[1]; - if (c instanceof Label) { - ((Label) c).setText(msg); - messageComposite.pack(); - } - } - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/help/IContextHelpIds.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/help/IContextHelpIds.java deleted file mode 100644 index f4f2a07..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/help/IContextHelpIds.java +++ /dev/null @@ -1,44 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2016 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Dirk Fauth - Bug 460496 - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.help; - -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; - - -/** - * UI Context help id definitions. - * - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - */ -public interface IContextHelpIds { - - /** - * UI plug-in common context help id prefix. - */ - public final static String PREFIX = UIPlugin.getUniqueIdentifier() + "."; //$NON-NLS-1$ - - /** - * Launch terminal settings dialog. - */ - public final static String LAUNCH_TERMINAL_SETTINGS_DIALOG = PREFIX + "LaunchTerminalSettingsDialog"; //$NON-NLS-1$ - - /** - * Terminal control encoding selection dialog. - */ - public final static String ENCODING_SELECTION_DIALOG = PREFIX + "EncodingSelectionDialog"; //$NON-NLS-1$ - - /** - * External executables dialog. - * @since 4.1 - */ - public final static String EXTERNAL_EXECUTABLES_DIALOG = PREFIX + "ExternalExecutablesDialog"; //$NON-NLS-1$ -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IConfigurationPanel.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IConfigurationPanel.java deleted file mode 100644 index dcdfc67..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IConfigurationPanel.java +++ /dev/null @@ -1,144 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.interfaces; - -import java.util.Map; - -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.dialogs.IMessageProvider; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel; - -/** - * Terminal launcher configuration panel. - * - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - * Clients should extend {@link AbstractConfigurationPanel} instead. - */ -public interface IConfigurationPanel extends IMessageProvider { - - /** - * Returns the configuration panel container. - * - * @return The configuration panel container or null. - */ - public IConfigurationPanelContainer getContainer(); - - /** - * Creates the terminal launcher configuration panel UI elements within the - * given parent composite. Terminal launcher configuration panels should always - * create another composite within the given composite, which is the panel top - * control. The top control is queried later from the stack layout to show the - * different panels if the selected terminal launcher changed. - * - * @param parent The parent composite to create the UI elements in. Must not be null. - */ - public void setupPanel(Composite parent); - - /** - * Cleanup all resources the wizard configuration panel might have been created. - */ - public void dispose(); - - /** - * Returns the terminal launcher configuration panels top control, typically a - * composite control. This control is requested every time the stack layout is - * required to set a new top control because the selected terminal launcher changed. - * - * @return The top control or null if the configuration panel has been not setup yet. - */ - public Composite getControl(); - - /** - * Validates the control and sets the message text and type so the parent - * page or control is able to display validation result informations. - * The default implementation of this method does nothing. - * - * @return Result of validation. - */ - public boolean isValid(); - - /** - * Restore the widget values plain from the given dialog settings. This method should - * not fragment the given dialog settings any further. - * - * @param settings The dialog settings to restore the widget values from. Must not be null! - * @param idPrefix The prefix to use for every dialog settings slot keys. If null, the dialog settings slot keys are not to prefix. - */ - public void doRestoreWidgetValues(IDialogSettings settings, String idPrefix); - - /** - * Save the widget values plain to the given dialog settings. This method should - * not fragment the given dialog settings any further. - * - * @param settings The dialog settings to save the widget values to. Must not be null! - * @param idPrefix The prefix to use for every dialog settings slot keys. If null, the dialog settings slot keys are not to prefix. - */ - public void doSaveWidgetValues(IDialogSettings settings, String idPrefix); - - /** - * Enables or disables all UI elements belonging to the wizard configuration panel. - * - * @param enabled True to enable the UI elements, false otherwise. - */ - public void setEnabled(boolean enabled); - - /** - * Called when the panel gets the active panel. - */ - public void activate(); - - /** - * Initialize the widgets based of the data from the given map. - *

            - * This method may called multiple times during the lifetime of the panel and the given - * map might be even null. - * - * @param data The map or null. - */ - public void setupData(Map data); - - /** - * Extract the data from the widgets and write it back to the given map. - *

            - * This method may called multiple times during the lifetime of the panel and the given - * map might be even null. - * - * @param data The map or null. - */ - public void extractData(Map data); - - /** - * Update the data from the given properties container which contains the current - * working data. - *

            - * This method may called multiple times during the lifetime of the panel and the given - * map might be even null. - * - * @param data The map or null. - */ - public void updateData(Map data); - - /** - * Set the selection to the terminal launcher configuration panel. - * - * @param selection The selection or null. - */ - public void setSelection(ISelection selection); - - /** - * Returns the selection associated with the terminal launcher configuration panel. - * - * @return The selection or null. - */ - public ISelection getSelection(); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IConfigurationPanelContainer.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IConfigurationPanelContainer.java deleted file mode 100644 index 9be4adf..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IConfigurationPanelContainer.java +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.interfaces; - - - -/** - * A container to deal with configuration panels. - * - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - */ -public interface IConfigurationPanelContainer { - - /** - * Validates the container status. - *

            - * If necessary, set the corresponding messages and message types to signal when some sub - * elements of the container needs user attention. - */ - public void validate(); - - /** - * Set the message and the message type to display. - * - * @param message The message or null. - * @param messageType The message type or IMessageProvider.NONE. - */ - public void setMessage(String message, int messageType); - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IExternalExecutablesProperties.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IExternalExecutablesProperties.java deleted file mode 100644 index 78fcc4b..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IExternalExecutablesProperties.java +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2016 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Dirk Fauth - [460496] Moved from o.e.tm.t.connector.local.showin.interfaces - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.interfaces; - -/** - * External executables data property names. - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - * @since 4.1 - */ -public interface IExternalExecutablesProperties { - - /** - * The name/label of the external executable. - */ - public final String PROP_NAME = "Name"; //$NON-NLS-1$ - - /** - * The absolute path of the external executable. - */ - public final String PROP_PATH = "Path"; //$NON-NLS-1$ - - /** - * The arguments to pass to the external executable. - */ - public final String PROP_ARGS = "Args"; //$NON-NLS-1$ - - /** - * The absolute path to the icon representing the external executable. - */ - public final String PROP_ICON = "Icon"; //$NON-NLS-1$ - - /** - * If set, backslashes are translated to forward slashes on paste. - */ - public final String PROP_TRANSLATE = "Translate"; //$NON-NLS-1$ -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/ILauncherDelegate.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/ILauncherDelegate.java deleted file mode 100644 index c7b7be3..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/ILauncherDelegate.java +++ /dev/null @@ -1,97 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.interfaces; - -import java.util.Map; - -import org.eclipse.core.expressions.Expression; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IExecutableExtension; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalService; -import org.eclipse.tm.terminal.view.ui.launcher.AbstractLauncherDelegate; - -/** - * Terminal launcher delegate. - * - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - * Clients should extend {@link AbstractLauncherDelegate} instead. - */ -public interface ILauncherDelegate extends IExecutableExtension, IAdaptable { - - /** - * Returns the unique id of the launcher delegate. The returned - * id must be never null or an empty string. - * - * @return The unique id. - */ - public String getId(); - - /** - * Returns the label or UI name of the launcher delegate. - * - * @return The label or UI name. An empty string if not set. - */ - public String getLabel(); - - /** - * Returns if or if not the launcher delegate is hidden for the user. - * - * @return True if the launcher delegate is hidden, false otherwise. - */ - public boolean isHidden(); - - /** - * Returns the enablement expression. - * - * @return The enablement expression or null. - */ - public Expression getEnablement(); - - /** - * Returns if or if not the user needs to set configuration details for this launcher to work. - * The settings to configure are provided to the user through the configuration panel returned - * by {@link #getPanel(BaseDialogPageControl)}. - * - * @return True if a user configuration is required, false otherwise. - */ - public boolean needsUserConfiguration(); - - /** - * Returns the configuration panel instance to present to the user. The instance must be always - * the same on subsequent calls until disposed. - *

            - * The method may return null if the launcher does not provide any user - * configurable settings. In this case, {@link #needsUserConfiguration()} should return - * false. - * - * @param container The configuration panel container or null. - * @return The configuration panel instance or null - */ - public IConfigurationPanel getPanel(IConfigurationPanelContainer container); - - /** - * Execute the terminal launch. - * - * @param properties The properties. Must not be null. - * @param done The callback or null. - */ - public void execute(Map properties, ITerminalService.Done done); - - /** - * Creates the terminal connector for this launcher delegate based on - * the given properties. - * - * @param properties The terminal properties. Must not be null. - * @return The terminal connector or null. - */ - public ITerminalConnector createTerminalConnector(Map properties); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IMementoHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IMementoHandler.java deleted file mode 100644 index 5afbf66..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IMementoHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.interfaces; - -import java.util.Map; - -import org.eclipse.ui.IMemento; - -/** - * Terminal properties memento handler. - */ -public interface IMementoHandler { - - /** - * Saves the terminal properties in the given memento. - * - * @param memento The memento. Must not be null. - * @param properties The map containing the terminal properties to save. Must not be null. - */ - public void saveState(IMemento memento, Map properties); - - /** - * Restore the terminal properties from the given memento. - * - * @param memento The memento. Must not be null. - * @param properties The map receiving the restored terminal properties. Must not be null. - */ - public void restoreState(IMemento memento, Map properties); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IPreferenceKeys.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IPreferenceKeys.java deleted file mode 100644 index c4df89d..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IPreferenceKeys.java +++ /dev/null @@ -1,67 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2016 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Dirk Fauth - Bug 460496 - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.interfaces; - -/** - * Terminal plug-in preference key definitions. - * - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - */ -public interface IPreferenceKeys { - /** - * Preference keys family prefix. - */ - public final String PREF_TERMINAL = "terminals"; //$NON-NLS-1$ - - /** - * Preference key: Remove terminated terminals when a new terminal is created. - */ - public final String PREF_REMOVE_TERMINATED_TERMINALS = PREF_TERMINAL + ".removeTerminatedTerminals"; //$NON-NLS-1$ - - // showin preferences - - /** - * Preference key: Local terminal initial working directory. - * @since 4.1 - */ - public final String PREF_LOCAL_TERMINAL_INITIAL_CWD = PREF_TERMINAL + ".localTerminalInitialCwd"; //$NON-NLS-1$ - - /** - * Preference value: Local terminal initial working directory is "User home" - * @since 4.1 - */ - public final String PREF_INITIAL_CWD_USER_HOME = "userhome"; //$NON-NLS-1$ - - /** - * Preference value: Local terminal initial working directory is "Eclipse home" - * @since 4.1 - */ - public final String PREF_INITIAL_CWD_ECLIPSE_HOME = "eclipsehome"; //$NON-NLS-1$ - - /** - * Preference value: Local terminal initial working directory is "Eclipse workspace" - * @since 4.1 - */ - public final String PREF_INITIAL_CWD_ECLIPSE_WS = "eclipsews"; //$NON-NLS-1$ - - /** - * Preference key: Local terminal default shell command on Unix hosts. - * @since 4.1 - */ - public final String PREF_LOCAL_TERMINAL_DEFAULT_SHELL_UNIX = PREF_TERMINAL + ".localTerminalDefaultShellUnix"; //$NON-NLS-1$ - - /** - * Preference key: Local terminal default shell command arguments on Unix hosts. - * @since 4.1 - */ - public final String PREF_LOCAL_TERMINAL_DEFAULT_SHELL_UNIX_ARGS = PREF_TERMINAL + ".localTerminalDefaultShellUnixArgs"; //$NON-NLS-1$ -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/ITerminalsView.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/ITerminalsView.java deleted file mode 100644 index c3a5ec8..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/ITerminalsView.java +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Max Weninger (Wind River) - [361363] [TERMINALS] Implement "Pin&Clone" for the "Terminals" view - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.interfaces; - -import org.eclipse.ui.IViewPart; - -/** - * Terminal view public interface. - * - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - */ -public interface ITerminalsView extends IViewPart { - - /** - * Switch to the empty page control. - */ - public void switchToEmptyPageControl(); - - /** - * Switch to the tab folder control. - */ - public void switchToTabFolderControl(); - - /** - * Returns the context help id associated with the terminal - * console view instance. - * - * @return The context help id or null if none is associated. - */ - public String getContextHelpId(); -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IUIConstants.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IUIConstants.java deleted file mode 100644 index dcaaddd..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/IUIConstants.java +++ /dev/null @@ -1,24 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.interfaces; - -/** - * Terminal common UI constants. - * - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - */ -public interface IUIConstants { - /** - * The view id of the terminals view. - */ - public static final String ID = "org.eclipse.tm.terminal.view.ui.TerminalsView"; //$NON-NLS-1$ - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/ImageConsts.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/ImageConsts.java deleted file mode 100644 index dd43cb7..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/ImageConsts.java +++ /dev/null @@ -1,102 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Max Weninger (Wind River) - [361363] [TERMINALS] Implement "Pin&Clone" for the "Terminals" view - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.interfaces; - -/** - * Image registry constants. - * - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - */ -public interface ImageConsts { - /** - * The root directory where to load the images from, relative to - * the bundle directory. - */ - public final static String IMAGE_DIR_ROOT = "icons/"; //$NON-NLS-1$ - - /** - * The directory where to load colored local toolbar images from, - * relative to the image root directory. - */ - public final static String IMAGE_DIR_CLCL = "clcl16/"; //$NON-NLS-1$ - - /** - * The directory where to load disabled local toolbar images from, - * relative to the image root directory. - */ - public final static String IMAGE_DIR_DLCL = "dlcl16/"; //$NON-NLS-1$ - - /** - * The directory where to load enabled local toolbar images from, - * relative to the image root directory. - */ - public final static String IMAGE_DIR_ELCL = "elcl16/"; //$NON-NLS-1$ - - /** - * The directory where to load view related images from, relative to - * the image root directory. - */ - public final static String IMAGE_DIR_EVIEW = "eview16/"; //$NON-NLS-1$ - - /** - * The key to access the terminals console view image. - */ - public static final String VIEW_Terminals = "TerminalsView"; //$NON-NLS-1$ - - /** - * The key to access the scroll lock action image (enabled). - */ - public static final String ACTION_ScrollLock_Enabled = "ScrollLockAction_enabled"; //$NON-NLS-1$ - - /** - * The key to access the scroll lock action image (disabled). - */ - public static final String ACTION_ScrollLock_Disabled = "ScrollLockAction_disabled"; //$NON-NLS-1$ - - /** - * The key to access the scroll lock action image (hover). - */ - public static final String ACTION_ScrollLock_Hover = "ScrollLockAction_hover"; //$NON-NLS-1$ - - /** - * The key to access the new terminal view action image (enabled). - * @since 4.1 - */ - public static final String ACTION_NewTerminalView_Enabled = "NewTerminalViewAction_enabled"; //$NON-NLS-1$ - - /** - * The key to access the new terminal view action image (disabled). - * @since 4.1 - */ - public static final String ACTION_NewTerminalView_Disabled = "NewTerminalViewAction_disabled"; //$NON-NLS-1$ - - /** - * The key to access the new terminal view action image (hover). - * @since 4.1 - */ - public static final String ACTION_NewTerminalView_Hover = "NewTerminalViewAction_hover"; //$NON-NLS-1$ - - /** - * The key to access the toggle command field action image (enabled). - */ - public static final String ACTION_ToggleCommandField_Enabled = "ToggleCommandField_enabled"; //$NON-NLS-1$ - - /** - * The key to access the toggle command field action image (disabled). - */ - public static final String ACTION_ToggleCommandField_Disabled = "ToggleCommandField_disabled"; //$NON-NLS-1$ - - /** - * The key to access the toggle command field action image (hover). - */ - public static final String ACTION_ToggleCommandField_Hover = "ToggleCommandField_hover"; //$NON-NLS-1$ -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/tracing/ITraceIds.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/tracing/ITraceIds.java deleted file mode 100644 index d0e4d4d..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/interfaces/tracing/ITraceIds.java +++ /dev/null @@ -1,29 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.interfaces.tracing; - -/** - * Core plug-in trace slot identifiers. - * - * @noextend This interface is not intended to be extended by clients. - * @noimplement This interface is not intended to be implemented by clients. - */ -public interface ITraceIds { - - /** - * If activated, tracing information about the terminals output stream monitor is printed out. - */ - public static final String TRACE_OUTPUT_STREAM_MONITOR = "trace/outputStreamMonitor"; //$NON-NLS-1$ - - /** - * If activated, tracing information about the launch terminal command handler is printed out. - */ - public static final String TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER = "trace/launchTerminalCommandHandler"; //$NON-NLS-1$ -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/ExternalExecutablesState.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/ExternalExecutablesState.java deleted file mode 100644 index 83e009c..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/ExternalExecutablesState.java +++ /dev/null @@ -1,55 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016 Dirk Fauth and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Dirk Fauth - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.internal; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.tm.terminal.view.ui.local.showin.ExternalExecutablesManager; -import org.eclipse.ui.AbstractSourceProvider; -import org.eclipse.ui.ISources; - -/** - * SourceProvider that provides a state to determine whether external executables are configured or not. - */ -public class ExternalExecutablesState extends AbstractSourceProvider { - public final static String CONFIGURED_STATE = "org.eclipse.tm.terminal.external.executable.configured"; //$NON-NLS-1$ - private boolean enabled; - - public ExternalExecutablesState() { - List> externals = ExternalExecutablesManager.load(); - this.enabled = (externals != null && !externals.isEmpty()); - } - - @Override - public String[] getProvidedSourceNames() { - return new String[] { CONFIGURED_STATE }; - } - - @Override - public Map getCurrentState() { - Map map = new HashMap(1); - map.put(CONFIGURED_STATE, Boolean.valueOf(enabled).toString().toUpperCase()); - return map; - } - - public void enable() { - fireSourceChanged(ISources.WORKBENCH, CONFIGURED_STATE, "TRUE"); //$NON-NLS-1$ - } - - public void disable() { - fireSourceChanged(ISources.WORKBENCH, CONFIGURED_STATE, "FALSE"); //$NON-NLS-1$ - } - - @Override - public void dispose() { - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/PropertyTester.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/PropertyTester.java deleted file mode 100644 index ea40411..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/PropertyTester.java +++ /dev/null @@ -1,58 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.internal; - -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.terminal.view.ui.interfaces.ITerminalsView; -import org.eclipse.tm.terminal.view.ui.launcher.LauncherDelegateManager; -import org.eclipse.tm.terminal.view.ui.tabs.TabFolderManager; - - -/** - * Terminal property tester implementation. - */ -public class PropertyTester extends org.eclipse.core.expressions.PropertyTester { - - /* (non-Javadoc) - * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object) - */ - @SuppressWarnings("cast") - @Override - public boolean test(Object receiver, String property, Object[] args, Object expectedValue) { - - if ("hasApplicableLauncherDelegates".equals(property)) { //$NON-NLS-1$ - ISelection selection = receiver instanceof ISelection ? (ISelection)receiver : new StructuredSelection(receiver); - return expectedValue.equals(Boolean.valueOf(LauncherDelegateManager.getInstance().getApplicableLauncherDelegates(selection).length > 0)); - } - - if ("canDisconnect".equals(property) && receiver instanceof ITerminalsView) { //$NON-NLS-1$ - CTabItem tabItem = null; - - TabFolderManager manager = (TabFolderManager) ((ITerminalsView)receiver).getAdapter(TabFolderManager.class); - if (manager != null) { - tabItem = manager.getActiveTabItem(); - } - - if (tabItem != null && !tabItem.isDisposed() && tabItem.getData() instanceof ITerminalViewControl) { - ITerminalViewControl terminal = (ITerminalViewControl)tabItem.getData(); - TerminalState state = terminal.getState(); - return expectedValue.equals(Boolean.valueOf(state != TerminalState.CLOSED)); - } - return false; - } - - return false; - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/SettingsStore.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/SettingsStore.java deleted file mode 100644 index 3d92a2a..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/SettingsStore.java +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.internal; - -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; - -/** - * Simple default Terminal settings store implementation keeping the settings - * within memory. - */ -public class SettingsStore implements ISettingsStore { - private final Map settings = new HashMap(); - - /** - * Constructor. - */ - public SettingsStore() { - } - - /** - * Returns the map containing the settings. - * - * @return The map containing the settings. - */ - public final Map getSettings() { - return settings; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore#get(java.lang.String, java.lang.String) - */ - @Override - public final String get(String key, String defaultValue) { - Assert.isNotNull(key); - String value = settings.get(key) instanceof String ? (String) settings.get(key) : null; - return value != null ? value : defaultValue; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore#get(java.lang.String) - */ - @Override - public final String get(String key) { - Assert.isNotNull(key); - return settings.get(key) instanceof String ? (String) settings.get(key) : null; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore#put(java.lang.String, java.lang.String) - */ - @Override - public final void put(String key, String value) { - Assert.isNotNull(key); - if (value == null) settings.remove(key); - else settings.put(key, value); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/EncodingSelectionDialog.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/EncodingSelectionDialog.java deleted file mode 100644 index b129b5a..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/EncodingSelectionDialog.java +++ /dev/null @@ -1,230 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.internal.dialogs; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.dialogs.TrayDialog; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.ScrolledComposite; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.tm.terminal.view.ui.help.IContextHelpIds; -import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.tm.terminal.view.ui.panels.AbstractExtendedConfigurationPanel; -import org.eclipse.ui.PlatformUI; - -/** - * Encoding selection dialog implementation. - */ -public class EncodingSelectionDialog extends TrayDialog { - private String contextHelpId = null; - - // The selected encoding or null - /* default */ String encoding = null; - - // Reference to the encodings panel - private EncodingPanel encodingPanel = null; - - /** - * Encodings panel implementation - */ - protected class EncodingPanel extends AbstractExtendedConfigurationPanel { - - /** - * Constructor - * - * @param container The configuration panel container or null. - */ - public EncodingPanel(IConfigurationPanelContainer container) { - super(container); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#setupPanel(org.eclipse.swt.widgets.Composite) - */ - @Override - public void setupPanel(Composite parent) { - Composite panel = new Composite(parent, SWT.NONE); - panel.setLayout(new GridLayout()); - GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); - panel.setLayoutData(data); - - // Create the encoding selection combo - createEncodingUI(panel, false); - if (EncodingSelectionDialog.this.encoding != null) { - setEncoding(EncodingSelectionDialog.this.encoding); - } - - setControl(panel); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#saveSettingsForHost(boolean) - */ - @Override - protected void saveSettingsForHost(boolean add) { - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#fillSettingsForHost(java.lang.String) - */ - @Override - protected void fillSettingsForHost(String host) { - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#getHostFromSettings() - */ - @Override - protected String getHostFromSettings() { - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#getEncoding() - */ - @Override - public String getEncoding() { - return super.getEncoding(); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#setEncoding(java.lang.String) - */ - @Override - public void setEncoding(String encoding) { - super.setEncoding(encoding); - } - } - - /** - * Constructor. - * - * @param shell The parent shell or null. - */ - public EncodingSelectionDialog(Shell shell) { - super(shell); - - this.contextHelpId = IContextHelpIds.ENCODING_SELECTION_DIALOG; - setHelpAvailable(true); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) - */ - @Override - protected final Control createDialogArea(Composite parent) { - if (contextHelpId != null) { - PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, contextHelpId); - } - - // Let the super implementation create the dialog area control - Control control = super.createDialogArea(parent); - // Setup the inner panel as scrollable composite - if (control instanceof Composite) { - ScrolledComposite sc = new ScrolledComposite((Composite)control, SWT.V_SCROLL); - - GridLayout layout = new GridLayout(1, true); - layout.marginHeight = 0; layout.marginWidth = 0; - layout.verticalSpacing = 0; layout.horizontalSpacing = 0; - - sc.setLayout(layout); - sc.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL)); - - sc.setExpandHorizontal(true); - sc.setExpandVertical(true); - - Composite composite = new Composite(sc, SWT.NONE); - composite.setLayout(new GridLayout()); - - // Setup the dialog area content - createDialogAreaContent(composite); - - sc.setContent(composite); - sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); - - // Return the scrolled composite as new dialog area control - control = sc; - } - - return control; - } - - /** - * Creates the dialog area content. - * - * @param parent The parent composite. Must not be null. - */ - protected void createDialogAreaContent(Composite parent) { - Assert.isNotNull(parent); - - setDialogTitle(Messages.EncodingSelectionDialog_title); - - Composite panel = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(2, false); - layout.marginHeight = 0; layout.marginWidth = 0; - panel.setLayout(layout); - panel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true)); - - encodingPanel = new EncodingPanel(null); - encodingPanel.setupPanel(panel); - - applyDialogFont(panel); - } - - /** - * Sets the title for this dialog. - * - * @param title The title. - */ - public void setDialogTitle(String title) { - if (getShell() != null && !getShell().isDisposed()) { - getShell().setText(title); - } - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#okPressed() - */ - @Override - protected void okPressed() { - // Save the selected encoding - if (encodingPanel != null) encoding = encodingPanel.getEncoding(); - super.okPressed(); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#cancelPressed() - */ - @Override - protected void cancelPressed() { - // Reset the encoding - encoding = null; - super.cancelPressed(); - } - - /** - * Set the encoding to default to on creating the dialog. - */ - public final void setEncoding(String encoding) { - this.encoding = encoding; - } - - /** - * Returns the selected encoding or null. - */ - public final String getEncoding() { - return encoding; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/LaunchTerminalSettingsDialog.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/LaunchTerminalSettingsDialog.java deleted file mode 100644 index af52d93..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/LaunchTerminalSettingsDialog.java +++ /dev/null @@ -1,647 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2016 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Max Weninger (Wind River) - [361352] [TERMINALS][SSH] Add SSH terminal support - * Dirk Fauth - Bug 460496 - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.internal.dialogs; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.dialogs.TrayDialog; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.ScrolledComposite; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.controls.ConfigurationPanelControl; -import org.eclipse.tm.terminal.view.ui.help.IContextHelpIds; -import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel; -import org.eclipse.tm.terminal.view.ui.interfaces.IExternalExecutablesProperties; -import org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate; -import org.eclipse.tm.terminal.view.ui.interfaces.tracing.ITraceIds; -import org.eclipse.tm.terminal.view.ui.launcher.LauncherDelegateManager; -import org.eclipse.tm.terminal.view.ui.local.showin.ExternalExecutablesManager; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.ui.ISelectionService; -import org.eclipse.ui.PlatformUI; - -/** - * Launch terminal settings dialog implementation. - */ -public class LaunchTerminalSettingsDialog extends TrayDialog { - private String contextHelpId = null; - - // The parent selection - private ISelection selection = null; - - // The sub controls - /* default */ Combo terminals; - /* default */ SettingsPanelControl settings; - - // Map the label added to the combo box to the corresponding launcher delegate. - /* default */ final Map label2delegate = new HashMap(); - - // Map the label added to the combo box to the corresponding launcher properties for external executables. - /* default */ final Map> label2properties = new HashMap>(); - - // The data object containing the currently selected settings - private Map data = null; - - // The dialog settings storage - private IDialogSettings dialogSettings; - - // In case of a single available terminal launcher delegate, the label of that delegate - private String singleDelegateLabel = null; - - /** - * The control managing the terminal setting panels. - */ - protected class SettingsPanelControl extends ConfigurationPanelControl { - - /** - * Constructor. - */ - public SettingsPanelControl() { - setPanelIsGroup(true); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.controls.ConfigurationPanelControl#getGroupLabel() - */ - @Override - public String getGroupLabel() { - return Messages.LaunchTerminalSettingsDialog_group_label; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.controls.ConfigurationPanelControl#showConfigurationPanel(java.lang.String) - */ - @Override - public void showConfigurationPanel(String key) { - // Check if we have to create the panel first - IConfigurationPanel configPanel = getConfigurationPanel(key); - if (isEmptyConfigurationPanel(configPanel)) { - // Get the corresponding delegate - ILauncherDelegate delegate = label2delegate.get(key); - Assert.isNotNull(delegate); - // Create the wizard configuration panel instance - configPanel = delegate.getPanel(this); - if (configPanel != null) { - // Add it to the settings panel control - settings.addConfigurationPanel(key, configPanel); - // Push the selection to the configuration panel - configPanel.setSelection(getSelection()); - // Create the panel controls - configPanel.setupPanel(getPanel()); - // Restore widget values - IDialogSettings dialogSettings = LaunchTerminalSettingsDialog.this.settings.getDialogSettings(LaunchTerminalSettingsDialog.this.getDialogSettings()); - IDialogSettings configPanelSettings = dialogSettings != null ? dialogSettings.getSection(key) : null; - if (configPanelSettings != null) configPanel.doRestoreWidgetValues(configPanelSettings, null); - } - } - - super.showConfigurationPanel(key); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer#validate() - */ - @Override - public void validate() { - LaunchTerminalSettingsDialog.this.validate(); - } - } - - /** - * Constructor. - * - * @param shell The parent shell or null. - */ - public LaunchTerminalSettingsDialog(Shell shell) { - this(shell, 0); - } - - private long start = 0; - - /** - * Constructor. - * - * @param shell The parent shell or null. - */ - public LaunchTerminalSettingsDialog(Shell shell, long start) { - super(shell); - this.start = start; - - initializeDialogSettings(); - - this.contextHelpId = IContextHelpIds.LAUNCH_TERMINAL_SETTINGS_DIALOG; - setHelpAvailable(true); - } - - /** - * Sets the parent selection. - * - * @param selection The parent selection or null. - */ - public void setSelection(ISelection selection) { - this.selection = selection; - } - - /** - * Returns the parent selection. - * - * @return The parent selection or null. - */ - public ISelection getSelection() { - return selection; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#close() - */ - @Override - public boolean close() { - dispose(); - return super.close(); - } - - /** - * Dispose the dialog resources. - */ - protected void dispose() { - if (settings != null) { settings.dispose(); settings = null; } - dialogSettings = null; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#isResizable() - */ - @Override - protected boolean isResizable() { - return true; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite) - */ - @Override - protected Control createContents(Composite parent) { - Control composite = super.createContents(parent); - - // Validate the dialog after having created all the content - validate(); - - return composite; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) - */ - @Override - protected final Control createDialogArea(Composite parent) { - if (contextHelpId != null) { - PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, contextHelpId); - } - - // Let the super implementation create the dialog area control - Control control = super.createDialogArea(parent); - // Setup the inner panel as scrollable composite - if (control instanceof Composite) { - ScrolledComposite sc = new ScrolledComposite((Composite)control, SWT.V_SCROLL); - - GridLayout layout = new GridLayout(1, true); - layout.marginHeight = 0; layout.marginWidth = 0; - layout.verticalSpacing = 0; layout.horizontalSpacing = 0; - - sc.setLayout(layout); - sc.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL)); - - sc.setExpandHorizontal(true); - sc.setExpandVertical(true); - - Composite composite = new Composite(sc, SWT.NONE); - composite.setLayout(new GridLayout()); - - // Setup the dialog area content - createDialogAreaContent(composite); - - sc.setContent(composite); - sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); - - // Return the scrolled composite as new dialog area control - control = sc; - } - - return control; - } - - /** - * Sets the title for this dialog. - * - * @param title The title. - */ - public void setDialogTitle(String title) { - if (getShell() != null && !getShell().isDisposed()) { - getShell().setText(title); - } - } - - /** - * Creates the dialog area content. - * - * @param parent The parent composite. Must not be null. - */ - protected void createDialogAreaContent(Composite parent) { - Assert.isNotNull(parent); - - if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER)) { - UIPlugin.getTraceHandler().trace("Creating dialog area after " + (System.currentTimeMillis() - start) + " ms.", //$NON-NLS-1$ //$NON-NLS-2$ - ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER, LaunchTerminalSettingsDialog.this); - } - - setDialogTitle(Messages.LaunchTerminalSettingsDialog_title); - - final List items = getTerminals(); - - Composite panel = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(2, false); - layout.marginHeight = 0; layout.marginWidth = 0; - panel.setLayout(layout); - panel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true)); - - if (items.size() != 1) { - Label label = new Label(panel, SWT.HORIZONTAL); - label.setText(Messages.LaunchTerminalSettingsDialog_combo_label); - - terminals = new Combo(panel, SWT.READ_ONLY); - terminals.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - terminals.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - // Get the old panel - IConfigurationPanel oldPanel = settings.getActiveConfigurationPanel(); - // Extract the current settings in an special properties container - Map data = new HashMap(); - if (oldPanel != null) oldPanel.extractData(data); - // Clean out settings which are never passed between the panels - data.remove(ITerminalsConnectorConstants.PROP_IP_PORT); - data.remove(ITerminalsConnectorConstants.PROP_TIMEOUT); - data.remove(ITerminalsConnectorConstants.PROP_TERMINAL_CONNECTOR_ID); - data.remove(ITerminalsConnectorConstants.PROP_ENCODING); - // Switch to the new panel - settings.showConfigurationPanel(terminals.getText()); - // Get the new panel - IConfigurationPanel newPanel = settings.getActiveConfigurationPanel(); - // Re-setup the relevant data - if (newPanel != null) newPanel.setupData(data); - - // resize the dialog if needed to show the complete panel - getShell().pack(); - // validate the settings dialog - validate(); - } - }); - - // fill the combo with content - fillCombo(terminals, items); - } else { - Assert.isTrue(items.size() == 1); - singleDelegateLabel = items.get(0); - } - - // Create the settings panel control - settings = new SettingsPanelControl(); - - // Create, initialize and add the first visible panel. All - // other panels are created on demand only. - String terminalLabel = terminals != null ? terminals.getItem(0) : singleDelegateLabel; - if (terminalLabel != null) { - // Get the corresponding delegate - ILauncherDelegate delegate = label2delegate.get(terminalLabel); - Assert.isNotNull(delegate); - // Create the wizard configuration panel instance - IConfigurationPanel configPanel = delegate.getPanel(settings); - if (configPanel != null) { - // Add it to the settings panel control - settings.addConfigurationPanel(terminalLabel, configPanel); - // Push the selection to the configuration panel - configPanel.setSelection(getSelection()); - } - } - - // Setup the panel control - settings.setupPanel(panel, terminals != null ? terminals.getItems() : new String[] { singleDelegateLabel }); - GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true); - layoutData.horizontalSpan = 2; - settings.getPanel().setLayoutData(layoutData); - - // Preselect the first terminal launcher - if (terminals != null) { - terminals.select(0); - settings.showConfigurationPanel(terminals.getText()); - - terminals.setEnabled(terminals.getItemCount() > 1); - } else { - settings.showConfigurationPanel(singleDelegateLabel); - } - - restoreWidgetValues(); - - applyDialogFont(panel); - - if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER)) { - UIPlugin.getTraceHandler().trace("Created dialog area after " + (System.currentTimeMillis() - start) + " ms.", //$NON-NLS-1$ //$NON-NLS-2$ - ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER, LaunchTerminalSettingsDialog.this); - } - } - - /** - * Fill the given combo with the given list of terminal launcher delegate labels. - * - * @param combo The combo. Must not be null. - * @param items The list of terminal launcher delegates. Must not be null. - */ - protected void fillCombo(Combo combo, List items) { - Assert.isNotNull(combo); - Assert.isNotNull(items); - - if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER)) { - UIPlugin.getTraceHandler().trace("Filling combo after " + (System.currentTimeMillis() - start) + " ms.", //$NON-NLS-1$ //$NON-NLS-2$ - ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER, LaunchTerminalSettingsDialog.this); - } - - Collections.sort(items); - combo.setItems(items.toArray(new String[items.size()])); - } - - /** - * Returns the list of terminal launcher delegate labels. The method queries the - * terminal launcher delegates and initialize the label2delegate map. - * - * @return The list of terminal launcher delegate labels or an empty list. - */ - protected List getTerminals() { - List items = new ArrayList(); - - ILauncherDelegate localLauncher = null; - - if(selection==null || selection.isEmpty()){ - if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER)) { - UIPlugin.getTraceHandler().trace("Getting launcher delegates after " + (System.currentTimeMillis() - start) + " ms.", //$NON-NLS-1$ //$NON-NLS-2$ - ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER, LaunchTerminalSettingsDialog.this); - } - - ILauncherDelegate[] delegates = LauncherDelegateManager.getInstance().getLauncherDelegates(false); - - if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER)) { - UIPlugin.getTraceHandler().trace("Got launcher delegates after " + (System.currentTimeMillis() - start) + " ms.", //$NON-NLS-1$ //$NON-NLS-2$ - ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER, LaunchTerminalSettingsDialog.this); - } - - for (ILauncherDelegate delegate : delegates) { - if (delegate.isHidden() || isFiltered(selection, delegate)) continue; - String label = delegate.getLabel(); - if (label == null || "".equals(label.trim())) label = delegate.getId(); //$NON-NLS-1$ - label2delegate.put(label, delegate); - items.add(label); - - if ("org.eclipse.tm.terminal.connector.local.launcher.local".equals(delegate.getId())) { //$NON-NLS-1$ - localLauncher = delegate; - } - } - } else { - if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER)) { - UIPlugin.getTraceHandler().trace("Getting applicable launcher delegates after " + (System.currentTimeMillis() - start) + " ms.", //$NON-NLS-1$ //$NON-NLS-2$ - ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER, LaunchTerminalSettingsDialog.this); - } - - ILauncherDelegate[] delegates = LauncherDelegateManager.getInstance().getApplicableLauncherDelegates(selection); - - if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER)) { - UIPlugin.getTraceHandler().trace("Got applicable launcher delegates after " + (System.currentTimeMillis() - start) + " ms.", //$NON-NLS-1$ //$NON-NLS-2$ - ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER, LaunchTerminalSettingsDialog.this); - } - - for (ILauncherDelegate delegate : delegates) { - if (delegate.isHidden() || isFiltered(selection, delegate)) continue; - String label = delegate.getLabel(); - if (label == null || "".equals(label.trim())) label = delegate.getId(); //$NON-NLS-1$ - label2delegate.put(label, delegate); - items.add(label); - - if ("org.eclipse.tm.terminal.connector.local.launcher.local".equals(delegate.getId())) { //$NON-NLS-1$ - localLauncher = delegate; - } - } - } - - // if the local launcher was found, check for configured external executables - if (localLauncher != null) { - List> l = ExternalExecutablesManager.load(); - if (l != null && !l.isEmpty()) { - for (Map executableData : l) { - String name = executableData.get(IExternalExecutablesProperties.PROP_NAME); - String path = executableData.get(IExternalExecutablesProperties.PROP_PATH); - String args = executableData.get(IExternalExecutablesProperties.PROP_ARGS); - - String strTranslate = executableData.get(IExternalExecutablesProperties.PROP_TRANSLATE); - boolean translate = strTranslate != null ? Boolean.parseBoolean(strTranslate) : false; - - if (name != null && !"".equals(name) && path != null && !"".equals(path)) { //$NON-NLS-1$ //$NON-NLS-2$ - ISelectionService service = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService(); - ISelection selection = service != null ? service.getSelection() : null; - if (selection != null && selection.isEmpty()) selection = null; - - Map properties = new HashMap(); - properties.put(ITerminalsConnectorConstants.PROP_PROCESS_PATH, path); - properties.put(ITerminalsConnectorConstants.PROP_PROCESS_ARGS, args); - properties.put(ITerminalsConnectorConstants.PROP_TRANSLATE_BACKSLASHES_ON_PASTE, Boolean.valueOf(translate)); - - // store external executable and properties - label2delegate.put(name, localLauncher); - label2properties.put(name, properties); - items.add(name); - } - } - } - - } - - return items; - } - - /** - * Hook to allow additional filtering of the applicable launcher delegates. - *

            - * Note: The default implementation always returns false. - * - * @param selection The selection or null. - * @param delegate The launcher delegate. Must not be null. - * - * @return True if the launcher delegate is filtered based on the given selection, false otherwise. - */ - protected boolean isFiltered(ISelection selection, ILauncherDelegate delegate) { - return false; - } - - /** - * Validate the dialog. - */ - public void validate() { - IConfigurationPanel panel = this.settings.getActiveConfigurationPanel(); - Button okButton = getButton(IDialogConstants.OK_ID); - if (okButton != null) okButton.setEnabled(panel.isValid()); - } - - /** - * Set the given message and message type. - * - * @param message The message or null. - * @param messageType The message type or IMessageProvider.NONE. - */ - public void setMessage(String message, int messageType) { - if (settings != null) { - settings.setMessage(message, messageType); - } - } - - /** - * Save the dialog's widget values. - */ - protected void saveWidgetValues() { - IDialogSettings settings = getDialogSettings(); - if (settings != null && terminals != null) { - settings.put("terminalLabel", terminals.getText()); //$NON-NLS-1$ - this.settings.saveWidgetValues(settings, null); - } - } - - /** - * Restore the dialog's widget values. - */ - protected void restoreWidgetValues() { - IDialogSettings settings = getDialogSettings(); - if (settings != null) { - String terminalLabel = settings.get("terminalLabel"); //$NON-NLS-1$ - int index = terminalLabel != null && terminals != null ? Arrays.asList(terminals.getItems()).indexOf(terminalLabel) : -1; - if (index != -1) { - terminals.select(index); - this.settings.showConfigurationPanel(terminals.getText()); - } - - this.settings.restoreWidgetValues(settings, null); - } - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#okPressed() - */ - @Override - protected void okPressed() { - IConfigurationPanel panel = this.settings.getActiveConfigurationPanel(); - Assert.isNotNull(panel); - - if (!panel.isValid()) { - MessageBox mb = new MessageBox(getShell(), SWT.ICON_ERROR | SWT.OK); - mb.setText(Messages.LaunchTerminalSettingsDialog_error_title); - mb.setMessage(NLS.bind(Messages.LaunchTerminalSettingsDialog_error_invalidSettings, panel.getMessage() != null ? panel.getMessage() : Messages.LaunchTerminalSettingsDialog_error_unknownReason)); - mb.open(); - return; - } - data = new HashMap(); - - // Store the id of the selected delegate - String terminalLabel = terminals != null ? terminals.getText() : singleDelegateLabel; - String delegateId = terminalLabel != null ? label2delegate.get(terminalLabel).getId() : null; - if (delegateId != null) data.put(ITerminalsConnectorConstants.PROP_DELEGATE_ID, delegateId); - // Store the selection - data.put(ITerminalsConnectorConstants.PROP_SELECTION, selection); - - // Add the properties for external executables if there are any - if (label2properties.containsKey(terminalLabel)) { - data.putAll(label2properties.get(terminalLabel)); - } - - // Store the delegate specific settings - panel.extractData(data); - - // Save the current widget values - saveWidgetValues(); - - super.okPressed(); - } - - /** - * Returns the configured terminal launcher settings. - *

            - * The settings are extracted from the UI widgets once - * OK got pressed. - * - * @return The configured terminal launcher settings or null. - */ - public Map getSettings() { - return data; - } - - /** - * Initialize the dialog settings storage. - */ - protected void initializeDialogSettings() { - IDialogSettings settings = UIPlugin.getDefault().getDialogSettings(); - Assert.isNotNull(settings); - IDialogSettings section = settings.getSection(getClass().getSimpleName()); - if (section == null) { - section = settings.addNewSection(getClass().getSimpleName()); - } - setDialogSettings(section); - } - - /** - * Returns the associated dialog settings storage. - * - * @return The dialog settings storage. - */ - public IDialogSettings getDialogSettings() { - // The dialog settings may not been initialized here. Initialize first in this case - // to be sure that we do have always the correct dialog settings. - if (dialogSettings == null) { - initializeDialogSettings(); - } - return dialogSettings; - } - - /** - * Sets the associated dialog settings storage. - * - * @return The dialog settings storage. - */ - public void setDialogSettings(IDialogSettings dialogSettings) { - this.dialogSettings = dialogSettings; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/AbstractTriggerCommandHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/AbstractTriggerCommandHandler.java deleted file mode 100644 index 07e36f0..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/AbstractTriggerCommandHandler.java +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.internal.handler; - -import org.eclipse.core.commands.AbstractHandler; -import org.eclipse.core.commands.Command; -import org.eclipse.core.commands.ParameterizedCommand; -import org.eclipse.core.expressions.EvaluationContext; -import org.eclipse.core.expressions.IEvaluationContext; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.ui.ISources; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.commands.ICommandService; -import org.eclipse.ui.handlers.IHandlerService; - -/** - * Abstract command handler triggering a command to be executed. - */ -public abstract class AbstractTriggerCommandHandler extends AbstractHandler { - - /** - * Trigger a command to be executed. - * - * @param commandId The command id. Must not be null. - * @param selection The selection to pass on to the command or null. - */ - @SuppressWarnings("cast") - protected void triggerCommand(String commandId, ISelection selection) { - Assert.isNotNull(commandId); - - ICommandService service = (ICommandService)PlatformUI.getWorkbench().getService(ICommandService.class); - Command command = service != null ? service.getCommand(commandId) : null; - if (command != null && command.isDefined() && command.isEnabled()) { - try { - ParameterizedCommand pCmd = ParameterizedCommand.generateCommand(command, null); - Assert.isNotNull(pCmd); - IHandlerService handlerSvc = (IHandlerService)PlatformUI.getWorkbench().getService(IHandlerService.class); - Assert.isNotNull(handlerSvc); - IEvaluationContext ctx = handlerSvc.getCurrentState(); - if (selection != null) { - ctx = new EvaluationContext(ctx, selection); - ctx.addVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME, selection); - } - handlerSvc.executeCommandInContext(pCmd, null, ctx); - } catch (Exception e) { - // If the platform is in debug mode, we print the exception to the log view - if (Platform.inDebugMode()) { - IStatus status = new Status(IStatus.ERROR, UIPlugin.getUniqueIdentifier(), - Messages.AbstractTriggerCommandHandler_error_executionFailed, e); - UIPlugin.getDefault().getLog().log(status); - } - } - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/DisconnectTerminalCommandHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/DisconnectTerminalCommandHandler.java deleted file mode 100644 index 142973b..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/DisconnectTerminalCommandHandler.java +++ /dev/null @@ -1,62 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.internal.handler; - -import org.eclipse.core.commands.AbstractHandler; -import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.terminal.view.ui.interfaces.ITerminalsView; -import org.eclipse.tm.terminal.view.ui.tabs.TabFolderManager; -import org.eclipse.ui.handlers.HandlerUtil; - -/** - * Disconnect terminal connection command handler implementation. - */ -public class DisconnectTerminalCommandHandler extends AbstractHandler { - - /* (non-Javadoc) - * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent) - */ - @SuppressWarnings("cast") - @Override - public Object execute(ExecutionEvent event) throws ExecutionException { - CTabItem item = null; - - ISelection selection = HandlerUtil.getCurrentSelection(event); - if (selection instanceof IStructuredSelection && !selection.isEmpty()) { - Object element = ((IStructuredSelection)selection).getFirstElement(); - if (element instanceof CTabItem && ((CTabItem)element).getData() instanceof ITerminalViewControl) { - item = (CTabItem)element; - } - } - - if (item == null && HandlerUtil.getActivePart(event) instanceof ITerminalsView) { - ITerminalsView view = (ITerminalsView)HandlerUtil.getActivePart(event); - TabFolderManager mgr = (TabFolderManager)view.getAdapter(TabFolderManager.class); - if (mgr != null && mgr.getActiveTabItem() != null) { - item = mgr.getActiveTabItem(); - } - } - - if (item != null && item.getData() instanceof ITerminalViewControl) { - ITerminalViewControl terminal = (ITerminalViewControl)item.getData(); - if (terminal != null && !terminal.isDisposed()) { - terminal.disconnectTerminal(); - } - } - - return null; - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/LaunchTerminalCommandHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/LaunchTerminalCommandHandler.java deleted file mode 100644 index 46c34b6..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/LaunchTerminalCommandHandler.java +++ /dev/null @@ -1,157 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.internal.handler; - -import java.text.DateFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.core.commands.AbstractHandler; -import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.window.Window; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.tm.terminal.view.core.TerminalContextPropertiesProviderFactory; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalContextPropertiesProvider; -import org.eclipse.tm.terminal.view.core.interfaces.constants.IContextPropertiesConstants; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate; -import org.eclipse.tm.terminal.view.ui.interfaces.tracing.ITraceIds; -import org.eclipse.tm.terminal.view.ui.internal.dialogs.LaunchTerminalSettingsDialog; -import org.eclipse.tm.terminal.view.ui.launcher.LauncherDelegateManager; -import org.eclipse.ui.handlers.HandlerUtil; - -/** - * Launch terminal command handler implementation. - */ -public class LaunchTerminalCommandHandler extends AbstractHandler { - - /* - * (non-Javadoc) - * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent) - */ - @Override - public Object execute(ExecutionEvent event) throws ExecutionException { - String commandId = event.getCommand().getId(); - // "org.eclipse.tm.terminal.view.ui.command.launchToolbar" - // "org.eclipse.tm.terminal.view.ui.command.launch" - - long start = System.currentTimeMillis(); - - if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER)) { - DateFormat format = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); - String date = format.format(new Date(start)); - - UIPlugin.getTraceHandler().trace("Started at " + date + " (" + start + ")", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER, LaunchTerminalCommandHandler.this); - } - - // Get the active shell - Shell shell = HandlerUtil.getActiveShell(event); - // Get the current selection - ISelection selection = HandlerUtil.getCurrentSelection(event); - - if (commandId.equals("org.eclipse.tm.terminal.view.ui.command.launchToolbar")) { //$NON-NLS-1$ - if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER)) { - UIPlugin.getTraceHandler().trace("(a) Attempt to open launch terminal settings dialog after " + (System.currentTimeMillis() - start) + " ms.", //$NON-NLS-1$ //$NON-NLS-2$ - ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER, LaunchTerminalCommandHandler.this); - } - - LaunchTerminalSettingsDialog dialog = new LaunchTerminalSettingsDialog(shell, start); - - if(isValidSelection(selection)){ - dialog.setSelection(selection); - } - if (dialog.open() == Window.OK) { - // Get the terminal settings from the dialog - Map properties = dialog.getSettings(); - if (properties != null) { - String delegateId = (String)properties.get(ITerminalsConnectorConstants.PROP_DELEGATE_ID); - Assert.isNotNull(delegateId); - ILauncherDelegate delegate = LauncherDelegateManager.getInstance().getLauncherDelegate(delegateId, false); - Assert.isNotNull(delegateId); - delegate.execute(properties, null); - } - } - } - else { - if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER)) { - UIPlugin.getTraceHandler().trace("Getting applicable launcher delegates after " + (System.currentTimeMillis() - start) + " ms.", //$NON-NLS-1$ //$NON-NLS-2$ - ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER, LaunchTerminalCommandHandler.this); - } - - // Check if the dialog needs to be shown at all - ILauncherDelegate[] delegates = LauncherDelegateManager.getInstance().getApplicableLauncherDelegates(selection); - - if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER)) { - UIPlugin.getTraceHandler().trace("Got applicable launcher delegates after " + (System.currentTimeMillis() - start) + " ms.", //$NON-NLS-1$ //$NON-NLS-2$ - ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER, LaunchTerminalCommandHandler.this); - } - - if (delegates.length > 1 || (delegates.length == 1 && delegates[0].needsUserConfiguration())) { - if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER)) { - UIPlugin.getTraceHandler().trace("(b) Attempt to open launch terminal settings dialog after " + (System.currentTimeMillis() - start) + " ms.", //$NON-NLS-1$ //$NON-NLS-2$ - ITraceIds.TRACE_LAUNCH_TERMINAL_COMMAND_HANDLER, LaunchTerminalCommandHandler.this); - } - - // Create the launch terminal settings dialog - LaunchTerminalSettingsDialog dialog = new LaunchTerminalSettingsDialog(shell, start); - if(isValidSelection(selection)){ - dialog.setSelection(selection); - } - if (dialog.open() == Window.OK) { - // Get the terminal settings from the dialog - Map properties = dialog.getSettings(); - if (properties != null) { - String delegateId = (String)properties.get(ITerminalsConnectorConstants.PROP_DELEGATE_ID); - Assert.isNotNull(delegateId); - ILauncherDelegate delegate = LauncherDelegateManager.getInstance().getLauncherDelegate(delegateId, false); - Assert.isNotNull(delegateId); - delegate.execute(properties, null); - } - } - } - else if (delegates.length == 1) { - ILauncherDelegate delegate = delegates[0]; - Map properties = new HashMap(); - - // Store the id of the selected delegate - properties.put(ITerminalsConnectorConstants.PROP_DELEGATE_ID, delegate.getId()); - // Store the selection - properties.put(ITerminalsConnectorConstants.PROP_SELECTION, selection); - - // Execute - delegate.execute(properties, null); - } - } - - return null; - } - - private boolean isValidSelection(ISelection selection) { - if (selection instanceof IStructuredSelection && !selection.isEmpty()) { - Object element = ((IStructuredSelection) selection).getFirstElement(); - ITerminalContextPropertiesProvider provider = TerminalContextPropertiesProviderFactory.getProvider(element); - if (provider != null) { - Map props = provider.getTargetAddress(element); - if (props != null && props.containsKey(IContextPropertiesConstants.PROP_ADDRESS)) { - return true; - } - } - } - - return false; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/MaximizeViewHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/MaximizeViewHandler.java deleted file mode 100644 index 5803e00..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/MaximizeViewHandler.java +++ /dev/null @@ -1,29 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.internal.handler; - -import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.core.commands.ExecutionException; - -/** - * Maximize view handler implementation. - */ -public class MaximizeViewHandler extends AbstractTriggerCommandHandler { - - /* (non-Javadoc) - * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent) - */ - @Override - public Object execute(ExecutionEvent event) throws ExecutionException { - triggerCommand("org.eclipse.ui.window.maximizePart", null); //$NON-NLS-1$ - return null; - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/NewTerminalViewHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/NewTerminalViewHandler.java deleted file mode 100644 index 7cf9098..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/NewTerminalViewHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.internal.handler; - -import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.tm.terminal.view.ui.interfaces.IUIConstants; -import org.eclipse.tm.terminal.view.ui.manager.ConsoleManager; - -/** - * New Terminal View handler implementation - */ -public class NewTerminalViewHandler extends AbstractTriggerCommandHandler { - - /* (non-Javadoc) - * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent) - */ - @Override - public Object execute(ExecutionEvent event) throws ExecutionException { - String secondaryId = ConsoleManager.getInstance().getNextTerminalSecondaryId(IUIConstants.ID); - ConsoleManager.getInstance().showConsoleView(IUIConstants.ID, secondaryId); - - triggerCommand("org.eclipse.tm.terminal.view.ui.command.launchToolbar", null); //$NON-NLS-1$ - - return null; - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/QuickAccessHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/QuickAccessHandler.java deleted file mode 100644 index ac63da8..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/handler/QuickAccessHandler.java +++ /dev/null @@ -1,29 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.internal.handler; - -import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.core.commands.ExecutionException; - -/** - * Quick access handler implementation. - */ -public class QuickAccessHandler extends AbstractTriggerCommandHandler { - - /* (non-Javadoc) - * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent) - */ - @Override - public Object execute(ExecutionEvent event) throws ExecutionException { - triggerCommand("org.eclipse.ui.window.quickAccess", null); //$NON-NLS-1$ - return null; - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/launcher/AbstractLauncherDelegate.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/launcher/AbstractLauncherDelegate.java deleted file mode 100644 index 81ed553..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/launcher/AbstractLauncherDelegate.java +++ /dev/null @@ -1,159 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.launcher; - -import java.util.Map; - -import org.eclipse.core.expressions.Expression; -import org.eclipse.core.expressions.ExpressionConverter; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.PlatformObject; -import org.eclipse.core.runtime.Status; -import org.eclipse.osgi.util.NLS; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate; -import org.eclipse.tm.terminal.view.ui.nls.Messages; - -/** - * Abstract launcher delegate implementation. - */ -public abstract class AbstractLauncherDelegate extends PlatformObject implements ILauncherDelegate { - // The mandatory id of the extension - private String id = null; - // The label of the extension - private String label = null; - // The converted expression - private Expression expression; - // The hidden attribute - private boolean hidden; - - /* (non-Javadoc) - * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement, java.lang.String, java.lang.Object) - */ - @Override - public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException { - if (config == null) return; - - // Initialize the id field by reading the extension attribute. - // Throws an exception if the id is empty or null. - id = config.getAttribute("id"); //$NON-NLS-1$ - if (id == null || "".equals(id.trim())) { //$NON-NLS-1$ - throw createMissingMandatoryAttributeException("id", config.getContributor().getName()); //$NON-NLS-1$ - } - - // Try the "label" attribute first - label = config.getAttribute("label"); //$NON-NLS-1$ - // If "label" is not found or empty, try the "name" attribute as fallback - if (label == null || "".equals(label.trim())) { //$NON-NLS-1$ - label = config.getAttribute("name"); //$NON-NLS-1$ - } - - // Read the sub elements of the extension - IConfigurationElement[] children = config.getChildren(); - // The "enablement" element is the only expected one - if (children != null && children.length > 0) { - expression = ExpressionConverter.getDefault().perform(children[0]); - } - - // Read "hidden" attribute - String value = config.getAttribute("hidden"); //$NON-NLS-1$ - if (value != null && !"".equals(value.trim())) { //$NON-NLS-1$ - hidden = Boolean.parseBoolean(value); - } - } - - /** - * Creates a new {@link CoreException} to be thrown if a mandatory extension attribute - * is missing. - * - * @param attributeName The attribute name. Must not be null. - * @param extensionId The extension id. Must not be null. - * - * @return The {@link CoreException} instance. - */ - protected CoreException createMissingMandatoryAttributeException(String attributeName, String extensionId) { - Assert.isNotNull(attributeName); - Assert.isNotNull(extensionId); - - return new CoreException(new Status(IStatus.ERROR, - UIPlugin.getUniqueIdentifier(), - 0, - NLS.bind(Messages.Extension_error_missingRequiredAttribute, attributeName, extensionId), - null)); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate#getId() - */ - @Override - public String getId() { - return id; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate#getLabel() - */ - @Override - public String getLabel() { - return label != null ? label.trim() : ""; //$NON-NLS-1$ - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate#getEnablement() - */ - @Override - public Expression getEnablement() { - return expression; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate#isHidden() - */ - @Override - public boolean isHidden() { - return hidden; - } - - /* (non-Javadoc) - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - if (obj instanceof AbstractLauncherDelegate) { - return id.equals(((AbstractLauncherDelegate)obj).id); - } - return super.equals(obj); - } - - /* (non-Javadoc) - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - return id.hashCode(); - } - - /** - * Get the title from the settings, and use it as the default title. - * - * @param properties the setting properties map. - * @return the value retrieved via the @see {@link ITerminalsConnectorConstants#PROP_TITLE}, or null if the key hasn't been set. - * - * @since 4.1 - */ - protected String getDefaultTerminalTitle(Map properties) { - String title = (String)properties.get(ITerminalsConnectorConstants.PROP_TITLE); - return title != null ? title : null; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/launcher/LauncherDelegateManager.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/launcher/LauncherDelegateManager.java deleted file mode 100644 index 2428eef..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/launcher/LauncherDelegateManager.java +++ /dev/null @@ -1,422 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 - 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.launcher; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.expressions.EvaluationContext; -import org.eclipse.core.expressions.EvaluationResult; -import org.eclipse.core.expressions.Expression; -import org.eclipse.core.expressions.IEvaluationContext; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; -import org.eclipse.core.runtime.IExtension; -import org.eclipse.core.runtime.IExtensionPoint; -import org.eclipse.core.runtime.IExtensionRegistry; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.osgi.util.NLS; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.ui.ISources; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.handlers.IHandlerService; - -/** - * Terminal launcher delegate manager implementation. - */ -public class LauncherDelegateManager { - // Flag to mark the extension point manager initialized (extensions loaded). - private boolean initialized = false; - - // The map containing all loaded contributions - private final Map extensionsMap = new HashMap(); - - // The extension point comparator - private ExtensionPointComparator comparator = null; - - /** - * Executable extension proxy implementation. - */ - /* default */ static class Proxy { - // The extension instance. Created on first access - private ILauncherDelegate instance; - // The configuration element - private final IConfigurationElement element; - // The unique id of the extension. - private String id; - - /** - * Constructor. - * - * @param element The configuration element. Must not be null. - * @throws CoreException In case the configuration element attribute id is null or empty. - */ - public Proxy(IConfigurationElement element) throws CoreException { - Assert.isNotNull(element); - this.element = element; - - // Extract the extension attributes - id = element.getAttribute("id"); //$NON-NLS-1$ - if (id == null || id.trim().length() == 0) { - throw new CoreException(new Status(IStatus.ERROR, - UIPlugin.getUniqueIdentifier(), - 0, - NLS.bind(Messages.Extension_error_missingRequiredAttribute, "id", element.getContributor().getName()), //$NON-NLS-1$ - null)); - } - - instance = null; - } - - /** - * Returns the extensions unique id. - * - * @return The unique id. - */ - public String getId() { - return id; - } - - /** - * Returns the configuration element for this extension. - * - * @return The configuration element. - */ - public IConfigurationElement getConfigurationElement() { - return element; - } - - /** - * Returns the extension class instance. The contributing - * plug-in will be activated if not yet activated anyway. - * - * @return The extension class instance or null if the instantiation fails. - */ - public ILauncherDelegate getInstance() { - if (instance == null) instance = newInstance(); - return instance; - } - - /** - * Returns always a new extension class instance which is different - * to what {@link #getInstance()} would return. - * - * @return A new extension class instance or null if the instantiation fails. - */ - public ILauncherDelegate newInstance() { - IConfigurationElement element = getConfigurationElement(); - Assert.isNotNull(element); - - // The "class" to load can be specified either as attribute or as child element - if (element.getAttribute("class") != null || element.getChildren("class").length > 0) { //$NON-NLS-1$ //$NON-NLS-2$ - try { - return (ILauncherDelegate)element.createExecutableExtension("class"); //$NON-NLS-1$ - } catch (Exception e) { - // Possible exceptions: CoreException, ClassCastException. - Platform.getLog(UIPlugin.getDefault().getBundle()).log(new Status(IStatus.ERROR, - UIPlugin.getUniqueIdentifier(), - NLS.bind(Messages.Extension_error_invalidExtensionPoint, element.getDeclaringExtension().getUniqueIdentifier()), e)); - } - } - return null; - } - - /* (non-Javadoc) - * @see java.lang.Object#equals(java.lang.Object) - */ - @Override - public boolean equals(Object obj) { - // Proxies are equal if they have encapsulate an element - // with the same unique id - if (obj instanceof Proxy) { - return getId().equals(((Proxy)obj).getId()); - } - return super.equals(obj); - } - - /* (non-Javadoc) - * @see java.lang.Object#hashCode() - */ - @Override - public int hashCode() { - // The hash code of a proxy is the one from the id - return getId().hashCode(); - } - } - - /** - * Extension point comparator implementation. - *

            - * The comparator assure that extension are read in a predictable order. - *

            - * The order of the extensions is defined as following:
            - *

            • Extensions contributed by our own plug-ins (org.eclipse.tm.terminal.*) - * in ascending alphabetic order and
            • - *
            • Extensions contributed by any other plug-in in ascending alphabetic order.
            • - *
            • Extensions contributed by the same plug-in in ascending alphabetic order by the - * extensions unique id
            • - */ - /* default */ static class ExtensionPointComparator implements Comparator { - private final static String OWN_PLUGINS_PATTERN = "org.eclipse.tm.terminal."; //$NON-NLS-1$ - - /* (non-Javadoc) - * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) - */ - @Override - public int compare(IExtension o1, IExtension o2) { - // We ignore any comparisation with null and - if (o1 == null || o2 == null) return 0; - // Check if it is the exact same element - if (o1 == o2) return 0; - - // The extensions are compared by the unique id of the contributing plug-in first - String contributor1 = o1.getContributor().getName(); - String contributor2 = o2.getContributor().getName(); - - // Contributions from our own plug-ins comes before 3rdParty plug-ins - if (contributor1.startsWith(OWN_PLUGINS_PATTERN) && !contributor2.startsWith(OWN_PLUGINS_PATTERN)) - return -1; - if (!contributor1.startsWith(OWN_PLUGINS_PATTERN) && contributor2.startsWith(OWN_PLUGINS_PATTERN)) - return 1; - if (contributor1.startsWith(OWN_PLUGINS_PATTERN) && contributor2.startsWith(OWN_PLUGINS_PATTERN)) { - int value = contributor1.compareTo(contributor2); - // Within the same plug-in, the extension are sorted by their unique id (if available) - if (value == 0 && o1.getUniqueIdentifier() != null && o2.getUniqueIdentifier() != null) - return o1.getUniqueIdentifier().compareTo(o2.getUniqueIdentifier()); - // Otherwise, just return the comparisation result from the contributors - return value; - } - - // Contributions from all other plug-ins are sorted alphabetical - int value = contributor1.compareTo(contributor2); - // Within the same plug-in, the extension are sorted by their unique id (if available) - if (value == 0 && o1.getUniqueIdentifier() != null && o2.getUniqueIdentifier() != null) - return o1.getUniqueIdentifier().compareTo(o2.getUniqueIdentifier()); - // Otherwise, just return the comparisation result from the contributors - return value; - } - - } - - /* - * Thread save singleton instance creation. - */ - private static class LazyInstanceHolder { - public static LauncherDelegateManager instance = new LauncherDelegateManager(); - } - - /** - * Returns the singleton instance. - */ - public static LauncherDelegateManager getInstance() { - return LazyInstanceHolder.instance; - } - - /** - * Constructor. - */ - LauncherDelegateManager() { - super(); - } - - /** - * Returns the list of all contributed terminal launcher delegates. - * - * @param unique If true, the method returns new instances for each - * contributed terminal launcher delegate. - * - * @return The list of contributed terminal launcher delegates, or an empty array. - */ - public ILauncherDelegate[] getLauncherDelegates(boolean unique) { - List contributions = new ArrayList(); - for (Proxy launcherDelegate : getExtensions().values()) { - ILauncherDelegate instance = unique ? launcherDelegate.newInstance() : launcherDelegate.getInstance(); - if (instance != null && !contributions.contains(instance)) { - contributions.add(instance); - } - } - - return contributions.toArray(new ILauncherDelegate[contributions.size()]); - } - - /** - * Returns the terminal launcher delegate identified by its unique id. If no terminal - * launcher delegate with the specified id is registered, null is returned. - * - * @param id The unique id of the terminal launcher delegate or null - * @param unique If true, the method returns new instances of the terminal launcher delegate contribution. - * - * @return The terminal launcher delegate instance or null. - */ - public ILauncherDelegate getLauncherDelegate(String id, boolean unique) { - ILauncherDelegate contribution = null; - Map extensions = getExtensions(); - if (extensions.containsKey(id)) { - Proxy proxy = extensions.get(id); - // Get the extension instance - contribution = unique ? proxy.newInstance() : proxy.getInstance(); - } - - return contribution; - } - - /** - * Returns the applicable terminal launcher delegates for the given selection. - * - * @param selection The selection or null. - * @return The list of applicable terminal launcher delegates or an empty array. - */ - @SuppressWarnings("cast") - public ILauncherDelegate[] getApplicableLauncherDelegates(ISelection selection) { - List applicable = new ArrayList(); - - for (ILauncherDelegate delegate : getLauncherDelegates(false)) { - Expression enablement = delegate.getEnablement(); - - // The launcher delegate is applicable by default if - // no expression is specified. - boolean isApplicable = enablement == null; - - if (enablement != null) { - if (selection != null) { - // Set the default variable to selection. - IEvaluationContext currentState = ((IHandlerService)PlatformUI.getWorkbench().getService(IHandlerService.class)).getCurrentState(); - EvaluationContext context = new EvaluationContext(currentState, selection); - // Set the "selection" variable to the selection. - context.addVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME, selection); - // Allow plug-in activation - context.setAllowPluginActivation(true); - // Evaluate the expression - try { - isApplicable = enablement.evaluate(context).equals(EvaluationResult.TRUE); - } catch (CoreException e) { - IStatus status = new Status(IStatus.ERROR, UIPlugin.getUniqueIdentifier(), e.getLocalizedMessage(), e); - UIPlugin.getDefault().getLog().log(status); - } - } else { - // The enablement is false by definition if - // there is no selection. - isApplicable = false; - } - } - - // Add the page if applicable - if (isApplicable) applicable.add(delegate); - } - - return applicable.toArray(new ILauncherDelegate[applicable.size()]); - } - - /** - * Returns the map of managed extensions. If not loaded before, - * this methods trigger the loading of the extensions to the managed - * extension point. - * - * @return The map of extensions. - */ - protected Map getExtensions() { - // Load and store the extensions thread-safe! - synchronized (extensionsMap) { - if (!initialized) { loadExtensions(); initialized = true; } - } - return extensionsMap; - } - - /** - * Returns the extension point comparator instance. If not available, - * {@link #doCreateExtensionPointComparator()} is called to create a new instance. - * - * @return The extension point comparator or null if the instance creation fails. - */ - protected final ExtensionPointComparator getExtensionPointComparator() { - if (comparator == null) { - comparator = new ExtensionPointComparator(); - } - return comparator; - } - - /** - * Returns the extensions of the specified extension point sorted. - *

              - * For the order of the extensions, see {@link ExtensionPointComparator}. - * - * @param point The extension point. Must not be null. - * @return The extensions in sorted order or an empty array if the extension point has no extensions. - */ - protected IExtension[] getExtensionsSorted(IExtensionPoint point) { - Assert.isNotNull(point); - - List extensions = new ArrayList(Arrays.asList(point.getExtensions())); - if (extensions.size() > 0) { - Collections.sort(extensions, getExtensionPointComparator()); - } - - return extensions.toArray(new IExtension[extensions.size()]); - } - - /** - * Loads the extensions for the managed extension point. - */ - protected void loadExtensions() { - // If already initialized, this method will do nothing. - if (initialized) return; - - IExtensionRegistry registry = Platform.getExtensionRegistry(); - IExtensionPoint point = registry.getExtensionPoint("org.eclipse.tm.terminal.view.ui.launcherDelegates"); //$NON-NLS-1$ - if (point != null) { - IExtension[] extensions = getExtensionsSorted(point); - for (IExtension extension : extensions) { - IConfigurationElement[] elements = extension.getConfigurationElements(); - for (IConfigurationElement element : elements) { - if ("delegate".equals(element.getName())) { //$NON-NLS-1$ - try { - Proxy candidate = new Proxy(element); - if (candidate.getId() != null) { - // If no extension with this id had been registered before, register now. - if (!extensionsMap.containsKey(candidate.getId())) { - extensionsMap.put(candidate.getId(), candidate); - } - else { - throw new CoreException(new Status(IStatus.ERROR, - UIPlugin.getUniqueIdentifier(), - 0, - NLS.bind(Messages.Extension_error_duplicateExtension, candidate.getId(), element.getContributor().getName()), - null)); - } - } else { - throw new CoreException(new Status(IStatus.ERROR, - UIPlugin.getUniqueIdentifier(), - 0, - NLS.bind(Messages.Extension_error_missingRequiredAttribute, "id", element.getAttribute("label")), //$NON-NLS-1$ //$NON-NLS-2$ - null)); - } - } catch (CoreException e) { - Platform.getLog(UIPlugin.getDefault().getBundle()).log(new Status(IStatus.ERROR, - UIPlugin.getUniqueIdentifier(), - NLS.bind(Messages.Extension_error_invalidExtensionPoint, element.getDeclaringExtension().getUniqueIdentifier()), e)); - } - } - } - } - } - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/listeners/AbstractWindowListener.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/listeners/AbstractWindowListener.java deleted file mode 100644 index 04f1047..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/listeners/AbstractWindowListener.java +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.listeners; - -import org.eclipse.ui.IPartListener2; -import org.eclipse.ui.IPartService; -import org.eclipse.ui.IPerspectiveListener; -import org.eclipse.ui.IWindowListener; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchPartReference; -import org.eclipse.ui.IWorkbenchWindow; - -/** - * Abstract window listener implementation. - */ -public abstract class AbstractWindowListener implements IWindowListener { - // The part listener instance - protected final IPartListener2 partListener; - // The perspective listener instance - protected final IPerspectiveListener perspectiveListener; - - // Flag to remember if the initialization is done or not - private boolean initialized = false; - - /** - * Constructor - */ - public AbstractWindowListener() { - // Create the part listener instance - partListener = createPartListener(); - // Create the perspective listener instance - perspectiveListener = createPerspectiveListener(); - } - - /** - * Creates a new part listener instance. - *

              - * Note: The default implementation returns null. - * - * @return The part listener instance or null. - */ - protected IPartListener2 createPartListener() { - return null; - } - - /** - * Creates a new perspective listener instance. - *

              - * Note: The default implementation returns null. - * - * @return The perspective listener instance or null. - */ - protected IPerspectiveListener createPerspectiveListener() { - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow) - */ - @Override - public void windowActivated(IWorkbenchWindow window) { - if (!initialized && window != null) { - windowOpened(window); - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow) - */ - @Override - public void windowDeactivated(IWorkbenchWindow window) { - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow) - */ - @Override - public void windowClosed(IWorkbenchWindow window) { - // On close, remove the listeners from the window - if (window != null) { - if (window.getPartService() != null && partListener != null) { - window.getPartService().removePartListener(partListener); - } - - if (perspectiveListener != null) window.removePerspectiveListener(perspectiveListener); - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow) - */ - @Override - public void windowOpened(IWorkbenchWindow window) { - if (window != null) { - // On open, register the part listener to the window - if (window.getPartService() != null && partListener != null) { - // Get the part service - IPartService service = window.getPartService(); - // Unregister the part listener, just in case - service.removePartListener(partListener); - // Register the part listener - service.addPartListener(partListener); - // Signal the active part to the part listener after registration - IWorkbenchPage page = window.getActivePage(); - if (page != null) { - IWorkbenchPartReference partRef = page.getActivePartReference(); - if (partRef != null) partListener.partActivated(partRef); - } - } - - // Register the perspective listener - if (perspectiveListener != null) { - window.addPerspectiveListener(perspectiveListener); - // Signal the active perspective to the perspective listener after registration - if (window.getActivePage() != null) { - perspectiveListener.perspectiveActivated(window.getActivePage(), window.getActivePage().getPerspective()); - } - } - - initialized = true; - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/listeners/WorkbenchPartListener.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/listeners/WorkbenchPartListener.java deleted file mode 100644 index c93dc3d..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/listeners/WorkbenchPartListener.java +++ /dev/null @@ -1,114 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.listeners; - -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.ui.IPartListener2; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.IWorkbenchPartReference; -import org.eclipse.ui.contexts.IContextActivation; -import org.eclipse.ui.contexts.IContextService; - -/** - * The part listener implementation. Takes care of - * activation and deactivation of key binding contexts. - */ -public class WorkbenchPartListener implements IPartListener2 { - - // The context activations per workbench part reference - private final Map activations = new HashMap(); - - /* (non-Javadoc) - * @see org.eclipse.ui.IPartListener2#partBroughtToTop(org.eclipse.ui.IWorkbenchPartReference) - */ - @Override - public void partBroughtToTop(IWorkbenchPartReference partRef) { - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IPartListener2#partOpened(org.eclipse.ui.IWorkbenchPartReference) - */ - @Override - public void partOpened(IWorkbenchPartReference partRef) { - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IPartListener2#partClosed(org.eclipse.ui.IWorkbenchPartReference) - */ - @Override - public void partClosed(IWorkbenchPartReference partRef) { - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IPartListener2#partVisible(org.eclipse.ui.IWorkbenchPartReference) - */ - @Override - public void partVisible(IWorkbenchPartReference partRef) { - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IPartListener2#partHidden(org.eclipse.ui.IWorkbenchPartReference) - */ - @Override - public void partHidden(IWorkbenchPartReference partRef) { - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IPartListener2#partActivated(org.eclipse.ui.IWorkbenchPartReference) - */ - @SuppressWarnings("cast") - @Override - public void partActivated(IWorkbenchPartReference partRef) { - if ("org.eclipse.tm.terminal.view.ui.TerminalsView".equals(partRef.getId())) { //$NON-NLS-1$ - IWorkbenchPart part = partRef.getPart(false); - if (part != null && part.getSite() != null) { - IContextService service = (IContextService)part.getSite().getService(IContextService.class); - if (service != null) { - IContextActivation activation = service.activateContext(partRef.getId()); - if (activation != null) { - activations.put(partRef, activation); - } else { - activations.remove(partRef); - } - } - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IPartListener2#partDeactivated(org.eclipse.ui.IWorkbenchPartReference) - */ - @SuppressWarnings("cast") - @Override - public void partDeactivated(IWorkbenchPartReference partRef) { - if ("org.eclipse.tm.terminal.view.ui.TerminalsView".equals(partRef.getId())) { //$NON-NLS-1$ - IWorkbenchPart part = partRef.getPart(false); - if (part != null && part.getSite() != null) { - IContextService service = (IContextService)part.getSite().getService(IContextService.class); - if (service != null) { - IContextActivation activation = activations.remove(partRef); - if (activation != null) { - service.deactivateContext(activation); - } - } - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference) - */ - @Override - public void partInputChanged(IWorkbenchPartReference partRef) { - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/listeners/WorkbenchWindowListener.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/listeners/WorkbenchWindowListener.java deleted file mode 100644 index 31735ee..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/listeners/WorkbenchWindowListener.java +++ /dev/null @@ -1,27 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.listeners; - -import org.eclipse.ui.IPartListener2; - -/** - * The window listener implementation. Takes care of the - * management of the global listeners per workbench window. - */ -public class WorkbenchWindowListener extends AbstractWindowListener { - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.listeners.AbstractWindowListener#createPartListener() - */ - @Override - protected IPartListener2 createPartListener() { - return new WorkbenchPartListener(); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/local/showin/DynamicContributionItems.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/local/showin/DynamicContributionItems.java deleted file mode 100644 index 9e96f83..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/local/showin/DynamicContributionItems.java +++ /dev/null @@ -1,129 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2016 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.local.showin; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.ActionContributionItem; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.action.IContributionItem; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.interfaces.IExternalExecutablesProperties; -import org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate; -import org.eclipse.tm.terminal.view.ui.launcher.LauncherDelegateManager; -import org.eclipse.ui.ISelectionService; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.actions.CompoundContributionItem; -import org.eclipse.ui.menus.IWorkbenchContribution; -import org.eclipse.ui.services.IServiceLocator; - -/** - * Dynamic "Show In" contribution items implementation. - */ -public class DynamicContributionItems extends CompoundContributionItem implements IWorkbenchContribution { - // Service locator to located the handler service. - protected IServiceLocator serviceLocator; - // Reference to the local terminal launcher delegate - /* default */ ILauncherDelegate delegate; - - /* (non-Javadoc) - * @see org.eclipse.ui.menus.IWorkbenchContribution#initialize(org.eclipse.ui.services.IServiceLocator) - */ - @Override - public void initialize(IServiceLocator serviceLocator) { - this.serviceLocator = serviceLocator; - - // Get the local terminal launcher delegate - delegate = LauncherDelegateManager.getInstance().getLauncherDelegate("org.eclipse.tm.terminal.connector.local.launcher.local", false); //$NON-NLS-1$ - } - - /* (non-Javadoc) - * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems() - */ - @Override - protected IContributionItem[] getContributionItems() { - List items = new ArrayList(); - - if (delegate != null) { - List> l = ExternalExecutablesManager.load(); - if (l != null && !l.isEmpty()) { - for (Map executableData : l) { - String name = executableData.get(IExternalExecutablesProperties.PROP_NAME); - String path = executableData.get(IExternalExecutablesProperties.PROP_PATH); - String args = executableData.get(IExternalExecutablesProperties.PROP_ARGS); - String icon = executableData.get(IExternalExecutablesProperties.PROP_ICON); - - String strTranslate = executableData.get(IExternalExecutablesProperties.PROP_TRANSLATE); - boolean translate = strTranslate != null ? Boolean.parseBoolean(strTranslate) : false; - - if (name != null && !"".equals(name) && path != null && !"".equals(path)) { //$NON-NLS-1$ //$NON-NLS-2$ - IAction action = createAction(name, path, args, translate); - - ImageData id = icon != null ? ExternalExecutablesManager.loadImage(icon) : null; - if (id != null) { - ImageDescriptor desc = ImageDescriptor.createFromImageData(id); - if (desc != null) action.setImageDescriptor(desc); - } - - IContributionItem item = new ActionContributionItem(action); - items.add(item); - } - } - } - } - - return items.toArray(new IContributionItem[items.size()]); - } - - /** - * Creates the action to execute. - * - * @param label The label. Must not be null. - * @param path The executable path. Must not be null. - * @param args The executable arguments or null. - * @param translate Translate backslashes. - * - * @return The action to execute. - */ - protected IAction createAction(final String label, final String path, final String args, final boolean translate) { - Assert.isNotNull(label); - Assert.isNotNull(path); - - IAction action = new Action(label) { - @Override - public void run() { - Assert.isNotNull(delegate); - - ISelectionService service = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService(); - ISelection selection = service != null ? service.getSelection() : null; - if (selection != null && selection.isEmpty()) selection = null; - - Map properties = new HashMap(); - properties.put(ITerminalsConnectorConstants.PROP_DELEGATE_ID, delegate.getId()); - if (selection != null) properties.put(ITerminalsConnectorConstants.PROP_SELECTION, selection); - properties.put(ITerminalsConnectorConstants.PROP_PROCESS_PATH, path); - if (args != null) properties.put(ITerminalsConnectorConstants.PROP_PROCESS_ARGS, args); - properties.put(ITerminalsConnectorConstants.PROP_TRANSLATE_BACKSLASHES_ON_PASTE, Boolean.valueOf(translate)); - - delegate.execute(properties, null); - } - }; - - return action; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/local/showin/ExternalExecutablesDialog.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/local/showin/ExternalExecutablesDialog.java deleted file mode 100644 index 41a629e..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/local/showin/ExternalExecutablesDialog.java +++ /dev/null @@ -1,460 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2016 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.local.showin; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.TrayDialog; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.ScrolledComposite; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.eclipse.tm.terminal.view.ui.help.IContextHelpIds; -import org.eclipse.tm.terminal.view.ui.interfaces.IExternalExecutablesProperties; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.ui.PlatformUI; -import org.osgi.framework.Bundle; - -/** - * External executables dialog implementation. - */ -public class ExternalExecutablesDialog extends TrayDialog { - private String contextHelpId = null; - private final boolean edit; - - private Text name; - /* default */ Text path; - private Text args; - /* default */ Text icon; - private Button translate; - - /* default */ String last_filter_path = null; - /* default */ String last_filter_icon = null; - - private Map executableData; - - /** - * Constructor. - * - * @param shell The parent shell or null. - */ - public ExternalExecutablesDialog(Shell shell, boolean edit) { - super(shell); - this.edit = edit; - - this.contextHelpId = IContextHelpIds.EXTERNAL_EXECUTABLES_DIALOG; - setHelpAvailable(true); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) - */ - @Override - protected final Control createDialogArea(Composite parent) { - if (contextHelpId != null) { - PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, contextHelpId); - } - - // Let the super implementation create the dialog area control - Control control = super.createDialogArea(parent); - // Setup the inner panel as scrollable composite - if (control instanceof Composite) { - ScrolledComposite sc = new ScrolledComposite((Composite)control, SWT.V_SCROLL); - - GridLayout layout = new GridLayout(1, true); - layout.marginHeight = 0; layout.marginWidth = 0; - layout.verticalSpacing = 0; layout.horizontalSpacing = 0; - - sc.setLayout(layout); - sc.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true)); - - sc.setExpandHorizontal(true); - sc.setExpandVertical(true); - - Composite composite = new Composite(sc, SWT.NONE); - composite.setLayout(new GridLayout()); - - // Setup the dialog area content - createDialogAreaContent(composite); - - sc.setContent(composite); - sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); - - // Return the scrolled composite as new dialog area control - control = sc; - } - - return control; - } - - /** - * Creates the dialog area content. - * - * @param parent The parent composite. Must not be null. - */ - protected void createDialogAreaContent(Composite parent) { - Assert.isNotNull(parent); - - setDialogTitle(edit ? Messages.ExternalExecutablesDialog_title_edit : Messages.ExternalExecutablesDialog_title_add); - - Composite panel = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(2, false); - layout.marginHeight = 0; layout.marginWidth = 0; - panel.setLayout(layout); - GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, true); - layoutData.widthHint = convertWidthInCharsToPixels(50); - panel.setLayoutData(layoutData); - - Label label = new Label(panel, SWT.HORIZONTAL); - label.setText(Messages.ExternalExecutablesDialog_field_name); - layoutData = new GridData(SWT.BEGINNING, SWT.CENTER, false, false); - label.setLayoutData(layoutData); - - name = new Text(panel, SWT.HORIZONTAL | SWT.SINGLE | SWT.BORDER); - layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); - layoutData.widthHint = convertWidthInCharsToPixels(30); - name.setLayoutData(layoutData); - name.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - validate(); - } - }); - - label = new Label(panel, SWT.HORIZONTAL); - label.setText(Messages.ExternalExecutablesDialog_field_path); - layoutData = new GridData(SWT.BEGINNING, SWT.CENTER, false, false); - label.setLayoutData(layoutData); - - Composite panel2 = new Composite(panel, SWT.NONE); - layout = new GridLayout(2, false); - layout.marginHeight = 0; layout.marginWidth = 0; - panel2.setLayout(layout); - layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); - panel2.setLayoutData(layoutData); - - path = new Text(panel2, SWT.HORIZONTAL | SWT.SINGLE | SWT.BORDER); - layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); - layoutData.widthHint = convertWidthInCharsToPixels(30); - path.setLayoutData(layoutData); - path.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - validate(); - } - }); - - Button button = new Button(panel2, SWT.PUSH); - button.setText(Messages.ExternalExecutablesDialog_button_browse); - layoutData = new GridData(SWT.BEGINNING, SWT.CENTER, false, false); - layoutData.widthHint = convertWidthInCharsToPixels(10); - button.setLayoutData(layoutData); - button.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - FileDialog dialog = new FileDialog(getShell(), SWT.OPEN); - - String selectedFile = path.getText(); - if (selectedFile != null && selectedFile.trim().length() > 0) { - IPath filePath = new Path(selectedFile); - // If the selected file points to an directory, use the directory as is - IPath filterPath = filePath.toFile().isDirectory() ? filePath : filePath.removeLastSegments(1); - while (filterPath != null && filterPath.segmentCount() > 1 && !filterPath.toFile().exists()) { - filterPath = filterPath.removeLastSegments(1); - } - String filterFileName = filePath.toFile().isDirectory() || !filePath.toFile().exists() ? null : filePath.lastSegment(); - - if (filterPath != null && !filterPath.isEmpty()) dialog.setFilterPath(filterPath.toString()); - if (filterFileName != null) dialog.setFileName(filterFileName); - } else { - String workspace = null; - Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - workspace = org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString(); - } - - String filterPath = last_filter_path != null ? last_filter_path : workspace; - dialog.setFilterPath(filterPath); - } - - selectedFile = dialog.open(); - if (selectedFile != null) { - last_filter_path = dialog.getFilterPath(); - path.setText(selectedFile); - } - } - }); - - label = new Label(panel, SWT.HORIZONTAL); - label.setText(Messages.ExternalExecutablesDialog_field_args); - layoutData = new GridData(SWT.BEGINNING, SWT.CENTER, false, false); - label.setLayoutData(layoutData); - - args = new Text(panel, SWT.HORIZONTAL | SWT.SINGLE | SWT.BORDER); - layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); - layoutData.widthHint = convertWidthInCharsToPixels(30); - args.setLayoutData(layoutData); - args.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - validate(); - } - }); - - label = new Label(panel, SWT.HORIZONTAL); - label.setText(Messages.ExternalExecutablesDialog_field_icon); - layoutData = new GridData(SWT.BEGINNING, SWT.CENTER, false, false); - label.setLayoutData(layoutData); - - panel2 = new Composite(panel, SWT.NONE); - layout = new GridLayout(2, false); - layout.marginHeight = 0; layout.marginWidth = 0; - panel2.setLayout(layout); - layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); - panel2.setLayoutData(layoutData); - - icon = new Text(panel2, SWT.HORIZONTAL | SWT.SINGLE | SWT.BORDER); - layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); - layoutData.widthHint = convertWidthInCharsToPixels(30); - icon.setLayoutData(layoutData); - icon.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - validate(); - } - }); - - button = new Button(panel2, SWT.PUSH); - button.setText(Messages.ExternalExecutablesDialog_button_browse); - layoutData = new GridData(SWT.BEGINNING, SWT.CENTER, false, false); - layoutData.widthHint = convertWidthInCharsToPixels(10); - button.setLayoutData(layoutData); - button.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - FileDialog dialog = new FileDialog(getShell(), SWT.OPEN); - - String selectedFile = icon.getText(); - if (selectedFile != null && selectedFile.trim().length() > 0) { - IPath filePath = new Path(selectedFile); - // If the selected file points to an directory, use the directory as is - IPath filterPath = filePath.toFile().isDirectory() ? filePath : filePath.removeLastSegments(1); - while (filterPath != null && filterPath.segmentCount() > 1 && !filterPath.toFile().exists()) { - filterPath = filterPath.removeLastSegments(1); - } - String filterFileName = filePath.toFile().isDirectory() || !filePath.toFile().exists() ? null : filePath.lastSegment(); - - if (filterPath != null && !filterPath.isEmpty()) dialog.setFilterPath(filterPath.toString()); - if (filterFileName != null) dialog.setFileName(filterFileName); - } else { - String workspace = null; - Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - workspace = org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString(); - } - - String filterPath = last_filter_icon != null ? last_filter_icon : workspace; - dialog.setFilterPath(filterPath); - } - - selectedFile = dialog.open(); - if (selectedFile != null) { - last_filter_icon = dialog.getFilterPath(); - icon.setText(selectedFile); - } - } - }); - - translate = new Button(panel, SWT.CHECK); - translate.setText(Messages.ExternalExecutablesDialog_field_translate); - layoutData = new GridData(SWT.FILL, SWT.TOP, true, false); - layoutData.horizontalSpan = 2; - translate.setLayoutData(layoutData); - translate.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - validate(); - } - }); - - if (executableData != null) { - String value = executableData.get(IExternalExecutablesProperties.PROP_NAME); - name.setText(value != null && !"".equals(value.trim()) ? value : ""); //$NON-NLS-1$ //$NON-NLS-2$ - value = executableData.get(IExternalExecutablesProperties.PROP_PATH); - path.setText(value != null && !"".equals(value.trim()) ? value : ""); //$NON-NLS-1$ //$NON-NLS-2$ - value = executableData.get(IExternalExecutablesProperties.PROP_ARGS); - args.setText(value != null && !"".equals(value.trim()) ? value : ""); //$NON-NLS-1$ //$NON-NLS-2$ - value = executableData.get(IExternalExecutablesProperties.PROP_ICON); - icon.setText(value != null && !"".equals(value.trim()) ? value : ""); //$NON-NLS-1$ //$NON-NLS-2$ - value = executableData.get(IExternalExecutablesProperties.PROP_TRANSLATE); - translate.setSelection(value != null ? Boolean.parseBoolean(value) : false); - } - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite) - */ - @Override - protected Control createButtonBar(Composite parent) { - Control control = super.createButtonBar(parent); - validate(); - return control; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#createButton(org.eclipse.swt.widgets.Composite, int, java.lang.String, boolean) - */ - @Override - protected Button createButton(Composite parent, int id, String label, boolean defaultButton) { - if (IDialogConstants.OK_ID == id && !edit) { - label = Messages.ExternalExecutablesDialog_button_add; - } - return super.createButton(parent, id, label, defaultButton); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.Dialog#okPressed() - */ - @Override - protected void okPressed() { - if (name != null && path != null) { - // Extract the executable properties - if (executableData == null) executableData = new HashMap(); - - String value = name.getText(); - if (value != null && !"".equals(value.trim())) { //$NON-NLS-1$ - executableData.put(IExternalExecutablesProperties.PROP_NAME, value); - } else { - executableData.remove(IExternalExecutablesProperties.PROP_NAME); - } - - value = path.getText(); - if (value != null && !"".equals(value.trim())) { //$NON-NLS-1$ - executableData.put(IExternalExecutablesProperties.PROP_PATH, value); - } else { - executableData.remove(IExternalExecutablesProperties.PROP_PATH); - } - - value = args.getText(); - if (value != null && !"".equals(value.trim())) { //$NON-NLS-1$ - executableData.put(IExternalExecutablesProperties.PROP_ARGS, value); - } else { - executableData.remove(IExternalExecutablesProperties.PROP_ARGS); - } - - value = icon.getText(); - if (value != null && !"".equals(value.trim())) { //$NON-NLS-1$ - executableData.put(IExternalExecutablesProperties.PROP_ICON, value); - } else { - executableData.remove(IExternalExecutablesProperties.PROP_ICON); - } - - if (translate.getSelection()) { - executableData.put(IExternalExecutablesProperties.PROP_TRANSLATE, Boolean.TRUE.toString()); - } else { - executableData.remove(IExternalExecutablesProperties.PROP_TRANSLATE); - } - } else { - executableData = null; - } - super.okPressed(); - } - - @Override - protected void cancelPressed() { - // If the user pressed cancel, the dialog needs to return null - executableData = null; - super.cancelPressed(); - } - - /** - * Returns the executable properties the user entered. - * - * @return The executable properties or null. - */ - public Map getExecutableData() { - return executableData; - } - - /** - * Set or reset the executable properties. This method has effect - * only if called before opening the dialog. - * - * @param data The executable properties or null. - */ - public void setExecutableData(Map data) { - if (data == null) { - executableData = null; - } else { - executableData = new HashMap(data); - } - } - - /** - * Validate the dialog. - */ - public void validate() { - boolean valid = true; - - if (name != null && !name.isDisposed()) { - valid = !"".equals(name.getText()); //$NON-NLS-1$ - } - - if (path != null && !path.isDisposed()) { - String value = path.getText(); - if (!"".equals(value)) { //$NON-NLS-1$ - File f = new File(value); - valid |= f.isAbsolute() && f.canRead(); - } else { - valid = false; - } - } - - if (icon != null && !icon.isDisposed()) { - String value = icon.getText(); - if (!"".equals(value)) { //$NON-NLS-1$ - File f = new File(value); - valid |= f.isAbsolute() && f.canRead(); - } - } - - Button okButton = getButton(IDialogConstants.OK_ID); - if (okButton != null) okButton.setEnabled(valid); - } - - /** - * Sets the title for this dialog. - * - * @param title The title. - */ - public void setDialogTitle(String title) { - if (getShell() != null && !getShell().isDisposed()) { - getShell().setText(title); - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/local/showin/ExternalExecutablesManager.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/local/showin/ExternalExecutablesManager.java deleted file mode 100644 index b8debd3..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/local/showin/ExternalExecutablesManager.java +++ /dev/null @@ -1,294 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2016 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Dirk Fauth - Bug 460496 - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.local.showin; - -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.StringTokenizer; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Platform; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.ImageLoader; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.interfaces.IExternalExecutablesProperties; -import org.eclipse.tm.terminal.view.ui.internal.ExternalExecutablesState; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.services.ISourceProviderService; - -/** - * External executables manager implementation. - */ -public class ExternalExecutablesManager { - // Flag to indicate if we have searched for git bash already - private static boolean gitBashSearchDone = false; - - /** - * Loads the list of all saved external executables. - * - * @return The list of all saved external executables or null. - */ - public static List> load() { - List> l = new ArrayList>(); - - IPath stateLocation = UIPlugin.getDefault().getStateLocation(); - if (stateLocation != null) { - File f = stateLocation.append(".executables/data.properties").toFile(); //$NON-NLS-1$ - if (f.canRead()) { - FileReader r = null; - - try { - Properties data = new Properties(); - r= new FileReader(f); - data.load(r); - - Map> c = new HashMap>(); - for (String name : data.stringPropertyNames()) { - if (name == null || name.indexOf('.') == -1) continue; - int ix = name.indexOf('.'); - String n = name.substring(0, ix); - String k = (ix + 1) < name.length() ? name.substring(ix + 1) : null; - if (n == null || k == null) continue; - - Integer i = null; - try { i = Integer.decode(n); } catch (NumberFormatException e) { /* ignored on purpose */ } - if (i == null) continue; - - Map m = c.get(i); - if (m == null) { - m = new HashMap(); - c.put(i, m); - } - Assert.isNotNull(m); - - m.put(k, data.getProperty(name)); - } - - List k = new ArrayList(c.keySet()); - Collections.sort(k); - for (Integer i : k) { - Map m = c.get(i); - if (m != null && !m.isEmpty()) l.add(m); - } - } catch (Exception e) { - if (Platform.inDebugMode()) { - e.printStackTrace(); - } - } finally { - if (r != null) try { r.close(); } catch (IOException e) { /* ignored on purpose */ } - } - } - } - - // Lookup git bash (Windows Hosts only) - if (!gitBashSearchDone && Platform.OS_WIN32.equals(Platform.getOS())) { - // Check the existing entries first - // Find a entry labeled "Git Bash" - Map m = null; - for (Map candidate : l) { - String name = candidate.get(IExternalExecutablesProperties.PROP_NAME); - if ("Git Bash".equals(name)) { //$NON-NLS-1$ - m = candidate; - break; - } - } - - // If not found in the existing entries, check the path - if (m == null) { - String gitPath = null; - String iconPath = null; - - String path = System.getenv("PATH"); //$NON-NLS-1$ - if (path != null) { - StringTokenizer tokenizer = new StringTokenizer(path, ";"); //$NON-NLS-1$ - while (tokenizer.hasMoreTokens()) { - String token = tokenizer.nextToken(); - File f = new File(token, "git.exe"); //$NON-NLS-1$ - if (f.canRead()) { - File f2 = new File(f.getParentFile().getParentFile(), "bin/sh.exe"); //$NON-NLS-1$ - if (f2.canExecute()) { - gitPath = f2.getAbsolutePath(); - } - - iconPath = getGitIconPath(f.getParentFile().getParentFile()); - - break; - } - } - } - - // if it is not found in the PATH, check the default install locations - if (gitPath == null) { - File f = new File("C:/Program Files (x86)/Git/bin/sh.exe"); //$NON-NLS-1$ - if (!f.exists()) { - f = new File("C:/Program Files/Git/bin/sh.exe"); //$NON-NLS-1$ - } - - if (f.exists() && f.canExecute()) { - gitPath = f.getAbsolutePath(); - iconPath = getGitIconPath(f.getParentFile().getParentFile()); - } - } - - if (gitPath != null) { - m = new HashMap(); - m.put(IExternalExecutablesProperties.PROP_NAME, "Git Bash"); //$NON-NLS-1$ - m.put(IExternalExecutablesProperties.PROP_PATH, gitPath); - m.put(IExternalExecutablesProperties.PROP_ARGS, "--login -i"); //$NON-NLS-1$ - if (iconPath != null) m.put(IExternalExecutablesProperties.PROP_ICON, iconPath); - m.put(IExternalExecutablesProperties.PROP_TRANSLATE, Boolean.TRUE.toString()); - - l.add(m); - save(l); - } - } - - // Do not search again for git bash while the session is running - gitBashSearchDone = true; - } - - return l; - } - - private static String getGitIconPath(File parent) { - File f = new File(parent, "etc/git.ico"); //$NON-NLS-1$ - if (f.canRead()) { - return f.getAbsolutePath(); - } - - // check for icon in newer versions of Git for Windows 32 bit - f = new File(parent, "mingw32/share/git/git-for-windows.ico"); //$NON-NLS-1$ - if (f.canRead()) { - return f.getAbsolutePath(); - } - - // check for icon in newer versions of Git for Windows 64 bit - f = new File(parent, "mingw64/share/git/git-for-windows.ico"); //$NON-NLS-1$ - if (f.canRead()) { - return f.getAbsolutePath(); - } - - return null; - } - - /** - * Saves the list of external executables. - * - * @param l The list of external executables or null. - */ - @SuppressWarnings("cast") - public static void save(List> l) { - ISourceProviderService sourceProviderService = (ISourceProviderService) PlatformUI.getWorkbench().getService(ISourceProviderService.class); - ExternalExecutablesState stateService = (ExternalExecutablesState) sourceProviderService.getSourceProvider(ExternalExecutablesState.CONFIGURED_STATE); - - IPath stateLocation = UIPlugin.getDefault().getStateLocation(); - if (stateLocation != null) { - File f = stateLocation.append(".executables/data.properties").toFile(); //$NON-NLS-1$ - if (f.isFile() && (l == null || l.isEmpty())) { - @SuppressWarnings("unused") - boolean s = f.delete(); - - if (stateService != null) stateService.disable(); - } else { - FileWriter w = null; - - try { - Properties data = new Properties(); - for (int i = 0; i < l.size(); i++) { - Map m = l.get(i); - for (Entry e : m.entrySet()) { - String key = Integer.toString(i) + "." + e.getKey(); //$NON-NLS-1$ - data.setProperty(key, e.getValue()); - } - } - - if (!f.exists()) { - @SuppressWarnings("unused") - boolean s = f.getParentFile().mkdirs(); - s = f.createNewFile(); - } - w = new FileWriter(f); - data.store(w, null); - - if (stateService != null) stateService.enable(); - } catch (Exception e) { - if (Platform.inDebugMode()) { - e.printStackTrace(); - } - } finally { - if (w != null) { - try { - w.flush(); - w.close(); - } catch (IOException e) { - /* ignored on purpose */ - } - } - } - } - } - } - - /** - * Loads the image data suitable for showing an icon in a menu - * (16 x 16, 8bit depth) from the given file. - * - * @param path The image file path. Must not be null. - * @return The image data or null. - */ - public static ImageData loadImage(String path) { - Assert.isNotNull(path); - - ImageData id = null; - ImageData biggest = null; - - ImageLoader loader = new ImageLoader(); - ImageData[] data = loader.load(path); - - if (data != null) { - for (ImageData d : data) { - if (d.height == 16 && d.width == 16) { - if (id == null || id.height != 16 && id.width != 16) { - id = d; - } else if (d.depth < id.depth && d.depth >= 8){ - id = d; - } - } else { - if (id == null) { - id = d; - biggest = d; - } else if (id.height != 16 && d.height < id.height && id.width != 16 && d.width < id.width) { - id = d; - } else if (biggest == null || d.height > biggest.height && d.width > biggest.width) { - biggest = d; - } - } - } - } - - // if the icon is still to big -> downscale the biggest - if (id != null && id.height > 16 && id.width > 16) { - id = biggest.scaledTo(16, 16); - } - - return id; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/manager/ConsoleManager.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/manager/ConsoleManager.java deleted file mode 100644 index bc277ef..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/manager/ConsoleManager.java +++ /dev/null @@ -1,646 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Max Weninger (Wind River) - [361363] [TERMINALS] Implement "Pin&Clone" for the "Terminals" view - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.manager; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.swt.custom.CTabFolder; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.swt.widgets.Display; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.interfaces.IPreferenceKeys; -import org.eclipse.tm.terminal.view.ui.interfaces.ITerminalsView; -import org.eclipse.tm.terminal.view.ui.interfaces.IUIConstants; -import org.eclipse.tm.terminal.view.ui.tabs.TabFolderManager; -import org.eclipse.tm.terminal.view.ui.view.TerminalsView; -import org.eclipse.ui.IPartListener2; -import org.eclipse.ui.IPartService; -import org.eclipse.ui.IPerspectiveDescriptor; -import org.eclipse.ui.IPerspectiveListener; -import org.eclipse.ui.IViewPart; -import org.eclipse.ui.IViewReference; -import org.eclipse.ui.IViewSite; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.IWorkbenchPartReference; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PerspectiveAdapter; -import org.eclipse.ui.PlatformUI; - -/** - * Terminal console manager. - */ -public class ConsoleManager { - - // Constant to indicate any secondary id is acceptable - private final static String ANY_SECONDARY_ID = new String("*"); //$NON-NLS-1$ - - // Reference to the perspective listener instance - private final IPerspectiveListener perspectiveListener; - - // Internal perspective listener implementation - static class ConsoleManagerPerspectiveListener extends PerspectiveAdapter { - private final List references = new ArrayList(); - - /* (non-Javadoc) - * @see org.eclipse.ui.PerspectiveAdapter#perspectiveActivated(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor) - */ - @Override - public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) { - // If the old references list is empty, just return - if (references.isEmpty()) return; - // Create a copy of the old view references list - List oldReferences = new ArrayList(references); - - // Get the current list of view references - List references = new ArrayList(Arrays.asList(page.getViewReferences())); - for (IViewReference reference : oldReferences) { - if (references.contains(reference)) continue; - // Previous visible terminals console view reference, make visible again - try { - page.showView(reference.getId(), reference.getSecondaryId(), IWorkbenchPage.VIEW_VISIBLE); - } catch (PartInitException e) { /* Failure on part instantiation is ignored */ } - } - - } - - /* (non-Javadoc) - * @see org.eclipse.ui.PerspectiveAdapter#perspectivePreDeactivate(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor) - */ - @Override - public void perspectivePreDeactivate(IWorkbenchPage page, IPerspectiveDescriptor perspective) { - references.clear(); - for (IViewReference reference : page.getViewReferences()) { - IViewPart part = reference.getView(false); - if (part instanceof TerminalsView && !references.contains(reference)) { - references.add(reference); - } - } - } - } - - // Reference to the part listener instance - private final IPartListener2 partListener; - - // The ids of the last activated terminals view - /* default */ String lastActiveViewId = null; - /* default */ String lastActiveSecondaryViewId = null; - - // Internal part listener implementation - class ConsoleManagerPartListener implements IPartListener2 { - - @Override - public void partActivated(IWorkbenchPartReference partRef) { - IWorkbenchPart part = partRef.getPart(false); - if (part instanceof ITerminalsView) { - lastActiveViewId = ((ITerminalsView)part).getViewSite().getId(); - lastActiveSecondaryViewId = ((ITerminalsView)part).getViewSite().getSecondaryId(); - //System.out.println("Terminals view activated: id = " + lastActiveViewId + ", secondary id = " + lastActiveSecondaryViewId); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - @Override - public void partBroughtToTop(IWorkbenchPartReference partRef) { - } - - @Override - public void partClosed(IWorkbenchPartReference partRef) { - } - - @Override - public void partDeactivated(IWorkbenchPartReference partRef) { - } - - @Override - public void partOpened(IWorkbenchPartReference partRef) { - } - - @Override - public void partHidden(IWorkbenchPartReference partRef) { - } - - @Override - public void partVisible(IWorkbenchPartReference partRef) { - } - - @Override - public void partInputChanged(IWorkbenchPartReference partRef) { - } - } - - /* - * Thread save singleton instance creation. - */ - private static class LazyInstanceHolder { - public static ConsoleManager fInstance = new ConsoleManager(); - } - - /** - * Returns the singleton instance for the console manager. - */ - public static ConsoleManager getInstance() { - return LazyInstanceHolder.fInstance; - } - - /** - * Constructor. - */ - ConsoleManager() { - super(); - - perspectiveListener = new ConsoleManagerPerspectiveListener(); - partListener = new ConsoleManagerPartListener(); - - if (PlatformUI.isWorkbenchRunning() && PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) { - PlatformUI.getWorkbench().getActiveWorkbenchWindow().addPerspectiveListener(perspectiveListener); - - IPartService service = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPartService(); - service.addPartListener(partListener); - } - } - - /** - * Returns the active workbench window page if the workbench is still running. - * - * @return The active workbench window page or null - */ - private final IWorkbenchPage getActiveWorkbenchPage() { - // To lookup the console view, the workbench must be still running - if (PlatformUI.isWorkbenchRunning() && PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) { - return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); - } - return null; - } - - /** - * Returns the console view if available within the active workbench window page. - *

              - * Note: The method must be called within the UI thread. - * - * @param id The terminals console view id or null to show the default terminals console view. - * @param secondaryId The terminals console view secondary id or null. - * - * @return The console view instance if available or null otherwise. - */ - public ITerminalsView findConsoleView(String id, String secondaryId) { - Assert.isNotNull(Display.findDisplay(Thread.currentThread())); - - ITerminalsView view = null; - - // Get the active workbench page - IWorkbenchPage page = getActiveWorkbenchPage(); - if (page != null) { - // Look for the view - IViewPart part = getTerminalsViewWithSecondaryId(id != null ? id : IUIConstants.ID, secondaryId, true); - // Check the interface - if (part instanceof ITerminalsView) { - view = (ITerminalsView)part; - } - } - - return view; - } - - /** - * Search and return a terminal view with a specific secondary id - * - * @param id The terminals console view id. Must not be null. - * @param secondaryId The terminals console view secondary id or null. - * @param restore True if to try to restore the view, false otherwise. - * - * @return The terminals console view instance or null if not found. - */ - private IViewPart getTerminalsViewWithSecondaryId(String id, String secondaryId, boolean restore) { - Assert.isNotNull(id); - - IWorkbenchPage page = getActiveWorkbenchPage(); - - IViewReference[] refs = page.getViewReferences(); - for (int i = 0; i < refs.length; i++) { - IViewReference ref = refs[i]; - if (ref.getId().equals(id)) { - if (ANY_SECONDARY_ID.equals(secondaryId) - || secondaryId == null && ref.getSecondaryId() == null - || secondaryId != null && secondaryId.equals(ref.getSecondaryId())) { - return ref.getView(restore); - } - } - } - return null; - } - - /** - * Search and return the active terminals view. - * - * @param id The terminals console view id. Must not be null. - * @param secondaryId The terminals console view secondary id or null. - * @return The terminals console view instance or null if not found. - */ - private IViewPart getActiveTerminalsView(String id, String secondaryId) { - Assert.isNotNull(id); - - IViewPart part = null; - - if (id.equals(lastActiveViewId)) { - if (secondaryId == null || ANY_SECONDARY_ID.equals(secondaryId) || secondaryId.equals(lastActiveSecondaryViewId)) { - part = getTerminalsViewWithSecondaryId(lastActiveViewId, lastActiveSecondaryViewId, false); - } - } - - if (part == null) { - part = getTerminalsViewWithSecondaryId(id, secondaryId, true); - if (part != null) { - lastActiveViewId = part.getViewSite().getId(); - lastActiveSecondaryViewId = part.getViewSite().getSecondaryId(); - } - } - - return part; - } - - /** - * Return a new secondary id to use, based on the number of open terminal views. - * - * @param id The terminals console view id. Must not be null. - * @return The next secondary id, or null if it is the first one - * @since 4.1 - */ - public String getNextTerminalSecondaryId(String id) { - Assert.isNotNull(id); - - IWorkbenchPage page = getActiveWorkbenchPage(); - Map terminalViews = new HashMap(); - - int maxNumber = 0; - IViewReference[] refs = page.getViewReferences(); - for (int i = 0; i < refs.length; i++) { - IViewReference ref = refs[i]; - if (ref.getId().equals(id)) { - if (ref.getSecondaryId() != null) { - terminalViews.put(ref.getSecondaryId(), ref); - int scondaryIdInt = Integer.parseInt(ref.getSecondaryId()); - if (scondaryIdInt > maxNumber) { - maxNumber = scondaryIdInt; - } - } - else { - // add the one with secondaryId == null with 0 by default - terminalViews.put(Integer.toString(0), ref); - } - } - } - if (terminalViews.size() == 0) { - return null; - } - - int i = 0; - for (; i < maxNumber; i++) { - String secondaryIdStr = Integer.toString(i); - if (!terminalViews.keySet().contains(secondaryIdStr)) { - // found a free slot - if (i == 0) - return null; - return Integer.toString(i); - } - } - // add a new one - return Integer.toString(i + 1); - } - - /** - * Show the terminals console view specified by the given id. - *

              - * Note: The method must be called within the UI thread. - * - * @param id The terminals console view id or null to show the default terminals console view. - */ - public IViewPart showConsoleView(String id, String secondaryId) { - Assert.isNotNull(Display.findDisplay(Thread.currentThread())); - - // Get the active workbench page - IWorkbenchPage page = getActiveWorkbenchPage(); - if (page != null) { - try { - // show the view - IViewPart part = getActiveTerminalsView(id != null ? id : IUIConstants.ID, secondaryId); - if (part == null) part = page.showView(id != null ? id : IUIConstants.ID, secondaryId, IWorkbenchPage.VIEW_ACTIVATE); - // and force the view to the foreground - page.bringToTop(part); - return part; - } - catch (PartInitException e) { - IStatus status = new Status(IStatus.ERROR, UIPlugin.getUniqueIdentifier(), e.getLocalizedMessage(), e); - UIPlugin.getDefault().getLog().log(status); - } - } - return null; - } - - /** - * Bring the terminals console view, specified by the given id, to the top of the view stack. - * - * @param id The terminals console view id or null to show the default terminals console view. - * @param secondaryId The terminals console view secondary id or null. - * @param activate If true activate the console view. - */ - private IViewPart bringToTop(String id, String secondaryId, boolean activate) { - // Get the active workbench page - IWorkbenchPage page = getActiveWorkbenchPage(); - if (page != null) { - // get (last) active terminal view - IViewPart activePart = getActiveTerminalsView(id != null ? id : IUIConstants.ID, secondaryId); - if (activePart == null) { - // Create a new one - IViewPart newPart = showConsoleView(id != null ? id : IUIConstants.ID, getSecondaryId(secondaryId, id)); - return newPart; - } - - if (activate) page.activate(activePart); - else page.bringToTop(activePart); - - return activePart; - } - return null; - } - - /** - * Return the secondary id to use. - * @param secondaryId - * @param id - * @return the secondaryId argument is not null, or *, otherwise use the auto generated secondary id. - */ - private String getSecondaryId(String secondaryId, String id){ - if(secondaryId==null || ANY_SECONDARY_ID.equals(secondaryId)){ - return getNextTerminalSecondaryId(id != null ? id : IUIConstants.ID); - } - - return secondaryId; - } - - /** - * Opens the console with the given title and connector. - *

              - * Note: The method must be called within the UI thread. - * - * @param id The terminals console view id or null to show the default terminals console view. - * @param title The console title. Must not be null. - * @param encoding The terminal encoding or null. - * @param connector The terminal connector. Must not be null. - * @param data The custom terminal data node or null. - * @param flags The flags controlling how the console is opened or null to use defaults. - */ - public CTabItem openConsole(String id, String title, String encoding, ITerminalConnector connector, Object data, Map flags) { - return openConsole(id, ANY_SECONDARY_ID, title, encoding, connector, data, flags); - } - - /** - * Opens the console with the given title and connector. - *

              - * Note: The method must be called within the UI thread. - * - * @param id The terminals console view id or null to show the default terminals console view. - * @param secondaryId The terminals console view secondary id or null. - * @param title The console title. Must not be null. - * @param encoding The terminal encoding or null. - * @param connector The terminal connector. Must not be null. - * @param data The custom terminal data node or null. - * @param flags The flags controlling how the console is opened or null to use defaults. - */ - @SuppressWarnings("cast") - public CTabItem openConsole(String id, String secondaryId, String title, String encoding, ITerminalConnector connector, Object data, Map flags) { - Assert.isNotNull(title); - Assert.isNotNull(connector); - Assert.isNotNull(Display.findDisplay(Thread.currentThread())); - - // Get the flags handled by the openConsole method itself - boolean activate = flags != null && flags.containsKey("activate") ? flags.get("activate").booleanValue() : false; //$NON-NLS-1$ //$NON-NLS-2$ - boolean forceNew = flags != null && flags.containsKey(ITerminalsConnectorConstants.PROP_FORCE_NEW) ? flags.get(ITerminalsConnectorConstants.PROP_FORCE_NEW).booleanValue() : false; - - // Make the consoles view visible - IViewPart part = bringToTop(id, secondaryId, activate); - if (!(part instanceof ITerminalsView)) return null; - // Cast to the correct type - ITerminalsView view = (ITerminalsView)part; - - // Get the tab folder manager associated with the view - TabFolderManager manager = (TabFolderManager) view.getAdapter(TabFolderManager.class); - if (manager == null) return null; - - // Lookup an existing console first - String secId = ((IViewSite)part.getSite()).getSecondaryId(); - CTabItem item = findConsole(id, secId, title, connector, data); - - // Switch to the tab folder page _before_ calling TabFolderManager#createItem(...). - // The createItem(...) method invokes the corresponding connect and this may take - // a while if connecting to a remote host. To allow a "Connecting..." decoration, - // the tab folder page needs to be visible. - view.switchToTabFolderControl(); - - // If no existing console exist or forced -> Create the tab item - if (item == null || forceNew) { - // If configured, check all existing tab items if they are associated - // with terminated consoles - if (UIPlugin.getScopedPreferences().getBoolean(IPreferenceKeys.PREF_REMOVE_TERMINATED_TERMINALS)) { - // Remote all terminated tab items. This will invoke the - // tab's dispose listener. - manager.removeTerminatedItems(); - // Switch back to the tab folder control as removeTerminatedItems() - // may have triggered the switch to the empty space control. - view.switchToTabFolderControl(); - } - - // Create a new tab item - item = manager.createTabItem(title, encoding, connector, data, flags); - } - // If still null, something went wrong - if (item == null) return null; - - // Make the item the active console - manager.bringToTop(item); - - // Make sure the terminals view has the focus after opening a new terminal - view.setFocus(); - - // Return the tab item of the opened console - return item; - } - - /** - * Lookup a console with the given title and the given terminal connector. - *

              - * Note: The method must be called within the UI thread. - * Note: The method will handle unified console titles itself. - * - * @param id The terminals console view id or null to show the default terminals console view. - * @param secondaryId The terminals console view secondary id or null. - * @param title The console title. Must not be null. - * @param connector The terminal connector. Must not be null. - * @param data The custom terminal data node or null. - * - * @return The corresponding console tab item or null. - */ - @SuppressWarnings("cast") - public CTabItem findConsole(String id, String secondaryId, String title, ITerminalConnector connector, Object data) { - Assert.isNotNull(title); - Assert.isNotNull(connector); - Assert.isNotNull(Display.findDisplay(Thread.currentThread())); - - // Get the console view - ITerminalsView view = findConsoleView(id, secondaryId); - if (view == null) return null; - - // Get the tab folder manager associated with the view - TabFolderManager manager = (TabFolderManager) view.getAdapter(TabFolderManager.class); - if (manager == null) return null; - - return manager.findTabItem(title, connector, data); - } - - /** - * Lookup a console which is assigned with the given terminal control. - *

              - * Note: The method must be called within the UI thread. - * - * @param control The terminal control. Must not be null. - * @return The corresponding console tab item or null. - */ - @SuppressWarnings("cast") - public CTabItem findConsole(ITerminalControl control) { - Assert.isNotNull(control); - - CTabItem item = null; - - IWorkbenchPage page = getActiveWorkbenchPage(); - if (page != null) { - IViewReference[] refs = page.getViewReferences(); - for (int i = 0; i < refs.length; i++) { - IViewReference ref = refs[i]; - IViewPart part = ref != null ? ref.getView(false) : null; - if (part instanceof ITerminalsView) { - CTabFolder tabFolder = (CTabFolder) part.getAdapter(CTabFolder.class); - if (tabFolder == null) continue; - CTabItem[] candidates = tabFolder.getItems(); - for (CTabItem candidate : candidates) { - Object data = candidate.getData(); - if (data instanceof ITerminalControl && control.equals(data)) { - item = candidate; - break; - } - } - } - if (item != null) break; - } - } - - return item; - } - - /** - * Search all console views for the one that contains a specific connector. - *

              - * Note: The method will handle unified console titles itself. - * - * @param id The terminals console view id or null to show the default terminals console view. - * @param title The console title. Must not be null. - * @param connector The terminal connector. Must not be null. - * @param data The custom terminal data node or null. - * - * @return The corresponding console tab item or null. - */ - @SuppressWarnings("cast") - private CTabItem findConsoleForTerminalConnector(String id, String title, ITerminalConnector connector, Object data) { - Assert.isNotNull(title); - Assert.isNotNull(connector); - - IWorkbenchPage page = getActiveWorkbenchPage(); - if (page != null) { - IViewReference[] refs = page.getViewReferences(); - for (int i = 0; i < refs.length; i++) { - IViewReference ref = refs[i]; - if (ref.getId().equals(id)) { - IViewPart part = ref.getView(true); - if (part instanceof ITerminalsView) { - // Get the tab folder manager associated with the view - TabFolderManager manager = (TabFolderManager) part.getAdapter(TabFolderManager.class); - if (manager == null) { - continue; - } - CTabItem item = manager.findTabItem(title, connector, data); - if (item != null) { - return item; - } - } - } - } - } - return null; - } - - /** - * Close the console with the given title and the given terminal connector. - *

              - * Note: The method must be called within the UI thread. - * Note: The method will handle unified console titles itself. - * - * @param title The console title. Must not be null. - * @param connector The terminal connector. Must not be null. - * @param data The custom terminal data node or null. - */ - public void closeConsole(String id, String title, ITerminalConnector connector, Object data) { - Assert.isNotNull(title); - Assert.isNotNull(connector); - Assert.isNotNull(Display.findDisplay(Thread.currentThread())); - - // Lookup the console with this connector - CTabItem console = findConsoleForTerminalConnector(id, title, connector, data); - // If found, dispose the console - if (console != null) { - console.dispose(); - } - } - - /** - * Terminate (disconnect) the console with the given title and the given terminal connector. - *

              - * Note: The method must be called within the UI thread. - * Note: The method will handle unified console titles itself. - * - * @param title The console title. Must not be null. - * @param connector The terminal connector. Must not be null. - * @param data The custom terminal data node or null. - */ - public void terminateConsole(String id, String title, ITerminalConnector connector, Object data) { - Assert.isNotNull(title); - Assert.isNotNull(connector); - Assert.isNotNull(Display.findDisplay(Thread.currentThread())); - - // Lookup the console - CTabItem console = findConsoleForTerminalConnector(id, title, connector, data); - // If found, disconnect the console - if (console != null && !console.isDisposed()) { - ITerminalViewControl terminal = (ITerminalViewControl)console.getData(); - if (terminal != null && !terminal.isDisposed()) { - terminal.disconnectTerminal(); - } - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.java deleted file mode 100644 index f7d4953..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.java +++ /dev/null @@ -1,154 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2016 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Max Weninger (Wind River) - [361363] [TERMINALS] Implement "Pin&Clone" for the "Terminals" view - * Dirk Fauth - Bug 460496 - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.nls; - -import java.lang.reflect.Field; - -import org.eclipse.osgi.util.NLS; - -/** - * Terminal plug-in externalized strings management. - */ -public class Messages extends NLS { - - // The plug-in resource bundle name - private static final String BUNDLE_NAME = "org.eclipse.tm.terminal.view.ui.nls.Messages"; //$NON-NLS-1$ - - /** - * Static constructor. - */ - static { - // Load message values from bundle file - NLS.initializeMessages(BUNDLE_NAME, Messages.class); - } - - /** - * Returns the corresponding string for the given externalized strings - * key or null if the key does not exist. - * - * @param key The externalized strings key or null. - * @return The corresponding string or null. - */ - public static String getString(String key) { - if (key != null) { - try { - Field field = Messages.class.getDeclaredField(key); - return (String)field.get(null); - } catch (Exception e) { /* ignored on purpose */ } - } - - return null; - } - - // **** Declare externalized string id's down here ***** - - public static String Extension_error_missingRequiredAttribute; - public static String Extension_error_duplicateExtension; - public static String Extension_error_invalidExtensionPoint; - - public static String AbstractTriggerCommandHandler_error_executionFailed; - - public static String AbstractAction_error_commandExecutionFailed; - - public static String AbstractConfigurationPanel_delete; - public static String AbstractConfigurationPanel_deleteButtonTooltip; - public static String AbstractConfigurationPanel_hosts; - public static String AbstractConfigurationPanel_encoding; - public static String AbstractConfigurationPanel_encoding_custom; - public static String AbstractConfigurationPanel_encoding_custom_title; - public static String AbstractConfigurationPanel_encoding_custom_message; - public static String AbstractConfigurationPanel_encoding_custom_error; - - public static String TabTerminalListener_consoleClosed; - public static String TabTerminalListener_consoleConnecting; - - public static String NewTerminalViewAction_menu; - public static String NewTerminalViewAction_tooltip; - - public static String ToggleCommandFieldAction_menu; - public static String ToggleCommandFieldAction_toolTip; - - public static String SelectEncodingAction_menu; - public static String SelectEncodingAction_tooltip; - - public static String ProcessSettingsPage_dialogTitle; - public static String ProcessSettingsPage_processImagePathSelectorControl_label; - public static String ProcessSettingsPage_processImagePathSelectorControl_button; - public static String ProcessSettingsPage_processArgumentsControl_label; - public static String ProcessSettingsPage_processWorkingDirControl_label; - public static String ProcessSettingsPage_localEchoSelectorControl_label; - - public static String OutputStreamMonitor_error_readingFromStream; - - public static String InputStreamMonitor_error_writingToStream; - - public static String TerminalService_error_cannotCreateConnector; - public static String TerminalService_defaultTitle; - - public static String LaunchTerminalSettingsDialog_title; - public static String LaunchTerminalSettingsDialog_combo_label; - public static String LaunchTerminalSettingsDialog_group_label; - - public static String TabScrollLockAction_text; - public static String TabScrollLockAction_tooltip; - - public static String LaunchTerminalSettingsDialog_error_title; - public static String LaunchTerminalSettingsDialog_error_invalidSettings; - public static String LaunchTerminalSettingsDialog_error_unknownReason; - - public static String EncodingSelectionDialog_title; - - public static String TabFolderManager_encoding; - public static String TabFolderManager_state_connected; - public static String TabFolderManager_state_connecting; - public static String TabFolderManager_state_closed; - - public static String NoteCompositeHelper_note_label; - - // showin messages - - public static String ProcessConnector_error_creatingProcess; - - public static String PreferencePage_label; - public static String PreferencePage_executables_label; - public static String PreferencePage_executables_column_name_label; - public static String PreferencePage_executables_column_path_label; - public static String PreferencePage_executables_button_add_label; - public static String PreferencePage_executables_button_edit_label; - public static String PreferencePage_executables_button_remove_label; - public static String PreferencePage_workingDir_label; - public static String PreferencePage_workingDir_userhome_label; - public static String PreferencePage_workingDir_eclipsehome_label; - public static String PreferencePage_workingDir_eclipsews_label; - public static String PreferencePage_workingDir_button_browse; - public static String PreferencePage_workingDir_note_label; - public static String PreferencePage_workingDir_note_text; - public static String PreferencePage_workingDir_button_variables; - public static String PreferencePage_workingDir_invalid; - public static String PreferencePage_command_label; - public static String PreferencePage_command_button_browse; - public static String PreferencePage_command_invalid; - public static String PreferencePage_command_note_label; - public static String PreferencePage_command_note_text; - public static String PreferencePage_command_arguments_label; - - public static String ExternalExecutablesDialog_title_add; - public static String ExternalExecutablesDialog_title_edit; - public static String ExternalExecutablesDialog_button_add; - public static String ExternalExecutablesDialog_button_browse; - public static String ExternalExecutablesDialog_field_path; - public static String ExternalExecutablesDialog_field_name; - public static String ExternalExecutablesDialog_field_args; - public static String ExternalExecutablesDialog_field_icon; - public static String ExternalExecutablesDialog_field_translate; - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.properties b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.properties deleted file mode 100644 index 0af5fc1..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.properties +++ /dev/null @@ -1,113 +0,0 @@ -############################################################################### -# Copyright (c) 2012, 2016 Wind River Systems, Inc. and others. All rights reserved. -# This program and the accompanying materials are made available under the terms -# of the Eclipse Public License v1.0 which accompanies this distribution, and is -# available at http://www.eclipse.org/legal/epl-v10.html -# -# Contributors: -# Wind River Systems - initial API and implementation -############################################################################### - -Extension_error_missingRequiredAttribute=Required attribute "{0}" missing for extension "{1}"! -Extension_error_duplicateExtension=Duplicate extension with id ''{0}''. Ignoring duplicated contribution from contributor ''{1}''! -Extension_error_invalidExtensionPoint=Failed to instantiate the executable extension from extension point ''{0}''. - -AbstractTriggerCommandHandler_error_executionFailed=Failed to execute command {0}. - -AbstractAction_error_commandExecutionFailed="Failed to execute command (id = {0}). Possibly caused by: {1} - -AbstractConfigurationPanel_delete=Delete -AbstractConfigurationPanel_deleteButtonTooltip=Delete terminal settings for host -AbstractConfigurationPanel_hosts=Hosts: -AbstractConfigurationPanel_encoding=Encoding: -AbstractConfigurationPanel_encoding_custom=Other... -AbstractConfigurationPanel_encoding_custom_title=Other... -AbstractConfigurationPanel_encoding_custom_message=Please enter the name of the encoding to use for the terminal. -AbstractConfigurationPanel_encoding_custom_error=Unsupported encoding. Please enter the name of a supported encoding. - -TabTerminalListener_consoleClosed=<{1}> {0} -TabTerminalListener_consoleConnecting={0} : {1}... - -NewTerminalViewAction_menu=New Terminal View -NewTerminalViewAction_tooltip=Open a new Terminal View - -ToggleCommandFieldAction_menu=Toggle Command Input Field -ToggleCommandFieldAction_toolTip=Toggle Command Input Field - -SelectEncodingAction_menu=Switch Encoding... -SelectEncodingAction_tooltip=Switch the Encoding of the active Terminal - -ProcessSettingsPage_dialogTitle=Select Process Image -ProcessSettingsPage_processImagePathSelectorControl_label=Image Path: -ProcessSettingsPage_processImagePathSelectorControl_button=Browse -ProcessSettingsPage_processArgumentsControl_label=Arguments: -ProcessSettingsPage_processWorkingDirControl_label=Working Dir: -ProcessSettingsPage_localEchoSelectorControl_label=Local Echo - -OutputStreamMonitor_error_readingFromStream=Exception when reading from stream. Possibly caused by: {0} - -InputStreamMonitor_error_writingToStream=Exception when writing to stream. Possibly caused by: {0} - -TerminalService_error_cannotCreateConnector=Cannot create a valid terminal connector instance from the provided terminal properties. -TerminalService_defaultTitle=Console - -LaunchTerminalSettingsDialog_title=Launch Terminal -LaunchTerminalSettingsDialog_combo_label=Choose terminal: -LaunchTerminalSettingsDialog_group_label=Settings - -TabScrollLockAction_text=Scroll &Lock -TabScrollLockAction_tooltip=Scroll Lock - -LaunchTerminalSettingsDialog_error_title=Terminal Settings -LaunchTerminalSettingsDialog_error_invalidSettings=The specified settings are invalid\n\n\ -{0}\n\n\ -Please review and specify valid settings. Or cancel the settings dialog to abort. -LaunchTerminalSettingsDialog_error_unknownReason=Cannot determine specifically which setting is invalid. - -EncodingSelectionDialog_title=Encoding - -TabFolderManager_encoding=Encoding: {0} -TabFolderManager_state_connected=Connected -TabFolderManager_state_connecting=Connecting -TabFolderManager_state_closed=Closed - -NoteCompositeHelper_note_label=Note: - -# ----- showin - -ProcessConnector_error_creatingProcess=Exception when creating process. Possibly caused by: {0} - -ExternalExecutablesDialog_title_add=Add External Executable -ExternalExecutablesDialog_title_edit=Edit External Executable -ExternalExecutablesDialog_button_add=Add -ExternalExecutablesDialog_button_browse=Browse... -ExternalExecutablesDialog_field_path=Path: -ExternalExecutablesDialog_field_name=Name: -ExternalExecutablesDialog_field_args=Arguments: -ExternalExecutablesDialog_field_icon=Icon: -ExternalExecutablesDialog_field_translate=Translate Backslashes on Paste - -# ----- Preference Pages ----- - -PreferencePage_label=Local Terminal Settings: -PreferencePage_executables_label="Show In ..." Custom Entries -PreferencePage_executables_column_name_label=Name -PreferencePage_executables_column_path_label=Path -PreferencePage_executables_button_add_label=Add... -PreferencePage_executables_button_edit_label=Edit... -PreferencePage_executables_button_remove_label=Remove -PreferencePage_workingDir_label=Initial Working Directory -PreferencePage_workingDir_userhome_label=User home -PreferencePage_workingDir_eclipsehome_label=Eclipse home -PreferencePage_workingDir_eclipsews_label=Eclipse workspace -PreferencePage_workingDir_button_browse=&Browse... -PreferencePage_workingDir_note_label=Note: -PreferencePage_workingDir_note_text=The chosen initial working directory might be overwritten by the current selection of the active view. -PreferencePage_workingDir_button_variables=&Variables... -PreferencePage_workingDir_invalid=Selected initial working directory is not a directory or is not readable. -PreferencePage_command_label=Shell Command -PreferencePage_command_button_browse=&Browse... -PreferencePage_command_invalid=Selected shell command is not a file or is not readable or executable. -PreferencePage_command_note_label=Note: -PreferencePage_command_note_text=Leave the shell command empty to fallback to the SHELL environment variable or if not set, to /bin/sh. -PreferencePage_command_arguments_label=Arguments: diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/panels/AbstractConfigurationPanel.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/panels/AbstractConfigurationPanel.java deleted file mode 100644 index da3cd49..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/panels/AbstractConfigurationPanel.java +++ /dev/null @@ -1,202 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.panels; - -import java.util.Map; - -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.dialogs.IMessageProvider; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel; -import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; - -/** - * Abstract terminal launcher configuration panel implementation. - */ -public abstract class AbstractConfigurationPanel implements IConfigurationPanel { - private final IConfigurationPanelContainer container; - - private Composite topControl = null; - - // The selection - private ISelection selection; - - private String message = null; - private int messageType = IMessageProvider.NONE; - - private boolean enabled = true; - - /** - * Constructor. - * - * @param container The configuration panel container or null. - */ - public AbstractConfigurationPanel(IConfigurationPanelContainer container) { - super(); - this.container = container; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#getContainer() - */ - @Override - public IConfigurationPanelContainer getContainer() { - return container; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.IMessageProvider#getMessage() - */ - @Override - public final String getMessage() { - return message; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.IMessageProvider#getMessageType() - */ - @Override - public final int getMessageType() { - return messageType; - } - - /** - * Set the message and the message type to display. - * - * @param message The message or null. - * @param messageType The message type or IMessageProvider.NONE. - */ - protected final void setMessage(String message, int messageType) { - this.message = message; - this.messageType = messageType; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#dispose() - */ - @Override - public void dispose() { - } - - /** - * Sets the top control. - * - * @param topControl The top control or null. - */ - protected void setControl(Composite topControl) { - this.topControl = topControl; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#getControl() - */ - @Override - public Composite getControl() { - return topControl; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#setSelection(org.eclipse.jface.viewers.ISelection) - */ - @Override - public void setSelection(ISelection selection) { - this.selection = selection; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#getSelection() - */ - @Override - public ISelection getSelection() { - return selection; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#doRestoreWidgetValues(org.eclipse.jface.dialogs.IDialogSettings, java.lang.String) - */ - @Override - public void doRestoreWidgetValues(IDialogSettings settings, String idPrefix) { - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#doSaveWidgetValues(org.eclipse.jface.dialogs.IDialogSettings, java.lang.String) - */ - @Override - public void doSaveWidgetValues(IDialogSettings settings, String idPrefix) { - } - - /** - * Returns the correctly prefixed dialog settings slot id. In case the given id - * suffix is null or empty, id is returned as is. - * - * @param settingsSlotId The dialog settings slot id to prefix. - * @param prefix The prefix. - * @return The correctly prefixed dialog settings slot id. - */ - public final String prefixDialogSettingsSlotId(String settingsSlotId, String prefix) { - if (settingsSlotId != null && prefix != null && prefix.trim().length() > 0) { - settingsSlotId = prefix + "." + settingsSlotId; //$NON-NLS-1$ - } - return settingsSlotId; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#setEnabled(boolean) - */ - @Override - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - /** - * @return Returns the enabled state. - */ - public boolean isEnabled() { - return enabled; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#isValid() - */ - @Override - public boolean isValid() { - setMessage(null, NONE); - return true; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#activate() - */ - @Override - public void activate() { - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#extractData(java.util.Map) - */ - @Override - public void extractData(Map data) { - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#setupData(java.util.Map) - */ - @Override - public void setupData(Map data) { - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel#updateData(java.util.Map) - */ - @Override - public void updateData(Map data) { - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/panels/AbstractExtendedConfigurationPanel.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/panels/AbstractExtendedConfigurationPanel.java deleted file mode 100644 index 54b84aa..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/panels/AbstractExtendedConfigurationPanel.java +++ /dev/null @@ -1,634 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.panels; - -import java.nio.charset.Charset; -import java.nio.charset.IllegalCharsetNameException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.dialogs.IInputValidator; -import org.eclipse.jface.dialogs.InputDialog; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.window.Window; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.tm.terminal.view.core.TerminalContextPropertiesProviderFactory; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalContextPropertiesProvider; -import org.eclipse.tm.terminal.view.core.interfaces.constants.IContextPropertiesConstants; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.ui.ISharedImages; -import org.eclipse.ui.WorkbenchEncoding; -import org.osgi.framework.Bundle; - -/** - * Abstract terminal configuration panel implementation. - */ -public abstract class AbstractExtendedConfigurationPanel extends AbstractConfigurationPanel { - private static final String LAST_HOST_TAG = "lastHost";//$NON-NLS-1$ - private static final String HOSTS_TAG = "hosts";//$NON-NLS-1$ - private static final String ENCODINGS_TAG = "encodings"; //$NON-NLS-1$ - - // The sub-controls - /* default */ Combo hostCombo; - private Button deleteHostButton; - /* default */ Combo encodingCombo; - - // The last selected encoding - /* default */ String lastSelectedEncoding; - // The last entered custom encodings - /* default */ final List encodingHistory = new ArrayList(); - - // A map containing the settings per host - protected final Map> hostSettingsMap = new HashMap>(); - - /** - * Constructor. - * - * @param container The configuration panel container or null. - */ - public AbstractExtendedConfigurationPanel(IConfigurationPanelContainer container) { - super(container); - } - - /** - * Returns the host name or IP from the current selection. - * - * @return The host name or IP, or null. - */ - public String getSelectionHost() { - ISelection selection = getSelection(); - if (selection instanceof IStructuredSelection && !selection.isEmpty()) { - Object element = ((IStructuredSelection) selection).getFirstElement(); - ITerminalContextPropertiesProvider provider = TerminalContextPropertiesProviderFactory.getProvider(element); - if (provider != null) { - Map props = provider.getTargetAddress(element); - if (props != null && props.containsKey(IContextPropertiesConstants.PROP_ADDRESS)) { - return props.get(IContextPropertiesConstants.PROP_ADDRESS); - } - } - } - - return null; - } - - /** - * Returns the default encoding based on the current selection. - * - * @return The default encoding or null. - */ - public String getSelectionEncoding() { - ISelection selection = getSelection(); - if (selection instanceof IStructuredSelection && !selection.isEmpty()) { - Object element = ((IStructuredSelection) selection).getFirstElement(); - ITerminalContextPropertiesProvider provider = TerminalContextPropertiesProviderFactory.getProvider(element); - if (provider != null) { - Object encoding = provider.getProperty(element, IContextPropertiesConstants.PROP_DEFAULT_ENCODING); - if (encoding instanceof String) return ((String) encoding).trim(); - } - } - - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#doRestoreWidgetValues(org.eclipse.jface.dialogs.IDialogSettings, java.lang.String) - */ - @Override - public void doRestoreWidgetValues(IDialogSettings settings, String idPrefix) { - Assert.isNotNull(settings); - - String[] hosts = settings.getArray(HOSTS_TAG); - if (hosts != null) { - for (int i = 0; i < hosts.length; i++) { - String hostEntry = hosts[i]; - String[] hostString = hostEntry.split("\\|");//$NON-NLS-1$ - String hostName = hostString[0]; - if (hostString.length == 2) { - HashMap attr = deSerialize(hostString[1]); - hostSettingsMap.put(hostName, attr); - } - else { - hostSettingsMap.put(hostName, new HashMap()); - } - } - } - - if (!isWithoutSelection()) { - String host = getSelectionHost(); - if (host != null) { - fillSettingsForHost(host); - } - } - else { - if (hostCombo != null) { - fillHostCombo(); - String lastHost = settings.get(LAST_HOST_TAG); - if (lastHost != null) { - int index = hostCombo.indexOf(lastHost); - if (index != -1) { - hostCombo.select(index); - } - else { - hostCombo.select(0); - } - } - else { - hostCombo.select(0); - } - fillSettingsForHost(hostCombo.getText()); - } - } - - encodingHistory.clear(); - String[] encodings = settings.getArray(ENCODINGS_TAG); - if (encodings != null && encodings.length > 0) { - encodingHistory.addAll(Arrays.asList(encodings)); - for (String encoding : encodingHistory) { - encodingCombo.add(encoding, encodingCombo.getItemCount() - 1); - } - } - } - - /** - * Restore the encodings widget values. - * - * @param settings The dialog settings. Must not be null. - * @param idPrefix The prefix or null. - */ - protected void doRestoreEncodingsWidgetValues(IDialogSettings settings, String idPrefix) { - Assert.isNotNull(settings); - - String encoding = settings.get(prefixDialogSettingsSlotId(ITerminalsConnectorConstants.PROP_ENCODING, idPrefix)); - if (encoding != null && encoding.trim().length() > 0) { - setEncoding(encoding); - } - } - - /** - * Decode the host settings from the given string. - * - * @param hostString The encoded host settings. Must not be null. - * @return The decoded host settings. - */ - private HashMap deSerialize(String hostString) { - Assert.isNotNull(hostString); - HashMap attr = new HashMap(); - - if (hostString.length() != 0) { - String[] hostAttrs = hostString.split("\\:");//$NON-NLS-1$ - for (int j = 0; j < hostAttrs.length-1; j = j + 2) { - String key = hostAttrs[j]; - String value = hostAttrs[j + 1]; - attr.put(key, value); - } - } - return attr; - } - - /** - * Encode the host settings to a string. - * - * @param hostEntry The host settings. Must not be null. - * @param hostString The host string to encode to. Must not be null. - */ - private void serialize(Map hostEntry, StringBuilder hostString) { - Assert.isNotNull(hostEntry); - Assert.isNotNull(hostString); - - if (hostEntry.keySet().size() != 0) { - Iterator> nextHostAttr = hostEntry.entrySet().iterator(); - while (nextHostAttr.hasNext()) { - Entry entry = nextHostAttr.next(); - String attrKey = entry.getKey(); - String attrValue = entry.getValue(); - hostString.append(attrKey + ":" + attrValue + ":");//$NON-NLS-1$ //$NON-NLS-2$ - } - hostString.deleteCharAt(hostString.length() - 1); - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel#doSaveWidgetValues(org.eclipse.jface.dialogs.IDialogSettings, java.lang.String) - */ - @Override - public void doSaveWidgetValues(IDialogSettings settings, String idPrefix) { - Iterator nextHost = hostSettingsMap.keySet().iterator(); - String[] hosts = new String[hostSettingsMap.keySet().size()]; - int i = 0; - while (nextHost.hasNext()) { - StringBuilder hostString = new StringBuilder(); - String host = nextHost.next(); - hostString.append(host + "|");//$NON-NLS-1$ - Map hostEntry = hostSettingsMap.get(host); - serialize(hostEntry, hostString); - hosts[i] = hostString.toString(); - i = i + 1; - } - settings.put(HOSTS_TAG, hosts); - if (isWithoutSelection()) { - if (hostCombo != null) { - String host = getHostFromSettings(); - if (host != null) settings.put(LAST_HOST_TAG, host); - } - } - - if (!encodingHistory.isEmpty()) { - settings.put(ENCODINGS_TAG, encodingHistory.toArray(new String[encodingHistory.size()])); - } - } - - /** - * Save the encodings widget values. - * - * @param settings The dialog settings. Must not be null. - * @param idPrefix The prefix or null. - */ - protected void doSaveEncodingsWidgetValues(IDialogSettings settings, String idPrefix) { - Assert.isNotNull(settings); - - String encoding = getEncoding(); - if (encoding != null) { - settings.put(prefixDialogSettingsSlotId(ITerminalsConnectorConstants.PROP_ENCODING, idPrefix), encoding); - } - } - - protected abstract void saveSettingsForHost(boolean add); - - protected abstract void fillSettingsForHost(String host); - - protected abstract String getHostFromSettings(); - - protected void removeSecurePassword(String host) { - // noop by default - } - - /** - * Returns the selected host from the hosts combo widget. - * - * @return The selected host or null. - */ - protected final String getHostFromCombo() { - return hostCombo != null && !hostCombo.isDisposed() ? hostCombo.getText() : null; - } - - protected void removeSettingsForHost(String host) { - if (hostSettingsMap.containsKey(host)) { - hostSettingsMap.remove(host); - } - } - - /** - * Returns the list of host names of the persisted hosts. - * - * @return The list of host names. - */ - private List getHostList() { - List hostList = new ArrayList(); - hostList.addAll(hostSettingsMap.keySet()); - return hostList; - } - - /** - * Fill the host combo with the stored per host setting names. - */ - protected void fillHostCombo() { - if (hostCombo != null) { - hostCombo.removeAll(); - List hostList = getHostList(); - Collections.sort(hostList); - Iterator nextHost = hostList.iterator(); - while (nextHost.hasNext()) { - String host = nextHost.next(); - hostCombo.add(host); - } - if (hostList.size() <= 1) { - hostCombo.setEnabled(false); - } - else { - hostCombo.setEnabled(true); - - } - if (deleteHostButton != null) { - if (hostList.size() == 0) { - deleteHostButton.setEnabled(false); - } - else { - deleteHostButton.setEnabled(true); - } - } - } - } - - public boolean isWithoutSelection() { - ISelection selection = getSelection(); - if (selection == null) { - return true; - } - if (selection instanceof IStructuredSelection && selection.isEmpty()) { - return true; - } - return false; - } - - public boolean isWithHostList() { - return true; - } - - /** - * Create the host selection combo. - * - * @param parent The parent composite. Must not be null. - * @param separator If true, a separator will be added after the controls. - */ - protected void createHostsUI(Composite parent, boolean separator) { - Assert.isNotNull(parent); - - if (isWithoutSelection() && isWithHostList()) { - Composite comboComposite = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(3, false); - layout.marginHeight = 0; - layout.marginWidth = 0; - comboComposite.setLayout(layout); - comboComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - - Label label = new Label(comboComposite, SWT.HORIZONTAL); - label.setText(Messages.AbstractConfigurationPanel_hosts); - - hostCombo = new Combo(comboComposite, SWT.READ_ONLY); - hostCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - hostCombo.addSelectionListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - String host = hostCombo.getText(); - fillSettingsForHost(host); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - widgetSelected(e); - } - }); - - deleteHostButton = new Button(comboComposite, SWT.NONE); - // deleteHostButton.setText(Messages.AbstractConfigurationPanel_delete); - - ISharedImages workbenchImages = UIPlugin.getDefault().getWorkbench().getSharedImages(); - deleteHostButton.setImage(workbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE).createImage()); - - deleteHostButton.setToolTipText(Messages.AbstractConfigurationPanel_deleteButtonTooltip); - deleteHostButton.addSelectionListener(new SelectionListener() { - - @Override - public void widgetSelected(SelectionEvent e) { - String host = getHostFromCombo(); - if (host != null && host.length() != 0) { - removeSettingsForHost(host); - removeSecurePassword(host); - fillHostCombo(); - hostCombo.select(0); - host = getHostFromCombo(); - if (host != null && host.length() != 0) { - fillSettingsForHost(host); - } - } - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - widgetSelected(e); - } - }); - - if (separator) { - Label sep = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL); - sep.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - } - } - } - - /** - * Create the encoding selection combo. - * - * @param parent The parent composite. Must not be null. - * @param separator If true, a separator will be added before the controls. - */ - protected void createEncodingUI(final Composite parent, boolean separator) { - Assert.isNotNull(parent); - - if (separator) { - Label sep = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL); - sep.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - } - - Composite panel = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(2, false); - layout.marginHeight = 0; layout.marginWidth = 0; - panel.setLayout(layout); - panel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - - Label label = new Label(panel, SWT.HORIZONTAL); - label.setText(Messages.AbstractConfigurationPanel_encoding); - - encodingCombo = new Combo(panel, SWT.READ_ONLY); - encodingCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - encodingCombo.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - if (Messages.AbstractConfigurationPanel_encoding_custom.equals(encodingCombo.getText())) { - InputDialog dialog = new InputDialog(parent.getShell(), - Messages.AbstractConfigurationPanel_encoding_custom_title, - Messages.AbstractConfigurationPanel_encoding_custom_message, - null, - new IInputValidator() { - @Override - public String isValid(String newText) { - boolean valid = false; - try { - if (newText != null && !"".equals(newText)) { //$NON-NLS-1$ - valid = Charset.isSupported(newText); - } - } catch (IllegalCharsetNameException e) { /* ignored on purpose */ } - - if (!valid) { - return newText != null && !"".equals(newText) ? Messages.AbstractConfigurationPanel_encoding_custom_error : ""; //$NON-NLS-1$ //$NON-NLS-2$ - } - return null; - } - }); - if (dialog.open() == Window.OK) { - String encoding = dialog.getValue(); - encodingCombo.add(encoding, encodingCombo.getItemCount() - 1); - encodingCombo.select(encodingCombo.indexOf(encoding)); - lastSelectedEncoding = encodingCombo.getText(); - - // Remember the last 5 custom encodings entered - if (!encodingHistory.contains(encoding)) { - if (encodingHistory.size() == 5) encodingHistory.remove(4); - encodingHistory.add(encoding); - } - - } else { - encodingCombo.select(encodingCombo.indexOf(lastSelectedEncoding)); - } - } - } - }); - - fillEncodingCombo(); - - // Apply any default encoding derived from the current selection - String defaultEncoding = getSelectionEncoding(); - if (defaultEncoding != null && !"".equals(defaultEncoding)) { //$NON-NLS-1$ - setEncoding(defaultEncoding); - } - } - - /** - * Fill the encoding combo. - */ - protected void fillEncodingCombo() { - if (encodingCombo != null) { - List encodings = new ArrayList(); - - // Default encoding - encodings.add("Default (ISO-8859-1)"); //$NON-NLS-1$ - - // The currently selected IDE encoding from the preferences - String ideEncoding = getResourceEncoding(); - - // The default Eclipse Workbench encoding (configured in the preferences) - String eclipseEncoding = WorkbenchEncoding.getWorkbenchDefaultEncoding(); - - // The default host (Java VM) encoding - String hostEncoding = Charset.defaultCharset().name(); - - addEncodings(encodings, "UTF-8", ideEncoding, eclipseEncoding, hostEncoding); //$NON-NLS-1$ - - // The "Other..." encoding - encodings.add(Messages.AbstractConfigurationPanel_encoding_custom); - - encodingCombo.setItems(encodings.toArray(new String[encodings.size()])); - encodingCombo.select(0); - - lastSelectedEncoding = encodingCombo.getText(); - } - } - - /** - * Add given encoding names to the list. Duplicates are filtered out by comparing aliases. - */ - private void addEncodings(List encodings, String... toadd) { - Set aliases = new HashSet(); - for (String name : toadd) { - if (name == null) - continue; - try { - Charset cs = Charset.forName(name); - if (aliases.containsAll(cs.aliases())) - continue; - if (aliases.contains(name.toLowerCase())) - continue; - aliases.addAll(cs.aliases()); - aliases.add(name.toLowerCase()); - encodings.add(name); - } catch (Exception e) { - // skip - } - } - } - - /** - * Get the current value of the encoding preference. If the value is not set - * return null. - *

              - * Note: Copied from org.eclipse.ui.ide.IDEEncoding. - * - * @return String - */ - @SuppressWarnings("deprecation") - private String getResourceEncoding() { - String preference = null; - Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - preference = org.eclipse.core.resources.ResourcesPlugin.getPlugin().getPluginPreferences().getString(org.eclipse.core.resources.ResourcesPlugin.PREF_ENCODING); - } - - return preference != null && preference.length() > 0 ? preference : null; - } - - /** - * Select the encoding. - * - * @param encoding The encoding. Must not be null. - */ - protected void setEncoding(String encoding) { - Assert.isNotNull(encoding); - - if (encodingCombo != null && !encodingCombo.isDisposed()) { - int index = encodingCombo.indexOf("ISO-8859-1".equals(encoding) ? "Default (ISO-8859-1)" : encoding); //$NON-NLS-1$ //$NON-NLS-2$ - if (index != -1) encodingCombo.select(index); - else { - encodingCombo.add(encoding, encodingCombo.getItemCount() - 1); - encodingCombo.select(encodingCombo.indexOf(encoding)); - } - - lastSelectedEncoding = encodingCombo.getText(); - } - } - - /** - * Returns the selected encoding. - * - * @return The selected encoding or null. - */ - protected String getEncoding() { - String encoding = encodingCombo != null && !encodingCombo.isDisposed() ? encodingCombo.getText() : null; - return encoding != null && encoding.startsWith("Default") ? null : encoding; //$NON-NLS-1$ - } - - /** - * Returns if or if not the selected encoding is supported. - * - * @return True if the selected encoding is supported. - */ - protected boolean isEncodingValid() { - try { - String encoding = getEncoding(); - return Charset.isSupported(encoding != null ? encoding : "ISO-8859-1"); //$NON-NLS-1$ - } catch (IllegalCharsetNameException e) { - return false; - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/preferences/PreferencePage.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/preferences/PreferencePage.java deleted file mode 100644 index c3114c9..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/preferences/PreferencePage.java +++ /dev/null @@ -1,678 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2014, 2016 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.preferences; - -import java.io.File; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.URIUtil; -import org.eclipse.core.variables.IStringVariableManager; -import org.eclipse.core.variables.VariablesPlugin; -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; -import org.eclipse.jface.viewers.ColumnWeightData; -import org.eclipse.jface.viewers.ILabelProviderListener; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.TableLayout; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.window.Window; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.DirectoryDialog; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.swt.widgets.Text; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.controls.NoteCompositeHelper; -import org.eclipse.tm.terminal.view.ui.interfaces.IExternalExecutablesProperties; -import org.eclipse.tm.terminal.view.ui.interfaces.IPreferenceKeys; -import org.eclipse.tm.terminal.view.ui.local.showin.ExternalExecutablesDialog; -import org.eclipse.tm.terminal.view.ui.local.showin.ExternalExecutablesManager; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchPreferencePage; -import org.osgi.framework.Bundle; - -/** - * Terminal top preference page implementation. - */ -public class PreferencePage extends org.eclipse.jface.preference.PreferencePage implements IWorkbenchPreferencePage { - /* default */ TableViewer viewer; - private Button addButton; - private Button editButton; - private Button removeButton; - /* default */ Combo workingDir; - private Button browseButton; - - private Button variablesButton; - private boolean hasVariablesButton = false; - - /* default */ Text command; - private Button commandBrowseButton; - private Text arguments; - - /* default */ final List> executables = new ArrayList>(); - /* default */ final Map images = new HashMap(); - - /* default */ static final Object[] NO_ELEMENTS = new Object[0]; - - /* (non-Javadoc) - * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) - */ - @Override - public void init(IWorkbench workbench) { - Bundle bundle = Platform.getBundle("org.eclipse.debug.ui"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - hasVariablesButton = true; - } - } - - /* (non-Javadoc) - * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite) - */ - @Override - protected Control createContents(final Composite parent) { - final GC gc = new GC(parent); - gc.setFont(JFaceResources.getDialogFont()); - - Composite panel = new Composite(parent, SWT.NONE); - panel.setLayout(new GridLayout()); - GridData layoutData = new GridData(SWT.FILL, SWT.BEGINNING, true, false); - panel.setLayoutData(layoutData); - - Label label = new Label(panel, SWT.HORIZONTAL); - label.setText(Messages.PreferencePage_label); - label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - - if (!Platform.OS_WIN32.equals(Platform.getOS())) { - Group group = new Group(panel, SWT.NONE); - group.setText(Messages.PreferencePage_command_label); - group.setLayout(new GridLayout(2, false)); - group.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false)); - - command = new Text(group, SWT.SINGLE | SWT.BORDER); - command.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - command.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - boolean valid = true; - String message = null; - - String text = command.getText(); - if (text != null && !"".equals(text.trim())) { //$NON-NLS-1$ - IPath p = new Path(text.trim()); - valid = p.toFile().isFile() && p.toFile().canRead() && p.toFile().canExecute(); - if (!valid) message = Messages.PreferencePage_command_invalid; - } - - setValid(valid); - setErrorMessage(message); - } - }); - - commandBrowseButton = new Button(group, SWT.PUSH); - commandBrowseButton.setText(Messages.PreferencePage_command_button_browse); - layoutData = new GridData(SWT.FILL, SWT.CENTER, false, false); - layoutData.widthHint = Dialog.convertWidthInCharsToPixels(gc.getFontMetrics(), 14); - commandBrowseButton.setLayoutData(layoutData); - commandBrowseButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - FileDialog dialog = new FileDialog(parent.getShell(), SWT.OPEN); - - String text = command.getText(); - if (text != null && !"".equals(text.trim())) { //$NON-NLS-1$ - IPath p = new Path(text); - - if (p.toFile().isFile() || !p.toFile().exists()) { - dialog.setFilterPath(p.removeLastSegments(1).toOSString()); - dialog.setFileName(p.lastSegment()); - } else if (p.toFile().isDirectory()) { - dialog.setFilterPath(p.toOSString()); - } - } - - String selected = dialog.open(); - if (selected != null) { - IPath sp = new Path(selected); - command.setText(sp.toOSString()); - } - } - }); - - String cmd = UIPlugin.getScopedPreferences().getString(IPreferenceKeys.PREF_LOCAL_TERMINAL_DEFAULT_SHELL_UNIX); - if (cmd != null && !"".equals(cmd)) { //$NON-NLS-1$ - command.setText(new Path(cmd).toOSString()); - } - - Composite argsPanel = new Composite(group, SWT.NONE); - GridLayout layout = new GridLayout(2, false); - layout.marginHeight = 0; layout.marginWidth = 0; - argsPanel.setLayout(layout); - layoutData = new GridData(SWT.FILL, SWT.BEGINNING, true, false); - layoutData.horizontalSpan = 2; - argsPanel.setLayoutData(layoutData); - - label = new Label(argsPanel, SWT.NONE); - label.setText(Messages.PreferencePage_command_arguments_label); - - arguments = new Text(argsPanel, SWT.SINGLE | SWT.BORDER); - arguments.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - - String args = UIPlugin.getScopedPreferences().getString(IPreferenceKeys.PREF_LOCAL_TERMINAL_DEFAULT_SHELL_UNIX_ARGS); - if (args != null && !"".equals(args)) { //$NON-NLS-1$ - arguments.setText(args); - } - - NoteCompositeHelper.createNoteComposite(group.getFont(), group, Messages.PreferencePage_command_note_label, Messages.PreferencePage_command_note_text); - } - - Group group = new Group(panel, SWT.NONE); - group.setText(Messages.PreferencePage_workingDir_label); - group.setLayout(new GridLayout(hasVariablesButton ? 3 : 2, false)); - group.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false)); - - workingDir = new Combo(group, SWT.DROP_DOWN); - Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - workingDir.setItems(new String[] { Messages.PreferencePage_workingDir_userhome_label, Messages.PreferencePage_workingDir_eclipsehome_label, Messages.PreferencePage_workingDir_eclipsews_label }); - } else { - workingDir.setItems(new String[] { Messages.PreferencePage_workingDir_userhome_label, Messages.PreferencePage_workingDir_eclipsehome_label }); - } - workingDir.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); - workingDir.select(0); - workingDir.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - boolean valid = true; - String message = null; - - String text = workingDir.getText(); - if (text != null && !"".equals(text.trim()) //$NON-NLS-1$ - && !Messages.PreferencePage_workingDir_userhome_label.equals(text) - && !Messages.PreferencePage_workingDir_eclipsehome_label.equals(text) - && !Messages.PreferencePage_workingDir_eclipsews_label.equals(text)) { - try { - // Resolve possible dynamic variables - IStringVariableManager vm = VariablesPlugin.getDefault().getStringVariableManager(); - String resolved = vm.performStringSubstitution(text.trim()); - - IPath p = new Path(resolved); - valid = p.toFile().canRead() && p.toFile().isDirectory(); - if (!valid) message = Messages.PreferencePage_workingDir_invalid; - } catch (CoreException ex) { - valid = false; - message = ex.getLocalizedMessage(); - } - } - - setValid(valid); - setErrorMessage(message); - } - }); - - browseButton = new Button(group, SWT.PUSH); - browseButton.setText(Messages.PreferencePage_workingDir_button_browse); - layoutData = new GridData(SWT.FILL, SWT.CENTER, false, false); - layoutData.widthHint = Dialog.convertWidthInCharsToPixels(gc.getFontMetrics(), 14); - browseButton.setLayoutData(layoutData); - browseButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - IPath uh = null; - IPath eh = null; - IPath ew = null; - - // HOME - String home = System.getProperty("user.home"); //$NON-NLS-1$ - if (home != null && !"".equals(home)) uh = new Path(home); //$NON-NLS-1$ - - // ECLIPSE_HOME - String eclipseHomeLocation = System.getProperty("eclipse.home.location"); //$NON-NLS-1$ - if (eclipseHomeLocation != null) { - try { - URI uri = URIUtil.fromString(eclipseHomeLocation); - File f = URIUtil.toFile(uri); - eh = new Path(f.getAbsolutePath()); - } catch (URISyntaxException ex) { /* ignored on purpose */ } - } - - // ECLIPSE_WORKSPACE - Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - if (org.eclipse.core.resources.ResourcesPlugin.getWorkspace() != null - && org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot() != null - && org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot().getLocation() != null) { - ew = org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot().getLocation(); - } - } - - DirectoryDialog dialog = new DirectoryDialog(parent.getShell(), SWT.OPEN); - - // Determine the filter path - String text = workingDir.getText(); - if (Messages.PreferencePage_workingDir_userhome_label.equals(text)) { - dialog.setFilterPath(uh.toOSString()); - } else if (Messages.PreferencePage_workingDir_eclipsehome_label.equals(text)) { - dialog.setFilterPath(eh.toOSString()); - } else if (Messages.PreferencePage_workingDir_eclipsews_label.equals(text)) { - dialog.setFilterPath(ew.toOSString()); - } else if (text != null && !"".equals(text.trim())) { //$NON-NLS-1$ - try { - // Resolve possible dynamic variables - IStringVariableManager vm = VariablesPlugin.getDefault().getStringVariableManager(); - String resolved = vm.performStringSubstitution(text.trim()); - dialog.setFilterPath(resolved); - } catch (CoreException ex) { - if (Platform.inDebugMode()) { - UIPlugin.getDefault().getLog().log(ex.getStatus()); - } - } - } - - String selected = dialog.open(); - if (selected != null) { - IPath sp = new Path(selected); - - if (uh.equals(sp)) { - workingDir.select(0); - } else if (eh.equals(sp)) { - workingDir.select(1); - } else if (ew.equals(sp)) { - workingDir.select(2); - } else { - workingDir.setText(sp.toOSString()); - } - } - } - }); - - if (hasVariablesButton) { - variablesButton = new Button(group, SWT.PUSH); - variablesButton.setText(Messages.PreferencePage_workingDir_button_variables); - layoutData = new GridData(SWT.FILL, SWT.CENTER, false, false); - layoutData.widthHint = Dialog.convertWidthInCharsToPixels(gc.getFontMetrics(), 14); - variablesButton.setLayoutData(layoutData); - variablesButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - org.eclipse.debug.ui.StringVariableSelectionDialog dialog = new org.eclipse.debug.ui.StringVariableSelectionDialog(getShell()); - dialog.open(); - String expression = dialog.getVariableExpression(); - if (expression != null) { - if ("${eclipse_home}".equals(expression)) { //$NON-NLS-1$ - workingDir.select(1); - } else if ("${workspace_loc}".equals(expression)) { //$NON-NLS-1$ - workingDir.select(2); - } else { - workingDir.setText(expression); - } - } - } - }); - } - - String initialCwd = UIPlugin.getScopedPreferences().getString(IPreferenceKeys.PREF_LOCAL_TERMINAL_INITIAL_CWD); - if (initialCwd == null || IPreferenceKeys.PREF_INITIAL_CWD_USER_HOME.equals(initialCwd) || "".equals(initialCwd.trim())) { //$NON-NLS-1$ - workingDir.select(0); - } else if (IPreferenceKeys.PREF_INITIAL_CWD_ECLIPSE_HOME.equals(initialCwd) || "${eclipse_home}".equals(initialCwd)) { //$NON-NLS-1$ - workingDir.select(1); - } else if (IPreferenceKeys.PREF_INITIAL_CWD_ECLIPSE_WS.equals(initialCwd) || "${workspace_loc}".equals(initialCwd)) { //$NON-NLS-1$ - workingDir.select(2); - } else { - workingDir.setText(new Path(initialCwd).toOSString()); - } - - NoteCompositeHelper.createNoteComposite(group.getFont(), group, Messages.PreferencePage_workingDir_note_label, Messages.PreferencePage_workingDir_note_text); - - group = new Group(panel, SWT.NONE); - group.setText(Messages.PreferencePage_executables_label); - group.setLayout(new GridLayout(2, false)); - group.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false)); - - viewer = new TableViewer(group, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION); - - Table table = viewer.getTable(); - table.setHeaderVisible(true); - table.setLinesVisible(true); - - TableColumn column = new TableColumn(table, SWT.LEFT); - column.setText(Messages.PreferencePage_executables_column_name_label); - column = new TableColumn(table, SWT.LEFT); - column.setText(Messages.PreferencePage_executables_column_path_label); - - ColumnViewerToolTipSupport.enableFor(viewer); - - TableLayout tableLayout = new TableLayout(); - tableLayout.addColumnData(new ColumnWeightData(35)); - tableLayout.addColumnData(new ColumnWeightData(65)); - table.setLayout(tableLayout); - - layoutData = new GridData(SWT.FILL, SWT.FILL, true, true); - layoutData.heightHint = Dialog.convertHeightInCharsToPixels(gc.getFontMetrics(), 10); - table.setLayoutData(layoutData); - - Composite buttonsPanel = new Composite(group, SWT.NONE); - GridLayout layout = new GridLayout(); - layout.marginHeight = 0; layout.marginWidth = 0; - buttonsPanel.setLayout(layout); - buttonsPanel.setLayoutData(new GridData(SWT.LEAD, SWT.BEGINNING, false, false)); - - addButton = new Button(buttonsPanel, SWT.PUSH); - addButton.setText(Messages.PreferencePage_executables_button_add_label); - layoutData = new GridData(SWT.FILL, SWT.CENTER, false, false); - layoutData.widthHint = Dialog.convertWidthInCharsToPixels(gc.getFontMetrics(), 10); - addButton.setLayoutData(layoutData); - addButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - ExternalExecutablesDialog dialog = new ExternalExecutablesDialog(PreferencePage.this.getShell(), false); - if (dialog.open() == Window.OK) { - // Get the executable properties and add it to the the list - Map executableData = dialog.getExecutableData(); - if (executableData != null && !executables.contains(executableData)) { - executables.add(executableData); - viewer.refresh(); - } - } - } - }); - - editButton = new Button(buttonsPanel, SWT.PUSH); - editButton.setText(Messages.PreferencePage_executables_button_edit_label); - layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); - layoutData.widthHint = Dialog.convertWidthInCharsToPixels(gc.getFontMetrics(), 10); - editButton.setLayoutData(layoutData); - editButton.addSelectionListener(new SelectionAdapter() { - @SuppressWarnings("unchecked") - @Override - public void widgetSelected(SelectionEvent e) { - ISelection s = viewer.getSelection(); - if (s instanceof IStructuredSelection && !s.isEmpty()) { - Object element = ((IStructuredSelection)s).getFirstElement(); - if (element instanceof Map) { - final Map m = (Map)element; - ExternalExecutablesDialog dialog = new ExternalExecutablesDialog(PreferencePage.this.getShell(), true); - dialog.setExecutableData(m); - if (dialog.open() == Window.OK) { - Map executableData = dialog.getExecutableData(); - if (executableData != null) { - m.clear(); - m.putAll(executableData); - viewer.refresh(); - } - } - } - } - } - }); - - removeButton = new Button(buttonsPanel, SWT.PUSH); - removeButton.setText(Messages.PreferencePage_executables_button_remove_label); - layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); - layoutData.widthHint = Dialog.convertWidthInCharsToPixels(gc.getFontMetrics(), 10); - removeButton.setLayoutData(layoutData); - removeButton.addSelectionListener(new SelectionAdapter() { - @SuppressWarnings("unchecked") - @Override - public void widgetSelected(SelectionEvent e) { - ISelection s = viewer.getSelection(); - if (s instanceof IStructuredSelection && !s.isEmpty()) { - Iterator iterator = ((IStructuredSelection)s).iterator(); - while (iterator.hasNext()) { - Object element = iterator.next(); - if (element instanceof Map) { - Map m = (Map)element; - executables.remove(m); - } - viewer.refresh(); - } - } - } - }); - - viewer.setContentProvider(new IStructuredContentProvider() { - @Override - public Object[] getElements(Object inputElement) { - if (inputElement instanceof List && !((List)inputElement).isEmpty()) { - return ((List)inputElement).toArray(); - } - return NO_ELEMENTS; - } - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - } - - @Override - public void dispose() { - } - }); - - viewer.setLabelProvider(new ITableLabelProvider() { - @SuppressWarnings("unchecked") - @Override - public String getColumnText(Object element, int columnIndex) { - if (element instanceof Map) { - Map m = (Map)element; - - switch (columnIndex) { - case 0: - return (String)m.get(IExternalExecutablesProperties.PROP_NAME); - case 1: - return (String)m.get(IExternalExecutablesProperties.PROP_PATH); - } - } - return null; - } - - @SuppressWarnings("unchecked") - @Override - public Image getColumnImage(Object element, int columnIndex) { - Image i = null; - - if (element instanceof Map) { - switch (columnIndex) { - case 0: - Map m = (Map)element; - String icon = (String) m.get(IExternalExecutablesProperties.PROP_ICON); - if (icon != null) { - i = images.get(icon); - if (i == null) { - ImageData id = ExternalExecutablesManager.loadImage(icon); - if (id != null) { - ImageDescriptor d = ImageDescriptor.createFromImageData(id); - if (d != null) i = d.createImage(); - if (i != null) images.put(icon, i); - } - } - } - break; - case 1: - break; - } - } - - return i; - } - - @Override - public void removeListener(ILabelProviderListener listener) { - } - - @Override - public boolean isLabelProperty(Object element, String property) { - return false; - } - - @Override - public void dispose() { - } - - @Override - public void addListener(ILabelProviderListener listener) { - } - }); - - List> l = ExternalExecutablesManager.load(); - if (l != null) executables.addAll(l); - - viewer.setInput(executables); - - viewer.addPostSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - updateButtons(); - } - }); - - updateButtons(); - - gc.dispose(); - - return panel; - } - - /** - * Updates the button states. - */ - protected void updateButtons() { - if (viewer != null) { - addButton.setEnabled(true); - - ISelection selection = viewer.getSelection(); - - boolean hasSelection = selection != null && !selection.isEmpty(); - int count = selection instanceof IStructuredSelection ? ((IStructuredSelection)selection).size() : 0; - - editButton.setEnabled(hasSelection && count == 1); - removeButton.setEnabled(hasSelection && count > 0); - } else { - addButton.setEnabled(false); - editButton.setEnabled(false); - removeButton.setEnabled(false); - } - } - - /* (non-Javadoc) - * @see org.eclipse.jface.preference.PreferencePage#performDefaults() - */ - @Override - protected void performDefaults() { - if (!Platform.OS_WIN32.equals(Platform.getOS())) { - command.setText(""); //$NON-NLS-1$ - arguments.setText(""); //$NON-NLS-1$ - } - - String initialCwd = UIPlugin.getScopedPreferences().getDefaultString(IPreferenceKeys.PREF_LOCAL_TERMINAL_INITIAL_CWD); - if (initialCwd == null || IPreferenceKeys.PREF_INITIAL_CWD_USER_HOME.equals(initialCwd) || "".equals(initialCwd.trim())) { //$NON-NLS-1$ - workingDir.select(0); - } else if (IPreferenceKeys.PREF_INITIAL_CWD_ECLIPSE_HOME.equals(initialCwd) || "${eclipse_home}".equals(initialCwd)) { //$NON-NLS-1$ - workingDir.select(1); - } else if (IPreferenceKeys.PREF_INITIAL_CWD_ECLIPSE_WS.equals(initialCwd) || "${workspace_loc}".equals(initialCwd)) { //$NON-NLS-1$ - workingDir.select(2); - } else { - workingDir.setText(new Path(initialCwd).toOSString()); - } - - executables.clear(); - List> l = ExternalExecutablesManager.load(); - if (l != null) executables.addAll(l); - viewer.refresh(); - - super.performDefaults(); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.preference.PreferencePage#performOk() - */ - @Override - public boolean performOk() { - if (!Platform.OS_WIN32.equals(Platform.getOS())) { - String text = command.getText(); - IPath p = new Path(text.trim()); - UIPlugin.getScopedPreferences().putString(IPreferenceKeys.PREF_LOCAL_TERMINAL_DEFAULT_SHELL_UNIX, p.toFile().isFile() && p.toFile().canRead() && p.toFile().canExecute() ? p.toOSString() : null); - - text = arguments.getText(); - UIPlugin.getScopedPreferences().putString(IPreferenceKeys.PREF_LOCAL_TERMINAL_DEFAULT_SHELL_UNIX_ARGS, !"".equals(text.trim()) ? text.trim() : null); //$NON-NLS-1$ - } - - String text = workingDir.getText(); - if (text == null || Messages.PreferencePage_workingDir_userhome_label.equals(text) || "".equals(text.trim())) { //$NON-NLS-1$ - UIPlugin.getScopedPreferences().putString(IPreferenceKeys.PREF_LOCAL_TERMINAL_INITIAL_CWD, null); - } else if (Messages.PreferencePage_workingDir_eclipsehome_label.equals(text)) { - UIPlugin.getScopedPreferences().putString(IPreferenceKeys.PREF_LOCAL_TERMINAL_INITIAL_CWD, IPreferenceKeys.PREF_INITIAL_CWD_ECLIPSE_HOME); - } else if (Messages.PreferencePage_workingDir_eclipsews_label.equals(text)) { - UIPlugin.getScopedPreferences().putString(IPreferenceKeys.PREF_LOCAL_TERMINAL_INITIAL_CWD, IPreferenceKeys.PREF_INITIAL_CWD_ECLIPSE_WS); - } else { - try { - // Resolve possible dynamic variables - IStringVariableManager vm = VariablesPlugin.getDefault().getStringVariableManager(); - String resolved = vm.performStringSubstitution(text.trim()); - - IPath p = new Path(resolved); - UIPlugin.getScopedPreferences().putString(IPreferenceKeys.PREF_LOCAL_TERMINAL_INITIAL_CWD, p.toFile().canRead() && p.toFile().isDirectory() ? text.trim() : null); - } catch (CoreException e) { - if (Platform.inDebugMode()) { - UIPlugin.getDefault().getLog().log(e.getStatus()); - } - } - } - - ExternalExecutablesManager.save(executables); - - return super.performOk(); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.DialogPage#dispose() - */ - @Override - public void dispose() { - for (Image i : images.values()) { - i.dispose(); - } - images.clear(); - super.dispose(); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/preferences/PreferencesInitializer.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/preferences/PreferencesInitializer.java deleted file mode 100644 index 1c79e02..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/preferences/PreferencesInitializer.java +++ /dev/null @@ -1,41 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2016 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Dirk Fauth - Bug 460496 - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.preferences; - -import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer; -import org.eclipse.tm.terminal.view.core.preferences.ScopedEclipsePreferences; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.interfaces.IPreferenceKeys; - -/** - * Terminal default preferences initializer. - */ -public class PreferencesInitializer extends AbstractPreferenceInitializer { - - /** - * Constructor. - */ - public PreferencesInitializer() { - } - - /* (non-Javadoc) - * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences() - */ - @Override - public void initializeDefaultPreferences() { - ScopedEclipsePreferences prefs = UIPlugin.getScopedPreferences(); - - prefs.putDefaultBoolean(IPreferenceKeys.PREF_REMOVE_TERMINATED_TERMINALS, true); - - prefs.putDefaultString(IPreferenceKeys.PREF_LOCAL_TERMINAL_INITIAL_CWD, IPreferenceKeys.PREF_INITIAL_CWD_USER_HOME); - prefs.putDefaultString(IPreferenceKeys.PREF_LOCAL_TERMINAL_DEFAULT_SHELL_UNIX, null); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/services/TerminalService.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/services/TerminalService.java deleted file mode 100644 index c69bdda..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/services/TerminalService.java +++ /dev/null @@ -1,359 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.services; - -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.ISafeRunnable; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.core.runtime.SafeRunner; -import org.eclipse.core.runtime.Status; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.swt.widgets.Display; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; -import org.eclipse.tm.terminal.view.core.activator.CoreBundleActivator; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalService; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalTabListener; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate; -import org.eclipse.tm.terminal.view.ui.interfaces.IUIConstants; -import org.eclipse.tm.terminal.view.ui.launcher.LauncherDelegateManager; -import org.eclipse.tm.terminal.view.ui.manager.ConsoleManager; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.ui.PlatformUI; - -/** - * Terminal service implementation. - */ -@SuppressWarnings("restriction") -public class TerminalService implements ITerminalService { - /** - * The registered terminal tab dispose listeners. - */ - private final ListenerList terminalTabListeners = new ListenerList(); - - // Flag to remember if the terminal view has been restored or not. - private boolean fRestoringView; - - // Terminal tab events - - /** - * A terminal tab got disposed. - */ - public static final int TAB_DISPOSED = 1; - - /** - * Common terminal service runnable implementation. - */ - protected static abstract class TerminalServiceRunnable { - - /** - * Invoked to execute the terminal service runnable. - * - * @param id The terminals view id or null. - * @param secondaryId The terminals view secondary id or null. - * @param title The terminal tab title. Must not be null. - * @param connector The terminal connector. Must not be null. - * @param data The custom terminal data node or null. - * @param done The callback to invoke if the operation finished or null. - */ - public abstract void run(String id, String secondaryId, String title, ITerminalConnector connector, Object data, Done done); - - /** - * Returns if or if not to execute the runnable asynchronously. - *

              - * The method returns per default true. Overwrite to - * modify the behavior. - * - * @return True to execute the runnable asynchronously, false otherwise. - */ - public boolean isExecuteAsync() { return true; } - } - - /** - * Constructor - */ - public TerminalService() { - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.core.interfaces.ITerminalService#addTerminalTabListener(org.eclipse.tm.terminal.view.core.interfaces.ITerminalTabListener) - */ - @Override - public final void addTerminalTabListener(ITerminalTabListener listener) { - Assert.isNotNull(listener); - terminalTabListeners.add(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.core.interfaces.ITerminalService#removeTerminalTabListener(org.eclipse.tm.terminal.view.core.interfaces.ITerminalTabListener) - */ - @Override - public final void removeTerminalTabListener(ITerminalTabListener listener) { - Assert.isNotNull(listener); - terminalTabListeners.remove(listener); - } - - /** - * Convenience method for notifying the registered terminal tab listeners. - * - * @param event The terminal tab event. - * @param source The disposed tab item. Must not be null. - * @param data The custom data object associated with the disposed tab item or null. - */ - public final void fireTerminalTabEvent(final int event, final Object source, final Object data) { - Assert.isNotNull(source); - - // If no listener is registered, we are done here - if (terminalTabListeners.isEmpty()) return; - - // Get the list or currently registered listeners - Object[] l = terminalTabListeners.getListeners(); - // Loop the registered terminal tab listeners and invoke the proper method - for (int i = 0; i < l.length; i++) { - final ITerminalTabListener listener = (ITerminalTabListener) l[i]; - ISafeRunnable job = new ISafeRunnable() { - @Override - public void handleException(Throwable exception) { - // already logged in Platform#run() - } - - @Override - public void run() throws Exception { - switch (event) { - case TAB_DISPOSED: - listener.terminalTabDisposed(source, data); - break; - default: - } - } - }; - SafeRunner.run(job); - } - } - - /** - * Executes the given runnable operation and invokes the given callback, if any, - * after the operation finished. - * - * @param properties The terminal properties. Must not be null. - * @param runnable The terminal service runnable. Must not be null. - * @param done The callback to invoke if the operation has been finished or null. - */ - protected final void executeServiceOperation(final Map properties, final TerminalServiceRunnable runnable, final Done done) { - Assert.isNotNull(properties); - Assert.isNotNull(runnable); - - // Extract the properties - String id = (String)properties.get(ITerminalsConnectorConstants.PROP_ID); - String secondaryId = (String)properties.get(ITerminalsConnectorConstants.PROP_SECONDARY_ID); - String title = (String)properties.get(ITerminalsConnectorConstants.PROP_TITLE); - Object data = properties.get(ITerminalsConnectorConstants.PROP_DATA); - - // Normalize the terminals console view id - id = normalizeId(id, data); - // Normalize the terminal console tab title - title = normalizeTitle(title, data); - - // Create the terminal connector instance - final ITerminalConnector connector = createTerminalConnector(properties); - if (connector == null) { - // Properties contain invalid connector arguments - if (done != null) { - Exception e = new IllegalArgumentException(Messages.TerminalService_error_cannotCreateConnector); - done.done(new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), e.getLocalizedMessage(), e)); - } - return; - } - - // Finalize the used variables - final String finId = id; - final String finSecondaryId = secondaryId; - final String finTitle = title; - final Object finData = data; - - // Execute the operation - if (!runnable.isExecuteAsync()) { - runnable.run(finId, finSecondaryId, finTitle, connector, finData, done); - } - else { - try { - Display display = PlatformUI.getWorkbench().getDisplay(); - display.asyncExec(new Runnable() { - @Override - public void run() { - runnable.run(finId, finSecondaryId, finTitle, connector, finData, done); - } - }); - } - catch (Exception e) { - // if display is disposed, silently ignore. - } - } - } - - /** - * Normalize the terminals view id. - * - * @param id The terminals view id or null. - * @param data The custom data object or null. - * - * @return The normalized terminals console view id. - */ - protected String normalizeId(String id, Object data) { - return id != null ? id : IUIConstants.ID; - } - - /** - * Normalize the terminal tab title. - * - * @param title The terminal tab title or null. - * @param data The custom data object or null. - * - * @return The normalized terminal tab title. - */ - protected String normalizeTitle(String title, Object data) { - // If the title is explicitly specified, return as is - if (title != null) return title; - - // Return the default console title in all other cases - return Messages.TerminalService_defaultTitle; - } - - /** - * Creates the terminal connector configured within the given properties. - * - * @param properties The terminal console properties. Must not be null. - * @return The terminal connector or null. - */ - protected ITerminalConnector createTerminalConnector(Map properties) { - Assert.isNotNull(properties); - - // The terminal connector result object - ITerminalConnector connector = null; - - // Get the launcher delegate id from the properties - String delegateId = (String)properties.get(ITerminalsConnectorConstants.PROP_DELEGATE_ID); - if (delegateId != null) { - // Get the launcher delegate - ILauncherDelegate delegate = LauncherDelegateManager.getInstance().getLauncherDelegate(delegateId, false); - if (delegate != null) { - // Create the terminal connector - connector = delegate.createTerminalConnector(properties); - } - } - - return connector; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.core.interfaces.ITerminalService#openConsole(java.util.Map, org.eclipse.tm.terminal.view.core.interfaces.ITerminalService.Done) - */ - @Override - public void openConsole(final Map properties, final Done done) { - Assert.isNotNull(properties); - final boolean restoringView = fRestoringView; - - executeServiceOperation(properties, new TerminalServiceRunnable() { - @Override - @SuppressWarnings("synthetic-access") - public void run(final String id, final String secondaryId, final String title, - final ITerminalConnector connector, final Object data, final Done done) { - if (restoringView) { - doRun(id, secondaryId, title, connector, data, done); - } else { - // First, restore the view. This opens consoles from the memento - fRestoringView = true; - ConsoleManager.getInstance().showConsoleView(id, secondaryId); - fRestoringView = false; - - // After that schedule opening the requested console - try { - Display display = PlatformUI.getWorkbench().getDisplay(); - display.asyncExec(new Runnable() { - @Override - public void run() { - doRun(id, secondaryId, title, connector, data, done); - } - }); - } - catch (Exception e) { - // if display is disposed, silently ignore. - } - } - } - - public void doRun(String id, String secondaryId, String title, ITerminalConnector connector, Object data, Done done) { - // Determine the terminal encoding - String encoding = (String)properties.get(ITerminalsConnectorConstants.PROP_ENCODING); - // Create the flags to pass on to openConsole - Map flags = new HashMap(); - flags.put("activate", Boolean.TRUE); //$NON-NLS-1$ - if (properties.get(ITerminalsConnectorConstants.PROP_FORCE_NEW) instanceof Boolean) { - flags.put(ITerminalsConnectorConstants.PROP_FORCE_NEW, (Boolean)properties.get(ITerminalsConnectorConstants.PROP_FORCE_NEW)); - } - if (properties.get(ITerminalsConnectorConstants.PROP_DATA_NO_RECONNECT) instanceof Boolean) { - flags.put(ITerminalsConnectorConstants.PROP_DATA_NO_RECONNECT, (Boolean)properties.get(ITerminalsConnectorConstants.PROP_DATA_NO_RECONNECT)); - } - // Open the new console - CTabItem item; - if (secondaryId != null) - item = ConsoleManager.getInstance().openConsole(id, secondaryId, title, encoding, connector, data, flags); - else - item = ConsoleManager.getInstance().openConsole(id, title, encoding, connector, data, flags); - // Associate the original terminal properties with the tab item. - // This makes it easier to persist the connection data within the memento handler - if (item != null && !item.isDisposed()) item.setData("properties", properties); //$NON-NLS-1$ - - // Invoke the callback - if (done != null) done.done(Status.OK_STATUS); - } - }, done); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.core.interfaces.ITerminalService#closeConsole(java.util.Map, org.eclipse.tm.terminal.view.core.interfaces.ITerminalService.Done) - */ - @Override - public void closeConsole(final Map properties, final Done done) { - Assert.isNotNull(properties); - - executeServiceOperation(properties, new TerminalServiceRunnable() { - @Override - public void run(String id, String secondaryId, String title, ITerminalConnector connector, Object data, Done done) { - // Close the console - ConsoleManager.getInstance().closeConsole(id, title, connector, data); - // Invoke the callback - if (done != null) done.done(Status.OK_STATUS); - } - }, done); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.core.interfaces.ITerminalService#terminateConsole(java.util.Map, org.eclipse.tm.terminal.view.core.interfaces.ITerminalService.Done) - */ - @Override - public void terminateConsole(Map properties, Done done) { - Assert.isNotNull(properties); - - executeServiceOperation(properties, new TerminalServiceRunnable() { - @Override - public void run(String id, String secondaryId, String title, ITerminalConnector connector, Object data, Done done) { - // Close the console - ConsoleManager.getInstance().terminateConsole(id, title, connector, data); - // Invoke the callback - if (done != null) done.done(Status.OK_STATUS); - } - }, done); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/AbstractStreamsConnector.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/AbstractStreamsConnector.java deleted file mode 100644 index 53ec987..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/AbstractStreamsConnector.java +++ /dev/null @@ -1,173 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.streams; - -import java.io.InputStream; -import java.io.OutputStream; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; -import org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalServiceOutputStreamMonitorListener; -import org.eclipse.ui.services.IDisposable; - -/** - * Streams connector implementation. - */ -public abstract class AbstractStreamsConnector extends TerminalConnectorImpl { - // Reference to the stdin monitor - private InputStreamMonitor stdInMonitor; - // Reference to the stdout monitor - private OutputStreamMonitor stdOutMonitor; - // Reference to the stderr monitor - private OutputStreamMonitor stdErrMonitor; - - // Reference to the list of stdout output listeners - private ITerminalServiceOutputStreamMonitorListener[] stdoutListeners = null; - // Reference to the list of stderr output listeners - private ITerminalServiceOutputStreamMonitorListener[] stderrListeners = null; - - /** - * Set the list of stdout listeners. - * - * @param listeners The list of stdout listeners or null. - */ - protected final void setStdoutListeners(ITerminalServiceOutputStreamMonitorListener[] listeners) { - this.stdoutListeners = listeners; - } - - /** - * Set the list of stderr listeners. - * - * @param listeners The list of stderr listeners or null. - */ - protected final void setStderrListeners(ITerminalServiceOutputStreamMonitorListener[] listeners) { - this.stderrListeners = listeners; - } - - /** - * Connect the given streams. The streams connector will wrap each stream - * with a corresponding terminal stream monitor. - * - * @param terminalControl The terminal control. Must not be null. - * @param stdin The stdin stream or null. - * @param stdout The stdout stream or null. - * @param stderr The stderr stream or null. - * @param localEcho Local echo on or off. - * @param lineSeparator The line separator used by the stream. - */ - protected void connectStreams(ITerminalControl terminalControl, OutputStream stdin, InputStream stdout, InputStream stderr, boolean localEcho, String lineSeparator) { - Assert.isNotNull(terminalControl); - - // Create the input stream monitor - if (stdin != null) { - stdInMonitor = createStdInMonitor(terminalControl, stdin, localEcho, lineSeparator); - // Register the connector if it implements IDisposable and stdout/stderr are not monitored - if (stdout == null && stderr == null && this instanceof IDisposable) stdInMonitor.addDisposable((IDisposable)this); - // Start the monitoring - stdInMonitor.startMonitoring(); - } - - // Create the output stream monitor - if (stdout != null) { - stdOutMonitor = createStdOutMonitor(terminalControl, stdout, lineSeparator); - // Register the connector if it implements IDisposable - if (this instanceof IDisposable) stdOutMonitor.addDisposable((IDisposable)this); - // Register the listeners - if (stdoutListeners != null) { - for (ITerminalServiceOutputStreamMonitorListener l : stdoutListeners) { - stdOutMonitor.addListener(l); - } - } - // Start the monitoring - stdOutMonitor.startMonitoring(); - } - - // Create the error stream monitor - if (stderr != null) { - stdErrMonitor = createStdErrMonitor(terminalControl, stderr, lineSeparator); - // Register the connector if it implements IDisposable and stdout is not monitored - if (stdout == null && this instanceof IDisposable) stdErrMonitor.addDisposable((IDisposable)this); - // Register the listeners - if (stderrListeners != null) { - for (ITerminalServiceOutputStreamMonitorListener l : stderrListeners) { - stdErrMonitor.addListener(l); - } - } - // Start the monitoring - stdErrMonitor.startMonitoring(); - } - } - - /** - * Creates an stdin monitor for the given terminal control and stdin stream. - * Subclasses may override to create a specialized stream monitor. - * - * @param terminalControl The terminal control. Must not be null. - * @param stdin The stdin stream or null. - * @param localEcho Local echo on or off. - * @param lineSeparator The line separator used by the stream. - * - * @return input stream monitor - */ - protected InputStreamMonitor createStdInMonitor(ITerminalControl terminalControl, OutputStream stdin, boolean localEcho, String lineSeparator) { - return new InputStreamMonitor(terminalControl, stdin, localEcho, lineSeparator); - } - - /** - * Creates an stdout monitor for the given terminal control and stdout stream. - * Subclasses may override to create a specialized stream monitor. - * - * @param terminalControl The terminal control. Must not be null. - * @param stdout The stdout stream or null. - * @param lineSeparator The line separator used by the stream. - * - * @return output stream monitor - */ - protected OutputStreamMonitor createStdOutMonitor(ITerminalControl terminalControl, InputStream stdout, String lineSeparator) { - return new OutputStreamMonitor(terminalControl, stdout, lineSeparator); - } - - /** - * Creates an stderr monitor for the given terminal control and stderr stream. - * Subclasses may override to create a specialized stream monitor. - * - * @param terminalControl The terminal control. Must not be null. - * @param stderr The stderr stream or null. - * @param lineSeparator The line separator used by the stream. - * - * @return output stream monitor - */ - protected OutputStreamMonitor createStdErrMonitor(ITerminalControl terminalControl, InputStream stderr, String lineSeparator) { - return new OutputStreamMonitor(terminalControl, stderr, lineSeparator); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl#doDisconnect() - */ - @Override - protected void doDisconnect() { - // Dispose the streams - if (stdInMonitor != null) { stdInMonitor.dispose(); stdInMonitor = null; } - if (stdOutMonitor != null) { stdOutMonitor.dispose(); stdOutMonitor = null; } - if (stdErrMonitor != null) { stdErrMonitor.dispose(); stdErrMonitor = null; } - - super.doDisconnect(); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl#getTerminalToRemoteStream() - */ - @Override - public OutputStream getTerminalToRemoteStream() { - return stdInMonitor; - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/InputStreamMonitor.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/InputStreamMonitor.java deleted file mode 100644 index 45394e0..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/InputStreamMonitor.java +++ /dev/null @@ -1,366 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.streams; - -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Queue; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.osgi.util.NLS; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ILineSeparatorConstants; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.ui.services.IDisposable; - -/** - * Input stream monitor implementation. - *

              - * Note: The input is coming from the terminal. Therefore, the input - * stream monitor is attached to the stdin stream of the monitored (remote) process. - */ -public class InputStreamMonitor extends OutputStream implements IDisposable { - // Reference to the parent terminal control - private final ITerminalControl terminalControl; - - // Reference to the monitored (output) stream - private final OutputStream stream; - - // Reference to the thread writing the stream - private volatile Thread thread; - - // Flag to mark the monitor disposed. When disposed, - // no further data is written from the monitored stream. - private volatile boolean disposed; - - // A list of object to dispose if this monitor is disposed - private final List disposables = new ArrayList(); - - // Queue to buffer the data to write to the output stream - private final Queue queue = new LinkedList(); - - // ***** Line separator replacement logic ***** - - private final static int TERMINAL_SENDS_CR = 0; - private final static int TERMINAL_SENDS_CRLF = 1; - private final static int PROGRAM_EXPECTS_LF = 0; - private final static int PROGRAM_EXPECTS_CRLF = 1; - private final static int PROGRAM_EXPECTS_CR = 2; - private final static int NO_CHANGE = 0; - private final static int CHANGE_CR_TO_LF = 1; - private final static int INSERT_LF_AFTER_CR = 2; - private final static int REMOVE_CR = 3; - private final static int REMOVE_LF = 4; - - // CRLF conversion table: - // - // Expected line separator --> | LF | CRLF | CR | - // ------------------------------------+-----------------+--------------------+----------------+ - // Local echo off - control sends CR | change CR to LF | insert LF after CR | no change | - // ------------------------------------+-----------------+--------------------+----------------+ - // Local echo on - control sends CRLF | remove CR | no change | remove LF | - // - private final static int[][] CRLF_REPLACEMENT = { - - {CHANGE_CR_TO_LF, INSERT_LF_AFTER_CR, NO_CHANGE}, - {REMOVE_CR, NO_CHANGE, REMOVE_LF} - }; - - private int replacement; - - /** - * Constructor. - * - * @param terminalControl The parent terminal control. Must not be null. - * @param stream The stream. Must not be null. - * @param localEcho Local echo on or off. - * @param lineSeparator The line separator used by the stream. - */ - public InputStreamMonitor(ITerminalControl terminalControl, OutputStream stream, boolean localEcho, String lineSeparator) { - super(); - - Assert.isNotNull(terminalControl); - this.terminalControl = terminalControl; - Assert.isNotNull(stream); - this.stream = stream; - - // Determine the line separator replacement setting - int terminalSends = localEcho ? TERMINAL_SENDS_CRLF : TERMINAL_SENDS_CR; - if (lineSeparator == null) { - replacement = NO_CHANGE; - } else { - int programExpects; - if (lineSeparator.equals(ILineSeparatorConstants.LINE_SEPARATOR_LF)) { - programExpects = PROGRAM_EXPECTS_LF; - } - else if (lineSeparator.equals(ILineSeparatorConstants.LINE_SEPARATOR_CR)) { - programExpects = PROGRAM_EXPECTS_CR; - } - else { - programExpects = PROGRAM_EXPECTS_CRLF; - } - replacement = CRLF_REPLACEMENT[terminalSends][programExpects]; - } - - } - - /** - * Returns the associated terminal control. - * - * @return The associated terminal control. - */ - protected final ITerminalControl getTerminalControl() { - return terminalControl; - } - - /** - * Adds the given disposable object to the list. The method will do nothing - * if either the disposable object is already part of the list or the monitor - * is disposed. - * - * @param disposable The disposable object. Must not be null. - */ - public final void addDisposable(IDisposable disposable) { - Assert.isNotNull(disposable); - if (!disposed && !disposables.contains(disposable)) disposables.add(disposable); - } - - /** - * Removes the disposable object from the list. - * - * @param disposable The disposable object. Must not be null. - */ - public final void removeDisposable(IDisposable disposable) { - Assert.isNotNull(disposable); - disposables.remove(disposable); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.services.IDisposable#dispose() - */ - @Override - public void dispose() { - // If already disposed --> return immediately - if (disposed) return; - - // Mark the monitor disposed - disposed = true; - - // Close the stream (ignore exceptions on close) - try { stream.close(); } catch (IOException e) { /* ignored on purpose */ } - // And interrupt the thread - close(); - - // Dispose all registered disposable objects - for (IDisposable disposable : disposables) disposable.dispose(); - // Clear the list - disposables.clear(); - } - - /** - * Close the terminal input stream monitor. - */ - @Override - public void close() { - // Not initialized -> return immediately - if (thread == null) return; - - // Copy the reference - final Thread oldThread = thread; - // Unlink the monitor from the thread - thread = null; - // And interrupt the writer thread - oldThread.interrupt(); - } - - /** - * Starts the terminal output stream monitor. - */ - public void startMonitoring() { - // If already initialized -> return immediately - if (thread != null) return; - - // Create a new runnable which is constantly reading from the stream - Runnable runnable = new Runnable() { - @Override - public void run() { - writeStream(); - } - }; - - // Create the writer thread - thread = new Thread(runnable, "Terminal Input Stream Monitor Thread"); //$NON-NLS-1$ - - // Configure the writer thread - thread.setDaemon(true); - - // Start the processing - thread.start(); - } - - - /** - * Reads from the queue and writes the read content to the stream. - */ - protected void writeStream() { - // Read from the queue and write to the stream until disposed - outer: while (thread != null && !disposed) { - byte[] data; - // If the queue is empty, wait until notified - synchronized(queue) { - while (queue.isEmpty()) { - if (disposed) break outer; - try { - queue.wait(); - } catch (InterruptedException e) { - break outer; - } - } - // Retrieves the queue head (is null if queue is empty (should never happen)) - data = queue.poll(); - } - if (data != null) { - try { - // Break up writes into max 1000 byte junks to avoid console input buffer overflows on Windows - int written = 0; - byte[] buf = new byte[1000]; - while (written < data.length) { - int len = Math.min(buf.length, data.length - written); - System.arraycopy(data, written, buf, 0, len); - // Write the data to the stream - stream.write(buf, 0, len); - written += len; - // Flush the stream immediately - stream.flush(); - // Wait a little between writes to allow input being processed - if (written < data.length) - Thread.sleep(100); - } - } catch (IOException e) { - // IOException received. If this is happening when already disposed -> ignore - if (!disposed) { - IStatus status = new Status(IStatus.ERROR, UIPlugin.getUniqueIdentifier(), - NLS.bind(Messages.InputStreamMonitor_error_writingToStream, e.getLocalizedMessage()), e); - UIPlugin.getDefault().getLog().log(status); - } - } - catch (InterruptedException e) { - break; - } - } - } - - // Dispose the stream - dispose(); - } - - /* (non-Javadoc) - * @see java.io.OutputStream#write(int) - */ - @Override - public void write(int b) throws IOException { - synchronized(queue) { - queue.add(new byte[] { (byte)b }); - queue.notifyAll(); - } - } - - /* (non-Javadoc) - * @see java.io.OutputStream#write(byte[], int, int) - */ - @Override - public void write(byte[] b, int off, int len) throws IOException { - // Write the whole block to the queue to avoid synchronization - // to happen for every byte. To do so, we have to avoid calling - // the super method. Therefore we have to do the same checking - // here as the base class does. - - // Null check. See the implementation in OutputStream. - if (b == null) throw new NullPointerException(); - - // Boundary check. See the implementation in OutputStream. - if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0)) { - throw new IndexOutOfBoundsException(); - } - else if (len == 0) { - return; - } - - // Make sure that the written block is not interlaced with other input. - synchronized(queue) { - // Preprocess the block to be written - byte[] processedBytes = onWriteContentToStream(b, off, len); - // If the returned array is not the original one, adjust offset and length - if (processedBytes != b) { - off = 0; len = processedBytes.length; b = processedBytes; - } - - // Get the content from the byte buffer specified by offset and length - byte[] bytes = new byte[len]; - int j = 0; - for (int i = 0 ; i < len ; i++) { - bytes[j++] = b[off + i]; - } - - queue.add(bytes); - queue.notifyAll(); - } - } - - /** - * Allow for processing of data from byte stream from the terminal before - * it is written to the output stream. If the returned byte array is different - * than the one that was passed in with the bytes argument, then the - * length value will be adapted. - * - * @param bytes The byte stream. Must not be null. - * @param off The offset. - * @param len the length. - * - * @return The processed byte stream. - * - */ - protected byte[] onWriteContentToStream(byte[] bytes, int off, int len) { - Assert.isNotNull(bytes); - - if (replacement != NO_CHANGE && len > 0) { - String origText = new String(bytes, off, len); - String text = null; - // - // TODO: check whether this is correct! new String(byte[], int, int) always uses the default - // encoding! - - if (replacement == CHANGE_CR_TO_LF) { - text = origText.replace('\r', '\n'); - } - else if (replacement == INSERT_LF_AFTER_CR) { - text = origText.replaceAll("\r\n|\r", "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ - } - else if (replacement == REMOVE_CR) { - text = origText.replaceAll(ILineSeparatorConstants.LINE_SEPARATOR_CR, ""); //$NON-NLS-1$ - } - else if (replacement == REMOVE_LF) { - text = origText.replaceAll(ILineSeparatorConstants.LINE_SEPARATOR_LF, ""); //$NON-NLS-1$ - } - - if (text != null && !origText.equals(text)) { - bytes = text.getBytes(); - } - } - - return bytes; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/OutputStreamMonitor.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/OutputStreamMonitor.java deleted file mode 100644 index b922210..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/OutputStreamMonitor.java +++ /dev/null @@ -1,318 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.streams; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.ListenerList; -import org.eclipse.core.runtime.Status; -import org.eclipse.osgi.util.NLS; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalServiceOutputStreamMonitorListener; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ILineSeparatorConstants; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.interfaces.tracing.ITraceIds; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.ui.services.IDisposable; - -/** - * Output stream monitor implementation. - *

              - * Note: The output is going to the terminal. Therefore, the output - * stream monitor is attached to the stdout and/or stderr stream of the monitored - * (remote) process. - */ -public class OutputStreamMonitor implements IDisposable { - // The default buffer size to use - private static final int BUFFER_SIZE = 8192; - - // Reference to the parent terminal control - private final ITerminalControl terminalControl; - - // Reference to the monitored (input) stream - private final InputStream stream; - - // The line separator used by the monitored (input) stream - private final String lineSeparator; - - // Reference to the thread reading the stream - private Thread thread; - - // Flag to mark the monitor disposed. When disposed, - // no further data is read from the monitored stream. - private boolean disposed; - - // A list of object to dispose if this monitor is disposed - private final List disposables = new ArrayList(); - - // The list of registered listener - private final ListenerList listeners; - - /** - * Constructor. - * - * @param terminalControl The parent terminal control. Must not be null. - * @param stream The stream. Must not be null. - * @param lineSeparator The line separator used by the stream. - */ - public OutputStreamMonitor(ITerminalControl terminalControl, InputStream stream, String lineSeparator) { - super(); - - Assert.isNotNull(terminalControl); - this.terminalControl = terminalControl; - Assert.isNotNull(stream); - this.stream = new BufferedInputStream(stream, BUFFER_SIZE); - - this.lineSeparator = lineSeparator; - - this.listeners = new ListenerList(); - } - - /** - * Register a streams data receiver listener. - * - * @param listener The listener. Must not be null. - */ - public final void addListener(ITerminalServiceOutputStreamMonitorListener listener) { - Assert.isNotNull(listener); - listeners.add(listener); - } - - /** - * Unregister a streams data receiver listener. - * - * @param listener The listener. Must not be null. - */ - public final void removeListener(ITerminalServiceOutputStreamMonitorListener listener) { - Assert.isNotNull(listener); - listeners.remove(listener); - } - - /** - * Adds the given disposable object to the list. The method will do nothing - * if either the disposable object is already part of the list or the monitor - * is disposed. - * - * @param disposable The disposable object. Must not be null. - */ - public final void addDisposable(IDisposable disposable) { - Assert.isNotNull(disposable); - if (!disposed && !disposables.contains(disposable)) disposables.add(disposable); - } - - /** - * Removes the disposable object from the list. - * - * @param disposable The disposable object. Must not be null. - */ - public final void removeDisposable(IDisposable disposable) { - Assert.isNotNull(disposable); - disposables.remove(disposable); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.services.IDisposable#dispose() - */ - @Override - public void dispose() { - // If already disposed --> return immediately - if (disposed) return; - - // Mark the monitor disposed - disposed = true; - - // Close the stream (ignore exceptions on close) - try { stream.close(); } catch (IOException e) { /* ignored on purpose */ } - - // Dispose all registered disposable objects - for (IDisposable disposable : disposables) disposable.dispose(); - // Clear the list - disposables.clear(); - } - - /** - * Starts the terminal output stream monitor. - */ - protected void startMonitoring() { - // If already initialized -> return immediately - if (thread != null) return; - - // Create a new runnable which is constantly reading from the stream - Runnable runnable = new Runnable() { - @Override - public void run() { - readStream(); - } - }; - - // Create the reader thread - thread = new Thread(runnable, "Terminal Output Stream Monitor Thread"); //$NON-NLS-1$ - - // Configure the reader thread - thread.setDaemon(true); - thread.setPriority(Thread.MIN_PRIORITY); - - // Start the processing - thread.start(); - } - - /** - * Returns the terminal control that this stream monitor is associated with. - */ - protected ITerminalControl getTerminalControl() { - return terminalControl; - } - - /** - * Reads from the output stream and write the read content - * to the terminal control output stream. - */ - void readStream() { - // Creates the read buffer - byte[] readBuffer = new byte[BUFFER_SIZE]; - - // We need to maintain UI responsiveness but still stream the content - // to the terminal control fast. Put the thread to a short sleep each second. - long sleepMarker = System.currentTimeMillis(); - - // Read from the stream until EOS is reached or the - // monitor is marked disposed. - int read = 0; - while (read >= 0 && !disposed) { - try { - // Read from the stream - read = stream.read(readBuffer); - // If some data has been read, append to the terminal - // control output stream - if (read > 0) { - // Allow for post processing the read content before appending - byte[] processedReadBuffer = onContentReadFromStream(readBuffer, read); - if (processedReadBuffer != readBuffer) { - read = processedReadBuffer.length; - } - terminalControl.getRemoteToTerminalOutputStream().write(processedReadBuffer, 0, read); - } - } catch (IOException e) { - // IOException received. If this is happening when already disposed -> ignore - if (!disposed) { - IStatus status = new Status(IStatus.ERROR, UIPlugin.getUniqueIdentifier(), - NLS.bind(Messages.OutputStreamMonitor_error_readingFromStream, e.getLocalizedMessage()), e); - UIPlugin.getDefault().getLog().log(status); - } - break; - } catch (NullPointerException e) { - // killing the stream monitor while reading can cause an NPE - // when reading from the stream - if (!disposed && thread != null) { - IStatus status = new Status(IStatus.ERROR, UIPlugin.getUniqueIdentifier(), - NLS.bind(Messages.OutputStreamMonitor_error_readingFromStream, e.getLocalizedMessage()), e); - UIPlugin.getDefault().getLog().log(status); - } - break; - } - - // See above -> Thread will go to sleep each second - if (System.currentTimeMillis() - sleepMarker > 1000) { - sleepMarker = System.currentTimeMillis(); - try { Thread.sleep(1); } catch (InterruptedException e) { /* ignored on purpose */ } - } - } - - // Dispose ourself - dispose(); - } - - /** - * Allow for processing of data from byte stream after it is read from - * client but before it is appended to the terminal. If the returned byte - * array is different than the one that was passed in with the byteBuffer - * argument, then the bytesRead value will be ignored and the full - * returned array will be written out. - * - * @param byteBuffer The byte stream. Must not be null. - * @param bytesRead The number of bytes that were read into the read buffer. - * @return The processed byte stream. - * - */ - protected byte[] onContentReadFromStream(byte[] byteBuffer, int bytesRead) { - Assert.isNotNull(byteBuffer); - - // If tracing is enabled, print out the decimal byte values read - if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_OUTPUT_STREAM_MONITOR)) { - StringBuilder debug = new StringBuilder("byteBuffer [decimal, " + bytesRead + " bytes] : "); //$NON-NLS-1$ //$NON-NLS-2$ - for (int i = 0; i < bytesRead; i++) { - debug.append(Byte.valueOf(byteBuffer[i]).intValue()); - debug.append(' '); - } - System.out.println(debug.toString()); - } - - // Remember if the text got changed. - boolean changed = false; - - // How can me make sure that we don't mess with the encoding here? - String text = new String(byteBuffer, 0, bytesRead); - - // Shift-In (14) and Shift-Out(15) confuses the terminal widget - if (text.indexOf(14) != -1 || text.indexOf(15) != -1) { - text = text.replaceAll("\\x0e", "").replaceAll("\\x0f", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - changed = true; - } - - // Check on the line separator setting - if (lineSeparator != null - && !ILineSeparatorConstants.LINE_SEPARATOR_CRLF.equals(lineSeparator)) { - String separator = ILineSeparatorConstants.LINE_SEPARATOR_LF.equals(lineSeparator) ? "\n" : "\r"; //$NON-NLS-1$ //$NON-NLS-2$ - String separator2 = ILineSeparatorConstants.LINE_SEPARATOR_LF.equals(lineSeparator) ? "\r" : "\n"; //$NON-NLS-1$ //$NON-NLS-2$ - - if (text.indexOf(separator) != -1) { - String[] fragments = text.split(separator); - StringBuilder b = new StringBuilder(); - for (int i = 0; i < fragments.length; i++) { - String fragment = fragments[i]; - String nextFragment = i + 1 < fragments.length ? fragments[i + 1] : null; - b.append(fragment); - if (fragment.endsWith(separator2) || (nextFragment != null && nextFragment.startsWith(separator2))) { - // Both separators are found, just add the original separator - b.append(separator); - } else { - b.append("\n\r"); //$NON-NLS-1$ - } - } - if (!text.equals(b.toString())) { - text = b.toString(); - changed = true; - } - } - } - - // If changed, get the new bytes array - if (changed) { - byteBuffer = text.getBytes(); - bytesRead = byteBuffer.length; - } - - // If listeners are registered, invoke the listeners now. - if (listeners.size() > 0) { - for (Object candidate : listeners.getListeners()) { - if (!(candidate instanceof ITerminalServiceOutputStreamMonitorListener)) continue; - ((ITerminalServiceOutputStreamMonitorListener)candidate).onContentReadFromStream(byteBuffer, bytesRead); - } - } - - return byteBuffer; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/StreamsConnector.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/StreamsConnector.java deleted file mode 100644 index 299ee0c..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/StreamsConnector.java +++ /dev/null @@ -1,122 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.streams; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; -import org.eclipse.tm.internal.terminal.provisional.api.NullSettingsStore; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.ui.services.IDisposable; - -/** - * Streams connector implementation. - */ -public class StreamsConnector extends AbstractStreamsConnector implements IDisposable { - // Reference to the streams settings - private final StreamsSettings settings; - - /** - * Constructor. - */ - public StreamsConnector() { - this(new StreamsSettings()); - } - - /** - * Constructor. - * - * @param settings The streams settings. Must not be null - */ - public StreamsConnector(StreamsSettings settings) { - super(); - - Assert.isNotNull(settings); - this.settings = settings; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl#connect(org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl) - */ - @Override - public void connect(ITerminalControl control) { - Assert.isNotNull(control); - super.connect(control); - - // Setup the listeners - setStdoutListeners(settings.getStdOutListeners()); - setStderrListeners(settings.getStdErrListeners()); - - // connect the streams - connectStreams(control, settings.getStdinStream(), settings.getStdoutStream(), settings.getStderrStream(), settings.isLocalEcho(), settings.getLineSeparator()); - - // Set the terminal control state to CONNECTED - control.setState(TerminalState.CONNECTED); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl#isLocalEcho() - */ - @Override - public boolean isLocalEcho() { - return settings.isLocalEcho(); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.services.IDisposable#dispose() - */ - @Override - public void dispose() { - disconnect(); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.streams.AbstractStreamsConnector#doDisconnect() - */ - @Override - public void doDisconnect() { - // Dispose the streams - super.doDisconnect(); - - // Set the terminal control state to CLOSED. - fControl.setState(TerminalState.CLOSED); - } - - // ***** Process Connector settings handling ***** - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl#getSettingsSummary() - */ - @Override - public String getSettingsSummary() { - return ""; //$NON-NLS-1$ - } - - @Override - public void setDefaultSettings() { - settings.load(new NullSettingsStore()); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl#load(org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore) - */ - @Override - public void load(ISettingsStore store) { - settings.load(store); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnectorImpl#save(org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore) - */ - @Override - public void save(ISettingsStore store) { - settings.save(store); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/StreamsLauncherDelegate.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/StreamsLauncherDelegate.java deleted file mode 100644 index d9febb5..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/StreamsLauncherDelegate.java +++ /dev/null @@ -1,113 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.streams; - -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalConnectorExtension; -import org.eclipse.tm.terminal.view.core.TerminalServiceFactory; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalService; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalServiceOutputStreamMonitorListener; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel; -import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; -import org.eclipse.tm.terminal.view.ui.internal.SettingsStore; -import org.eclipse.tm.terminal.view.ui.launcher.AbstractLauncherDelegate; - -/** - * Streams launcher delegate implementation. - */ -public class StreamsLauncherDelegate extends AbstractLauncherDelegate { - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate#needsUserConfiguration() - */ - @Override - public boolean needsUserConfiguration() { - return false; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate#getPanel(org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer) - */ - @Override - public IConfigurationPanel getPanel(IConfigurationPanelContainer container) { - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate#execute(java.util.Map, org.eclipse.tm.terminal.view.core.interfaces.ITerminalService.Done) - */ - @Override - public void execute(Map properties, ITerminalService.Done done) { - Assert.isNotNull(properties); - - // Get the terminal service - ITerminalService terminal = TerminalServiceFactory.getService(); - // If not available, we cannot fulfill this request - if (terminal != null) { - terminal.openConsole(properties, done); - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate#createTerminalConnector(java.util.Map) - */ - @Override - public ITerminalConnector createTerminalConnector(Map properties) { - Assert.isNotNull(properties); - - // Check for the terminal connector id - String connectorId = (String)properties.get(ITerminalsConnectorConstants.PROP_TERMINAL_CONNECTOR_ID); - if (connectorId == null) connectorId = "org.eclipse.tm.terminal.connector.streams.StreamsConnector"; //$NON-NLS-1$ - - // Extract the streams properties - OutputStream stdin = (OutputStream)properties.get(ITerminalsConnectorConstants.PROP_STREAMS_STDIN); - InputStream stdout = (InputStream)properties.get(ITerminalsConnectorConstants.PROP_STREAMS_STDOUT); - InputStream stderr = (InputStream)properties.get(ITerminalsConnectorConstants.PROP_STREAMS_STDERR); - Object value = properties.get(ITerminalsConnectorConstants.PROP_LOCAL_ECHO); - boolean localEcho = value instanceof Boolean ? ((Boolean)value).booleanValue() : false; - String lineSeparator = (String)properties.get(ITerminalsConnectorConstants.PROP_LINE_SEPARATOR); - ITerminalServiceOutputStreamMonitorListener[] stdoutListeners = (ITerminalServiceOutputStreamMonitorListener[])properties.get(ITerminalsConnectorConstants.PROP_STDOUT_LISTENERS); - ITerminalServiceOutputStreamMonitorListener[] stderrListeners = (ITerminalServiceOutputStreamMonitorListener[])properties.get(ITerminalsConnectorConstants.PROP_STDERR_LISTENERS); - - // Construct the terminal settings store - ISettingsStore store = new SettingsStore(); - - // Construct the streams settings - StreamsSettings streamsSettings = new StreamsSettings(); - streamsSettings.setStdinStream(stdin); - streamsSettings.setStdoutStream(stdout); - streamsSettings.setStderrStream(stderr); - streamsSettings.setLocalEcho(localEcho); - streamsSettings.setLineSeparator(lineSeparator); - streamsSettings.setStdOutListeners(stdoutListeners); - streamsSettings.setStdErrListeners(stderrListeners); - // And save the settings to the store - streamsSettings.save(store); - - // Construct the terminal connector instance - ITerminalConnector connector = TerminalConnectorExtension.makeTerminalConnector(connectorId); - if (connector != null) { - // Apply default settings - connector.setDefaultSettings(); - // And load the real settings - connector.load(store); - } - - return connector; - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/StreamsSettings.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/StreamsSettings.java deleted file mode 100644 index f794ef5..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/streams/StreamsSettings.java +++ /dev/null @@ -1,201 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.streams; - -import java.io.InputStream; -import java.io.OutputStream; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalServiceOutputStreamMonitorListener; -import org.eclipse.tm.terminal.view.ui.internal.SettingsStore; - -/** - * Streams connector settings implementation. - */ -public class StreamsSettings { - // Reference to the stdin stream - private OutputStream stdin; - // Reference to the stdout stream - private InputStream stdout; - // Reference to the stderr stream - private InputStream stderr; - // Flag to control the local echo - private boolean localEcho = true; - // The line separator setting - private String lineSeparator = null; - // The list of stdout output listeners - private ITerminalServiceOutputStreamMonitorListener[] stdoutListeners = null; - // The list of stderr output listeners - private ITerminalServiceOutputStreamMonitorListener[] stderrListeners = null; - - /** - * Sets the stdin stream instance. - * - * @param stdin The stream instance or null. - */ - public void setStdinStream(OutputStream stdin) { - this.stdin = stdin; - } - - /** - * Returns the stdin stream instance. - * - * @return The stream instance or null. - */ - public OutputStream getStdinStream() { - return stdin; - } - - /** - * Sets the stdout stream instance. - * - * @param stdout The stream instance or null. - */ - public void setStdoutStream(InputStream stdout) { - this.stdout = stdout; - } - - /** - * Returns the stdout stream instance. - * - * @return The stream instance or null. - */ - public InputStream getStdoutStream() { - return stdout; - } - - /** - * Sets the stderr stream instance. - * - * @param stderr The stream instance or null. - */ - public void setStderrStream(InputStream stderr) { - this.stderr = stderr; - } - - /** - * Returns the stderr stream instance. - * - * @return The stream instance or null. - */ - public InputStream getStderrStream() { - return stderr; - } - - /** - * Sets if the process requires a local echo from the terminal widget. - * - * @param value Specify true to enable the local echo, false otherwise. - */ - public void setLocalEcho(boolean value) { - this.localEcho = value; - } - - /** - * Returns true if the process requires a local echo - * from the terminal widget. - * - * @return True if local echo is enabled, false otherwise. - */ - public boolean isLocalEcho() { - return localEcho; - } - - /** - * Sets the stream line separator. - * - * @param separator The stream line separator null. - */ - public void setLineSeparator(String separator) { - this.lineSeparator = separator; - } - - /** - * Returns the stream line separator. - * - * @return The stream line separator or null. - */ - public String getLineSeparator() { - return lineSeparator; - } - - /** - * Sets the list of stdout listeners. - * - * @param listeners The list of stdout listeners or null. - */ - public void setStdOutListeners(ITerminalServiceOutputStreamMonitorListener[] listeners) { - this.stdoutListeners = listeners; - } - - /** - * Returns the list of stdout listeners. - * - * @return The list of stdout listeners or null. - */ - public ITerminalServiceOutputStreamMonitorListener[] getStdOutListeners() { - return stdoutListeners; - } - - /** - * Sets the list of stderr listeners. - * - * @param listeners The list of stderr listeners or null. - */ - public void setStdErrListeners(ITerminalServiceOutputStreamMonitorListener[] listeners) { - this.stderrListeners = listeners; - } - - /** - * Returns the list of stderr listeners. - * - * @return The list of stderr listeners or null. - */ - public ITerminalServiceOutputStreamMonitorListener[] getStdErrListeners() { - return stderrListeners; - } - - /** - * Loads the streams settings from the given settings store. - * - * @param store The settings store. Must not be null. - */ - public void load(ISettingsStore store) { - Assert.isNotNull(store); - localEcho = Boolean.parseBoolean(store.get("LocalEcho", Boolean.FALSE.toString())); //$NON-NLS-1$ - lineSeparator = store.get("LineSeparator", null); //$NON-NLS-1$ - if (store instanceof SettingsStore) { - stdin = (OutputStream)((SettingsStore)store).getSettings().get("stdin"); //$NON-NLS-1$ - stdout = (InputStream)((SettingsStore)store).getSettings().get("stdout"); //$NON-NLS-1$ - stderr = (InputStream)((SettingsStore)store).getSettings().get("stderr"); //$NON-NLS-1$ - stdoutListeners = (ITerminalServiceOutputStreamMonitorListener[])((SettingsStore)store).getSettings().get("StdOutListeners"); //$NON-NLS-1$ - stderrListeners = (ITerminalServiceOutputStreamMonitorListener[])((SettingsStore)store).getSettings().get("StdErrListeners"); //$NON-NLS-1$ - } - } - - /** - * Saves the process settings to the given settings store. - * - * @param store The settings store. Must not be null. - */ - public void save(ISettingsStore store) { - Assert.isNotNull(store); - store.put("LocalEcho", Boolean.toString(localEcho)); //$NON-NLS-1$ - store.put("LineSeparator", lineSeparator); //$NON-NLS-1$ - if (store instanceof SettingsStore) { - ((SettingsStore)store).getSettings().put("stdin", stdin); //$NON-NLS-1$ - ((SettingsStore)store).getSettings().put("stdout", stdout); //$NON-NLS-1$ - ((SettingsStore)store).getSettings().put("stderr", stderr); //$NON-NLS-1$ - ((SettingsStore)store).getSettings().put("StdOutListeners", stdoutListeners); //$NON-NLS-1$ - ((SettingsStore)store).getSettings().put("StdErrListeners", stderrListeners); //$NON-NLS-1$ - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabCommandFieldHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabCommandFieldHandler.java deleted file mode 100644 index 1ebda75..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabCommandFieldHandler.java +++ /dev/null @@ -1,102 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.tabs; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.tm.internal.terminal.control.CommandInputFieldWithHistory; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.ui.services.IDisposable; - -/** - * Tab command input field handler implementation. - */ -public class TabCommandFieldHandler implements IDisposable, IAdaptable { - // Reference to the parent tab folder manager - private final TabFolderManager tabFolderManager; - // Reference to the associated tab - private final CTabItem item; - - // Reference to the command input field - private CommandInputFieldWithHistory field; - // The command field history - private String history; - - /** - * Constructor. - * - * @param tabFolderManager The parent tab folder manager. Must not be null - * @param item The associated tab item. Must not be null. - */ - public TabCommandFieldHandler(TabFolderManager tabFolderManager, CTabItem item) { - Assert.isNotNull(tabFolderManager); - this.tabFolderManager = tabFolderManager; - Assert.isNotNull(item); - this.item = item; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.services.IDisposable#dispose() - */ - @Override - public void dispose() { - field = null; - history = null; - } - - /* (non-Javadoc) - * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public Object getAdapter(Class adapter) { - if (TabFolderManager.class.equals(adapter)) { - return tabFolderManager; - } - if (CTabItem.class.equals(adapter)) { - return item; - } - return null; - } - - /** - * Returns if or if not the associated tab item has the command input field enabled. - * - * @return True if the command input field is enabled, false otherwise. - */ - public boolean hasCommandInputField() { - return field != null; - } - - /** - * Set the command input field on or off. - * - * @param on True for on, false for off. - */ - public void setCommandInputField(boolean on) { - // save the old history - if (field != null) { - history = field.getHistory(); - field = null; - } - - if (on) { - field = new CommandInputFieldWithHistory(100); - field.setHistory(history); - } - - // Apply to the terminal control - Assert.isTrue(!item.isDisposed()); - ITerminalViewControl terminal = (ITerminalViewControl)item.getData(); - if (terminal != null) terminal.setCommandInputField(field); - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabDisposeListener.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabDisposeListener.java deleted file mode 100644 index cdb5d2f..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabDisposeListener.java +++ /dev/null @@ -1,81 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.tabs; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.widgets.Control; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.terminal.view.core.TerminalServiceFactory; -import org.eclipse.tm.terminal.view.core.interfaces.ITerminalService; -import org.eclipse.tm.terminal.view.ui.services.TerminalService; - -/** - * Terminal tab default dispose listener implementation. - */ -public class TabDisposeListener implements DisposeListener { - private final TabFolderManager parentTabFolderManager; - - /** - * Constructor. - * - * @param parentTabFolderManager The parent tab folder manager. Must not be null - */ - public TabDisposeListener(TabFolderManager parentTabFolderManager) { - Assert.isNotNull(parentTabFolderManager); - this.parentTabFolderManager = parentTabFolderManager; - } - - /** - * Returns the parent terminal console tab folder manager instance. - * - * @return The parent terminal console tab folder manager instance. - */ - protected final TabFolderManager getParentTabFolderManager() { - return parentTabFolderManager; - } - - /* (non-Javadoc) - * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent) - */ - @Override - public void widgetDisposed(DisposeEvent e) { - // If a tab item gets disposed, we have to dispose the terminal as well - if (e.getSource() instanceof CTabItem) { - // Get the terminal control (if any) from the tab item - Object candidate = ((CTabItem)e.getSource()).getData(); - if (candidate instanceof ITerminalViewControl) { - ITerminalViewControl terminal = (ITerminalViewControl)candidate; - // Keep the context menu from being disposed - terminal.getControl().setMenu(null); - terminal.disposeTerminal(); - } - // Dispose the command input field handler - parentTabFolderManager.disposeTabCommandFieldHandler((CTabItem)e.getSource()); - // Dispose the tab item control - Control control = ((CTabItem) e.getSource()).getControl(); - if (control != null) control.dispose(); - - // If all items got removed, we have to switch back to the empty page control - if (parentTabFolderManager.getTabFolder() != null && parentTabFolderManager.getTabFolder().getItemCount() == 0) { - parentTabFolderManager.getParentView().switchToEmptyPageControl(); - } - // Fire selection changed event - parentTabFolderManager.fireSelectionChanged(); - // Fire the terminal console disposed event - ITerminalService service = TerminalServiceFactory.getService(); - if (service instanceof TerminalService) { - ((TerminalService)service).fireTerminalTabEvent(TerminalService.TAB_DISPOSED, e.getSource(), ((CTabItem)e.getSource()).getData("customData")); //$NON-NLS-1$ - } - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderManager.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderManager.java deleted file mode 100644 index 41e120b..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderManager.java +++ /dev/null @@ -1,858 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.tabs; - -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.PlatformObject; -import org.eclipse.jface.action.IStatusLineManager; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CTabFolder; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.swt.dnd.Clipboard; -import org.eclipse.swt.dnd.DND; -import org.eclipse.swt.dnd.TextTransfer; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.tm.internal.terminal.control.ITerminalListener; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.control.TerminalViewControlFactory; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; -import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.interfaces.ITerminalsView; -import org.eclipse.tm.terminal.view.ui.interfaces.ImageConsts; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.ui.PlatformUI; - -/** - * Terminal tab folder manager. - */ -public class TabFolderManager extends PlatformObject implements ISelectionProvider { - // Reference to the parent terminal consoles view - private final ITerminalsView parentView; - // Reference to the selection listener instance - private final SelectionListener selectionListener; - - /** - * List of selection changed listeners. - */ - private final List selectionChangedListeners = new ArrayList(); - - /** - * Map of tab command input field handler per tab item - */ - private final Map commandFieldHandler = new HashMap(); - - /** - * The terminal control selection listener implementation. - */ - private class TerminalControlSelectionListener implements DisposeListener, MouseListener { - private final ITerminalViewControl terminal; - private boolean selectMode; - - /** - * Constructor. - * - * @param terminal The terminal control. Must not be null. - */ - public TerminalControlSelectionListener(ITerminalViewControl terminal) { - Assert.isNotNull(terminal); - this.terminal = terminal; - - // Register ourself as the required listener - terminal.getControl().addDisposeListener(this); - terminal.getControl().addMouseListener(this); - } - - /** - * Returns the associated terminal view control. - * - * @return The terminal view control. - */ - protected final ITerminalViewControl getTerminal() { - return terminal; - } - - /* (non-Javadoc) - * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent) - */ - @Override - public void widgetDisposed(DisposeEvent e) { - // Widget got disposed, check if it is ours - // If a tab item gets disposed, we have to dispose the terminal as well - if (e.getSource().equals(terminal.getControl())) { - // Remove as listener - getTerminal().getControl().removeDisposeListener(this); - getTerminal().getControl().removeMouseListener(this); - } - } - - /* (non-Javadoc) - * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent) - */ - @Override - public void mouseDown(MouseEvent e) { - // Left button down -> select mode starts - if (e.button == 1) selectMode = true; - } - - /* (non-Javadoc) - * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent) - */ - @Override - public void mouseUp(MouseEvent e) { - if (e.button == 1 && selectMode) { - selectMode = false; - // Fire a selection changed event with the terminal controls selection - try { - Display display = PlatformUI.getWorkbench().getDisplay(); - display.asyncExec(new Runnable() { - @Override - public void run() { - fireSelectionChanged(new StructuredSelection(getTerminal().getSelection())); - } - }); - } - catch (Exception ex) { - // if display is disposed, silently ignore. - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent) - */ - @Override - public void mouseDoubleClick(MouseEvent e) { - } - } - - /** - * Constructor. - * - * @param parentView The parent terminals console view. Must not be null. - */ - public TabFolderManager(ITerminalsView parentView) { - super(); - Assert.isNotNull(parentView); - this.parentView = parentView; - - // Attach a selection listener to the tab folder - selectionListener = doCreateTabFolderSelectionListener(this); - if (getTabFolder() != null) getTabFolder().addSelectionListener(selectionListener); - } - - /** - * Creates the terminal console tab folder selection listener instance. - * - * @param parent The parent terminal console tab folder manager. Must not be null. - * @return The selection listener instance. - */ - protected TabFolderSelectionListener doCreateTabFolderSelectionListener(TabFolderManager parent) { - Assert.isNotNull(parent); - return new TabFolderSelectionListener(parent); - } - - /** - * Returns the parent terminal consoles view. - * - * @return The terminal consoles view instance. - */ - protected final ITerminalsView getParentView() { - return parentView; - } - - /** - * Returns the tab folder associated with the parent view. - * - * @return The tab folder or null. - */ - @SuppressWarnings("cast") - protected final CTabFolder getTabFolder() { - return (CTabFolder) getParentView().getAdapter(CTabFolder.class); - } - - /** - * Returns the selection changed listeners currently registered. - * - * @return The registered selection changed listeners or an empty array. - */ - protected final ISelectionChangedListener[] getSelectionChangedListeners() { - return selectionChangedListeners.toArray(new ISelectionChangedListener[selectionChangedListeners.size()]); - } - - /** - * Dispose the tab folder manager instance. - */ - public void dispose() { - // Dispose the selection listener - if (getTabFolder() != null && !getTabFolder().isDisposed()) getTabFolder().removeSelectionListener(selectionListener); - // Dispose the tab command field handler - for (TabCommandFieldHandler handler : commandFieldHandler.values()) { - handler.dispose(); - } - commandFieldHandler.clear(); - } - - /** - * Creates a new tab item with the given title and connector. - * - * @param title The tab title. Must not be null. - * @param encoding The terminal encoding or null. - * @param connector The terminal connector. Must not be null. - * @param data The custom terminal data node or null. - * @param flags The flags controlling how the console is opened or null to use defaults. - * - * @return The created tab item or null if failed. - */ - @SuppressWarnings({ "unused", "cast" }) - public CTabItem createTabItem(String title, String encoding, ITerminalConnector connector, Object data, Map flags) { - Assert.isNotNull(title); - Assert.isNotNull(connector); - - // The result tab item - CTabItem item = null; - - // Get the tab folder from the parent viewer - CTabFolder tabFolder = getTabFolder(); - if (tabFolder != null) { - // Generate a unique title string for the new tab item (must be called before creating the item itself) - title = makeUniqueTitle(title, tabFolder); - // Create the tab item - item = new CTabItem(tabFolder, SWT.CLOSE); - // Set the tab item title - item.setText(title); - // Set the tab icon - Image image = getTabItemImage(connector, data); - if (image != null) item.setImage(image); - - // Setup the tab item listeners - setupTerminalTabListeners(item); - - // Create the composite to create the terminal control within - Composite composite = new Composite(tabFolder, SWT.NONE); - composite.setLayout(new FillLayout()); - // Associate the composite with the tab item - item.setControl(composite); - - // Refresh the layout - tabFolder.getParent().layout(true); - - // Create the terminal control - ITerminalViewControl terminal = TerminalViewControlFactory.makeControl(doCreateTerminalTabTerminalListener(this, item), composite, new ITerminalConnector[] { connector }, true); - if (terminal instanceof ITerminalControl) { - Object value = flags != null ? flags.get(ITerminalsConnectorConstants.PROP_DATA_NO_RECONNECT) : null; - boolean noReconnect = value instanceof Boolean ? ((Boolean)value).booleanValue() : false; - ((ITerminalControl)terminal).setConnectOnEnterIfClosed(!noReconnect); - } - - // Add middle mouse button paste support - addMiddleMouseButtonPasteSupport(terminal); - // Add the "selection" listener to the terminal control - new TerminalControlSelectionListener(terminal); - // Configure the terminal encoding - try { terminal.setEncoding(encoding); } catch (UnsupportedEncodingException e) { /* ignored on purpose */ } - // Associated the terminal with the tab item - item.setData(terminal); - // Associated the custom data node with the tab item (if any) - if (data != null) item.setData("customData", data); //$NON-NLS-1$ - - // Overwrite the text canvas help id - String contextHelpId = getParentView().getContextHelpId(); - if (contextHelpId != null) { - PlatformUI.getWorkbench().getHelpSystem().setHelp(terminal.getControl(), contextHelpId); - } - - // Set the context menu - TabFolderMenuHandler menuHandler = (TabFolderMenuHandler) getParentView().getAdapter(TabFolderMenuHandler.class); - if (menuHandler != null) { - Menu menu = (Menu)menuHandler.getAdapter(Menu.class); - if (menu != null) { - // One weird occurrence of IllegalArgumentException: Widget has wrong parent. - // Inspecting the code, this seem extremely unlikely. The terminal is created - // from a composite parent, the composite parent from the tab folder and the menu - // from the tab folder. Means, at the end all should have the same menu shell, shouldn't they? - try { - terminal.getControl().setMenu(menu); - } catch (IllegalArgumentException e) { - // Log exception only if debug mode is set to 1. - if (UIPlugin.getTraceHandler().isSlotEnabled(1, null)) { - e.printStackTrace(); - } - } - } - } - - // Select the created item within the tab folder - tabFolder.setSelection(item); - - // Set the connector - terminal.setConnector(connector); - - // And connect the terminal - terminal.connectTerminal(); - - // Fire selection changed event - fireSelectionChanged(); - } - - // Return the create tab item finally. - return item; - } - - /** - * Used for DnD of terminal tab items between terminal views - *

              - * Create a new tab item in the "dropped" terminal view using the - * information stored in the given item. - * - * @param oldItem The old dragged tab item. Must not be null. - * @return The new dropped tab item. - */ - @SuppressWarnings({ "unchecked", "cast" }) - public CTabItem cloneTabItemAfterDrop(CTabItem oldItem) { - Assert.isNotNull(oldItem); - - ITerminalViewControl terminal = (ITerminalViewControl)oldItem.getData(); - ITerminalConnector connector = terminal.getTerminalConnector(); - Object data = oldItem.getData("customData"); //$NON-NLS-1$ - Map properties = (Map)oldItem.getData("properties"); //$NON-NLS-1$ - String title = oldItem.getText(); - - // The result tab item - CTabItem item = null; - - // Get the tab folder from the parent viewer - CTabFolder tabFolder = getTabFolder(); - if (tabFolder != null) { - // Generate a unique title string for the new tab item (must be called before creating the item itself) - title = makeUniqueTitle(title, tabFolder); - // Create the tab item - item = new CTabItem(tabFolder, SWT.CLOSE); - // Set the tab item title - item.setText(title); - // Set the tab icon - Image image = getTabItemImage(connector, data); - if (image != null) item.setImage(image); - - // Setup the tab item listeners - setupTerminalTabListeners(item); - // Move the terminal listener to the new item - TabTerminalListener.move(oldItem, item); - - // Create the composite to create the terminal control within - Composite composite = new Composite(tabFolder, SWT.NONE); - composite.setLayout(new FillLayout()); - // Associate the composite with the tab item - item.setControl(composite); - - // Refresh the layout - tabFolder.getParent().layout(true); - - // Remember terminal state - TerminalState oldState = terminal.getState(); - - // Keep the context menu from being disposed - terminal.getControl().setMenu(null); - - // change the "parent". - Assert.isTrue(terminal instanceof ITerminalControl); - ((ITerminalControl)terminal).setupTerminal(composite); - - // Add middle mouse button paste support - addMiddleMouseButtonPasteSupport(terminal); - - item.setData(terminal); - - // Associate the custom data node with the tab item (if any) - if (data != null) item.setData("customData", data); //$NON-NLS-1$ - // Associate the properties with the tab item (if any) - if (properties != null) item.setData("properties", properties); //$NON-NLS-1$ - - // Overwrite the text canvas help id - String contextHelpId = getParentView().getContextHelpId(); - if (contextHelpId != null) { - PlatformUI.getWorkbench().getHelpSystem().setHelp(terminal.getControl(), contextHelpId); - } - - // Set the context menu - TabFolderMenuHandler menuHandler = (TabFolderMenuHandler) getParentView().getAdapter(TabFolderMenuHandler.class); - if (menuHandler != null) { - Menu menu = (Menu)menuHandler.getAdapter(Menu.class); - if (menu != null) { - // One weird occurrence of IllegalArgumentException: Widget has wrong parent. - // Inspecting the code, this seem extremely unlikely. The terminal is created - // from a composite parent, the composite parent from the tab folder and the menu - // from the tab folder. Means, at the end all should have the same menu shell, shouldn't they? - try { - terminal.getControl().setMenu(menu); - } catch (IllegalArgumentException e) { - // Log exception only if debug mode is set to 1. - if (UIPlugin.getTraceHandler().isSlotEnabled(1, null)) { - e.printStackTrace(); - } - } - } - } - - // Select the created item within the tab folder - tabFolder.setSelection(item); - - // Set the connector - terminal.setConnector(connector); - - // needed to get the focus and cursor - Assert.isTrue(terminal instanceof ITerminalControl); - ((ITerminalControl)terminal).setState(oldState); - - // Fire selection changed event - fireSelectionChanged(); - } - - // Return the create tab item finally. - return item; - } - - - protected void addMiddleMouseButtonPasteSupport(final ITerminalViewControl terminal) { - terminal.getControl().addMouseListener(new MouseAdapter(){ - @Override - public void mouseDown(MouseEvent e) { - // paste when the middle button is clicked - if (e.button == 2) { - Clipboard clipboard = terminal.getClipboard(); - if (clipboard.isDisposed()) return; - int clipboardType = DND.SELECTION_CLIPBOARD; - if (clipboard.getAvailableTypes(clipboardType).length == 0) - // use normal clipboard if selection clipboard is not available - clipboardType = DND.CLIPBOARD; - String text = (String) clipboard.getContents(TextTransfer.getInstance(), clipboardType); - if (text != null && text.length() > 0) - terminal.pasteString(text); - } - } - }); - } - - /** - * Generate a unique title string based on the given proposal. - * - * @param proposal The proposal. Must not be null. - * @return The unique title string. - */ - protected String makeUniqueTitle(String proposal, CTabFolder tabFolder) { - Assert.isNotNull(proposal); - Assert.isNotNull(tabFolder); - - String title = proposal; - int index = 0; - - // Loop all existing tab items and check the titles. We have to remember - // all found titles as modifying the proposal might in turn conflict again - // with the title of a tab already checked. - List titles = new ArrayList(); - for (CTabItem item : tabFolder.getItems()) { - // Get the tab item title - titles.add(item.getText()); - } - // Make the proposal unique be appending () against all known titles. - while (titles.contains(title)) title = proposal + " (" + ++index + ")"; //$NON-NLS-1$ //$NON-NLS-2$ - - return title; - } - - /** - * Setup the terminal console tab item listeners. - * - * @param item The tab item. Must not be null. - */ - protected void setupTerminalTabListeners(final CTabItem item) { - Assert.isNotNull(item); - - // Create and associate the disposal listener - DisposeListener disposeListener = doCreateTerminalTabDisposeListener(this); - - // store the listener to make access easier e.g. needed in DnD - item.setData("disposeListener", disposeListener); //$NON-NLS-1$ - item.addDisposeListener(disposeListener); - } - - /** - * Creates a new terminal console tab terminal listener instance. - * - * @param tabFolderManager The tab folder manager. Must not be null. - * @param item The tab item. Must not be null. - * - * @return The terminal listener instance. - */ - protected ITerminalListener doCreateTerminalTabTerminalListener(TabFolderManager tabFolderManager, CTabItem item) { - Assert.isNotNull(item); - return new TabTerminalListener(tabFolderManager, item); - } - - /** - * Creates a new terminal console tab dispose listener instance. - * - * @param parent The parent terminal console tab folder manager. Must not be null. - * @return The dispose listener instance. - */ - protected DisposeListener doCreateTerminalTabDisposeListener(TabFolderManager parent) { - Assert.isNotNull(parent); - return new TabDisposeListener(parent); - } - - /** - * Returns the tab item image. - * - * @param connector The terminal connector. Must not be null. - * @param data The custom terminal data node or null. - * - * @return The tab item image or null. - */ - protected Image getTabItemImage(ITerminalConnector connector, Object data) { - Assert.isNotNull(connector); - return UIPlugin.getImage(ImageConsts.VIEW_Terminals); - } - - /** - * Lookup a tab item with the given title and the given terminal connector. - *

              - * Note: The method will handle unified tab item titles itself. - * - * @param title The tab item title. Must not be null. - * @param connector The terminal connector. Must not be null. - * @param data The custom terminal data node or null. - * - * @return The corresponding tab item or null. - */ - public CTabItem findTabItem(String title, ITerminalConnector connector, Object data) { - Assert.isNotNull(title); - Assert.isNotNull(connector); - - // Get the tab folder - CTabFolder tabFolder = getTabFolder(); - if (tabFolder == null) return null; - - // Loop all existing tab items and try to find a matching title - for (CTabItem item : tabFolder.getItems()) { - // Disposed items cannot be matched - if (item.isDisposed()) continue; - // Get the title from the current tab item - String itemTitle = item.getText(); - // The terminal console state might be signaled to the user via the - // terminal console tab title. Filter out any prefix "<.*>\s*". - itemTitle = itemTitle.replaceFirst("^<.*>\\s*", ""); //$NON-NLS-1$ //$NON-NLS-2$ - if (itemTitle.startsWith(title)) { - // The title string matches -> double check with the terminal connector - ITerminalViewControl terminal = (ITerminalViewControl)item.getData(); - ITerminalConnector connector2 = terminal.getTerminalConnector(); - // If the connector id and name matches -> check on the settings - if (connector.getId().equals(connector2.getId()) && connector.getName().equals(connector2.getName())) { - if (!connector.isInitialized()) { - // an uninitialized connector does not yield a sensible summary - return item; - } - String summary = connector.getSettingsSummary(); - String summary2 = connector2.getSettingsSummary(); - // If we have matching settings -> we've found the matching item - if (summary.equals(summary2)) return item; - } - } - } - - return null; - } - - /** - * Make the given tab item the active tab and bring the tab to the top. - * - * @param item The tab item. Must not be null. - */ - public void bringToTop(CTabItem item) { - Assert.isNotNull(item); - - // Get the tab folder - CTabFolder tabFolder = getTabFolder(); - if (tabFolder == null) return; - - // Set the given tab item as selection to the tab folder - tabFolder.setSelection(item); - // Fire selection changed event - fireSelectionChanged(); - } - - /** - * Returns the currently active tab. - * - * @return The active tab item or null if none. - */ - public CTabItem getActiveTabItem() { - // Get the tab folder - CTabFolder tabFolder = getTabFolder(); - if (tabFolder == null) return null; - - return tabFolder.getSelection(); - } - - /** - * Remove all terminated tab items. - */ - public void removeTerminatedItems() { - // Get the tab folder - CTabFolder tabFolder = getTabFolder(); - if (tabFolder == null) return; - - // Loop the items and check for terminated status - for (CTabItem item: tabFolder.getItems()) { - // Disposed items cannot be matched - if (item.isDisposed()) continue; - // Check if the item is terminated - if (isTerminatedTabItem(item)) { - // item is terminated -> dispose - item.dispose(); - } - } - } - - /** - * Checks if the given tab item represents a terminated console. Subclasses may - * overwrite this method to extend the definition of terminated. - * - * @param item The tab item or null. - * @return True if the tab item represents a terminated console, false otherwise. - */ - protected boolean isTerminatedTabItem(CTabItem item) { - // Null items or disposed items cannot be matched - if (item == null || item.isDisposed()) return false; - - // First, match the item title. If it contains "", the item can be removed - String itemTitle = item.getText(); - if (itemTitle != null && itemTitle.contains("")) { //$NON-NLS-1$ - return true; - } - // Second, check if the associated terminal control is closed - // The title string matches -> double check with the terminal connector - ITerminalViewControl terminal = (ITerminalViewControl)item.getData(); - if (terminal != null && terminal.getState() == TerminalState.CLOSED) { - return true; - } - - return false; - } - - /** - * Returns the command input field handler for the given tab item. - * - * @param item The tab item or null. - * @return The command input field handler or null. - */ - public final TabCommandFieldHandler getTabCommandFieldHandler(CTabItem item) { - // Null items or disposed items cannot be matched - if (item == null || item.isDisposed()) return null; - - TabCommandFieldHandler handler = commandFieldHandler.get(item); - if (handler == null) { - handler = createTabCommandFieldHandler(this, item); - Assert.isNotNull(handler); - commandFieldHandler.put(item, handler); - } - return handler; - } - - /** - * Create the command input field handler for the given tab item. - * - * @param tabFolderManager The parent tab folder manager. Must not be null - * @param item The associated tab item. Must not be null. - * - * @return The command input field handler. Must not be null. - * - * @since 4.1 - */ - protected TabCommandFieldHandler createTabCommandFieldHandler(TabFolderManager tabFolderManager, CTabItem item) { - return new TabCommandFieldHandler(tabFolderManager, item); - } - - /** - * Dispose the command input field handler for the given tab item. - * - * @param item The tab item or null. - */ - protected void disposeTabCommandFieldHandler(CTabItem item) { - // Null items or disposed items cannot be matched - if (item == null || item.isDisposed()) return; - - TabCommandFieldHandler handler = commandFieldHandler.remove(item); - if (handler != null) handler.dispose(); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) - */ - @Override - public void addSelectionChangedListener(ISelectionChangedListener listener) { - if (listener != null && !selectionChangedListeners.contains(listener)) selectionChangedListeners.add(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) - */ - @Override - public void removeSelectionChangedListener(ISelectionChangedListener listener) { - if (listener != null) selectionChangedListeners.remove(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection() - */ - @Override - public ISelection getSelection() { - CTabItem activeTabItem = getActiveTabItem(); - return activeTabItem != null ? new StructuredSelection(activeTabItem) : new StructuredSelection(); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection) - */ - @Override - public void setSelection(ISelection selection) { - if (selection instanceof IStructuredSelection && !selection.isEmpty()) { - // The first selection element which is a CTabItem will become the active item - Iterator iterator = ((IStructuredSelection)selection).iterator(); - while (iterator.hasNext()) { - Object candidate = iterator.next(); - if (candidate instanceof CTabItem) { bringToTop((CTabItem)candidate); return; } - } - } - // fire a changed event in any case - fireSelectionChanged(selection); - } - - /** - * Fire the selection changed event to the registered listeners. - */ - protected void fireSelectionChanged() { - updateStatusLine(); - fireSelectionChanged(getSelection()); - } - - /** - * Fire the selection changed event with the terminal text! - * to the registered listeners. - * see also TerminalControlSelectionListener- mouseUp - * - * @since 4.1 - */ - protected void fireTerminalSelectionChanged() { - updateStatusLine(); - CTabItem item = getActiveTabItem(); - if (item != null && !item.isDisposed()) { - ITerminalViewControl terminal = (ITerminalViewControl)item.getData(); - if (terminal != null && !terminal.isDisposed()) { - fireSelectionChanged(new StructuredSelection(terminal.getSelection())); - } - } - } - - /** - * Fire the selection changed event to the registered listeners. - */ - protected final void fireSelectionChanged(ISelection selection) { - // Create the selection changed event - SelectionChangedEvent event = new SelectionChangedEvent(TabFolderManager.this, selection); - - // First, invoke the registered listeners and let them do their job - for (ISelectionChangedListener listener : selectionChangedListeners) { - listener.selectionChanged(event); - } - } - - /** - * Update the parent view status line. - */ - public final void updateStatusLine() { - String message = null; - IStatusLineManager manager = parentView.getViewSite().getActionBars().getStatusLineManager(); - - CTabItem item = getActiveTabItem(); - if (item != null && !item.isDisposed()) { - ITerminalViewControl terminal = (ITerminalViewControl)item.getData(); - if (terminal != null && !terminal.isDisposed()) { - StringBuilder buffer = new StringBuilder(); - - buffer.append(state2msg(item, terminal.getState())); - buffer.append(" - "); //$NON-NLS-1$ - - String encoding = terminal.getEncoding(); - if (encoding == null || "ISO-8859-1".equals(encoding)) { //$NON-NLS-1$ - encoding = "Default (ISO-8859-1)"; //$NON-NLS-1$ - } - buffer.append(NLS.bind(Messages.TabFolderManager_encoding, encoding)); - - message = buffer.toString(); - } - } - - manager.setMessage(message); - } - - /** - * Returns the string representation of the given terminal state. - * - * @param item The tab folder item. Must not be null. - * @param state The terminal state. Must not be null. - * - * @return The string representation. - */ - @SuppressWarnings("unchecked") - protected String state2msg(CTabItem item, TerminalState state) { - Assert.isNotNull(item); - Assert.isNotNull(state); - - // Determine the terminal properties of the tab folder - Map properties = (Map)item.getData("properties"); //$NON-NLS-1$ - - // Get he current terminal state as string - String stateStr = state.toString(); - // Lookup a matching text representation of the state - String key = "TabFolderManager_state_" + stateStr.replaceAll("\\.", " ").trim().toLowerCase(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - String stateMsg = null; - if (properties != null) stateMsg = properties.get(key) instanceof String ? (String) properties.get(key) : null; - if (stateMsg == null) stateMsg = Messages.getString(key); - if (stateMsg == null) stateMsg = stateStr; - - return stateMsg; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderMenuHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderMenuHandler.java deleted file mode 100644 index 973594c..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderMenuHandler.java +++ /dev/null @@ -1,398 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.tabs; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.PlatformObject; -import org.eclipse.jface.action.IContributionItem; -import org.eclipse.jface.action.IMenuListener2; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.action.Separator; -import org.eclipse.swt.custom.CTabFolder; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.swt.dnd.DND; -import org.eclipse.swt.dnd.TextTransfer; -import org.eclipse.swt.dnd.Transfer; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction; -import org.eclipse.tm.internal.terminal.control.actions.TerminalActionClearAll; -import org.eclipse.tm.internal.terminal.control.actions.TerminalActionCopy; -import org.eclipse.tm.internal.terminal.control.actions.TerminalActionPaste; -import org.eclipse.tm.internal.terminal.control.actions.TerminalActionSelectAll; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.actions.SelectEncodingAction; -import org.eclipse.tm.terminal.view.ui.interfaces.ITerminalsView; -import org.eclipse.ui.IWorkbenchActionConstants; - -/** - * Terminal tab folder menu handler. - */ -public class TabFolderMenuHandler extends PlatformObject { - // Reference to the parent terminals console view - private final ITerminalsView parentView; - // Reference to the tab folder context menu manager - private MenuManager contextMenuManager; - // Reference to the tab folder context menu - private Menu contextMenu; - // The list of actions available within the context menu - private final List contextMenuActions = new ArrayList(); - - // The list of invalid context menu contributions "startsWith" expressions - /* default */ static final String[] INVALID_CONTRIBUTIONS_STARTS_WITH = { - "org.eclipse.cdt", "org.eclipse.ui.edit" //$NON-NLS-1$ //$NON-NLS-2$ - }; - - /** - * Default menu listener implementation. - */ - protected class MenuListener implements IMenuListener2 { - - /* (non-Javadoc) - * @see org.eclipse.jface.action.IMenuListener2#menuAboutToHide(org.eclipse.jface.action.IMenuManager) - */ - @Override - public void menuAboutToHide(IMenuManager manager) { - // CQ:WIND00192293 and CQ:WIND194204 - don't update actions on menuAboutToHide - // See also http://bugs.eclipse.org/296212 - // updateMenuItems(false); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface.action.IMenuManager) - */ - @Override - public void menuAboutToShow(IMenuManager manager) { - removeInvalidContributions(manager); - updateMenuItems(true); - } - - /** - * Bug 392249: Remove contributions that appear in the context in Eclipse 4.x which are - * not visible in Eclipse 3.8.x. Re-evaluate from time to time! - * - * @param manager The menu manager or null - */ - private void removeInvalidContributions(IMenuManager manager) { - if (manager == null) return; - - IContributionItem[] items = manager.getItems(); - for (IContributionItem item : items) { - String id = item.getId(); - if (id != null) { - for (String prefix : INVALID_CONTRIBUTIONS_STARTS_WITH) { - if (id.startsWith(prefix)) { - manager.remove(item); - break; - } - } - } - } - } - } - - /** - * Constructor. - * - * @param parentView The parent terminals console view. Must not be null. - */ - public TabFolderMenuHandler(ITerminalsView parentView) { - super(); - Assert.isNotNull(parentView); - this.parentView = parentView; - } - - /** - * Returns the parent terminals console view. - * - * @return The parent terminals console view instance. - */ - protected final ITerminalsView getParentView() { - return parentView; - } - - /** - * Returns the tab folder associated with the parent view. - * - * @return The tab folder or null. - */ - @SuppressWarnings("cast") - protected final CTabFolder getTabFolder() { - return (CTabFolder) getParentView().getAdapter(CTabFolder.class); - } - - /** - * Dispose the tab folder menu handler instance. - */ - public void dispose() { - // Dispose the context menu - if (contextMenu != null) { contextMenu.dispose(); contextMenu = null; } - // Dispose the context menu manager - if (contextMenuManager != null) { contextMenuManager.dispose(); contextMenuManager = null; } - // Clear all actions - contextMenuActions.clear(); - } - - /** - * Setup the context menu for the tab folder. The method will return - * immediately if the menu handler had been initialized before. - * - * @param tabFolder The tab folder control. Must not be null. - */ - public void initialize() { - // Return immediately if the menu manager and menu got initialized already - if (contextMenuManager != null && contextMenu != null) { - return; - } - - // Get the tab folder - CTabFolder tabFolder = getTabFolder(); - if (tabFolder == null) { - return; - } - - // Create the menu manager if not done before - contextMenuManager = new MenuManager("#PopupMenu"); //$NON-NLS-1$ - - // Bug 392249: Register our menu listener after registering the context menu - // for contributions. That way we can use our menu listener to get - // rid of unwanted/misguided contributions. At least until this is - // fixed in the Eclipse 4.x platform. - - // Create the context menu - contextMenu = contextMenuManager.createContextMenu(tabFolder); - // Temporarily set the menu on the tab folder to avoid the case - // where the menu has a different parent shell than the control. - // This can be the case if the tab folder is re-parented to the - // "PartRenderingEngine's limbo". - tabFolder.setMenu(contextMenu); - - // Create the context menu action instances - doCreateContextMenuActions(); - - // Fill the context menu - doFillContextMenu(contextMenuManager); - - // Register to the view site to open the menu for contributions - getParentView().getSite().registerContextMenu(contextMenuManager, getParentView().getSite().getSelectionProvider()); - - // Create and associated the menu listener - contextMenuManager.addMenuListener(new MenuListener()); - } - - /** - * Adds the given action to the context menu actions list. - * - * @param action The action instance. Must not be null. - */ - protected final void add(AbstractTerminalAction action) { - Assert.isNotNull(action); - contextMenuActions.add(action); - } - - /** - * Create the context menu actions. - */ - @SuppressWarnings("cast") - protected void doCreateContextMenuActions() { - // Create and add the copy action - add(new TerminalActionCopy() { - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#getTarget() - */ - @Override - protected ITerminalViewControl getTarget() { - return getActiveTerminalViewControl(); - } - }); - - // Create and add the paste action - add(new TerminalActionPaste() { - @SuppressWarnings({ "unchecked" }) - @Override - public void run() { - // Determine if pasting to the active tab require backslash translation - boolean needsTranslation = false; - - TabFolderManager manager = (TabFolderManager) getParentView().getAdapter(TabFolderManager.class); - if (manager != null) { - // If we have the active tab item, we can get the active terminal control - CTabItem activeTabItem = manager.getActiveTabItem(); - if (activeTabItem != null) { - Map properties = (Map)activeTabItem.getData("properties"); //$NON-NLS-1$ - if (properties != null && properties.containsKey(ITerminalsConnectorConstants.PROP_TRANSLATE_BACKSLASHES_ON_PASTE)) { - Object value = properties.get(ITerminalsConnectorConstants.PROP_TRANSLATE_BACKSLASHES_ON_PASTE); - needsTranslation = value instanceof Boolean ? ((Boolean)value).booleanValue() : false; - } - } - } - - if (needsTranslation) { - ITerminalViewControl target = getTarget(); - if (target != null && target.getClipboard() != null && !target.getClipboard().isDisposed()) { - String text = (String) target.getClipboard().getContents(TextTransfer.getInstance()); - if (text != null) { - text = text.replace('\\', '/'); - - Object[] data = new Object[] { text }; - Transfer[] types = new Transfer[] { TextTransfer.getInstance() }; - target.getClipboard().setContents(data, types, DND.CLIPBOARD); - } - } - } - - super.run(); - } - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#getTarget() - */ - @Override - protected ITerminalViewControl getTarget() { - return getActiveTerminalViewControl(); - } - }); - - // Create and add the clear all action - add(new TerminalActionClearAll() { - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#getTarget() - */ - @Override - protected ITerminalViewControl getTarget() { - return getActiveTerminalViewControl(); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.TerminalActionPaste#updateAction(boolean) - */ - @Override - public void updateAction(boolean aboutToShow) { - super.updateAction(aboutToShow); - if (getTarget() != null && getTarget().getState() != TerminalState.CONNECTED) { - setEnabled(false); - } - } - }); - - // Create and add the select all action - add(new TerminalActionSelectAll() { - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#getTarget() - */ - @Override - protected ITerminalViewControl getTarget() { - return getActiveTerminalViewControl(); - } - }); - - // Create and add the select encoding action - add (new SelectEncodingAction((TabFolderManager) getParentView().getAdapter(TabFolderManager.class)) { - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#getTarget() - */ - @Override - protected ITerminalViewControl getTarget() { - return getActiveTerminalViewControl(); - } - }); - } - - /** - * Returns the currently active terminal control. - * - * @return The currently active terminal control or null. - */ - @SuppressWarnings("cast") - protected ITerminalViewControl getActiveTerminalViewControl() { - ITerminalViewControl terminal = null; - - // Get the active tab item from the tab folder manager - TabFolderManager manager = (TabFolderManager) getParentView().getAdapter(TabFolderManager.class); - if (manager != null) { - // If we have the active tab item, we can get the active terminal control - CTabItem activeTabItem = manager.getActiveTabItem(); - if (activeTabItem != null) { - terminal = (ITerminalViewControl)activeTabItem.getData(); - } - } - - return terminal; - } - - /** - * Fill in the context menu content within the given manager. - * - * @param manager The menu manager. Must not be null. - */ - protected void doFillContextMenu(MenuManager manager) { - Assert.isNotNull(manager); - - // Loop all actions and add them to the menu manager - for (AbstractTerminalAction action : contextMenuActions) { - manager.add(action); - // Add a separator after the paste action - if (action instanceof TerminalActionPaste) { - manager.add(new Separator()); - } - // Add a separator after the select all action - if (action instanceof TerminalActionSelectAll) { - manager.add(new Separator()); - } - } - - // Menu contributions will end up here - manager.add(new Separator()); - manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); - } - - /** - * Update the context menu items on showing or hiding the context menu. - * - * @param aboutToShow True if the menu is about to show, false otherwise. - */ - protected void updateMenuItems(boolean aboutToShow) { - // Loop all actions and update the status - for (AbstractTerminalAction action : contextMenuActions) { - action.updateAction(aboutToShow); - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(java.lang.Class) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public Object getAdapter(Class adapter) { - if (MenuManager.class.isAssignableFrom(adapter)) { - return contextMenuManager; - } else if (Menu.class.isAssignableFrom(adapter)) { - if (contextMenu == null || contextMenu.isDisposed()) { - contextMenu = contextMenuManager.createContextMenu(getTabFolder()); - } - // Clear the menu from the tab folder now - see initialize() - getTabFolder().setMenu(null); - return contextMenu; - } - - // Try the parent view - Object adapted = getParentView().getAdapter(adapter); - if (adapted != null) { - return adapted; - } - - return super.getAdapter(adapter); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderSelectionListener.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderSelectionListener.java deleted file mode 100644 index 54ba5d9..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderSelectionListener.java +++ /dev/null @@ -1,55 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.tabs; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; - -/** - * Terminal tab folder default selection listener implementation. - */ -public class TabFolderSelectionListener implements SelectionListener { - private final TabFolderManager parentTabFolderManager; - - /** - * Constructor. - * - * @param parentTabFolderManager The parent tab folder manager. Must not be null - */ - public TabFolderSelectionListener(TabFolderManager parentTabFolderManager) { - Assert.isNotNull(parentTabFolderManager); - this.parentTabFolderManager = parentTabFolderManager; - } - - /** - * Returns the parent terminal console tab folder manager instance. - * - * @return The parent terminal console tab folder manager instance. - */ - protected final TabFolderManager getParentTabFolderManager() { - return parentTabFolderManager; - } - - /* (non-Javadoc) - * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent) - */ - @Override - public void widgetDefaultSelected(SelectionEvent e) { - } - - /* (non-Javadoc) - * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent) - */ - @Override - public void widgetSelected(SelectionEvent e) { - parentTabFolderManager.fireSelectionChanged(); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderToolbarHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderToolbarHandler.java deleted file mode 100644 index 9a972cc..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabFolderToolbarHandler.java +++ /dev/null @@ -1,373 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Max Weninger (Wind River) - [361363] [TERMINALS] Implement "Pin&Clone" for the "Terminals" view - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.tabs; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.PlatformObject; -import org.eclipse.jface.action.IToolBarManager; -import org.eclipse.jface.action.Separator; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.swt.custom.CTabFolder; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction; -import org.eclipse.tm.internal.terminal.control.actions.TerminalActionClearAll; -import org.eclipse.tm.internal.terminal.control.actions.TerminalActionCopy; -import org.eclipse.tm.internal.terminal.control.actions.TerminalActionPaste; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.terminal.view.ui.actions.AbstractAction; -import org.eclipse.tm.terminal.view.ui.actions.NewTerminalViewAction; -import org.eclipse.tm.terminal.view.ui.actions.TabScrollLockAction; -import org.eclipse.tm.terminal.view.ui.actions.ToggleCommandFieldAction; -import org.eclipse.tm.terminal.view.ui.interfaces.ITerminalsView; -import org.eclipse.ui.IActionBars; -import org.eclipse.ui.IWorkbenchActionConstants; - - -/** - * Terminal tab folder toolbar handler. - */ -public class TabFolderToolbarHandler extends PlatformObject { - // Reference to the parent terminals console view - private final ITerminalsView parentView; - // Reference to the toolbar manager - private IToolBarManager toolbarManager; - // Reference to the selection listener - private ToolbarSelectionChangedListener selectionChangedListener; - // The list of actions available within the toolbar - private final List toolbarActions = new ArrayList(); - - /** - * Default selection listener implementation. - */ - protected class ToolbarSelectionChangedListener implements ISelectionChangedListener { - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) - */ - @Override - public void selectionChanged(SelectionChangedEvent event) { - boolean enable = event != null; - - // The VlmConsoleTabFolderManager is listening to the selection changes of the - // TabFolder and fires selection changed events. - if (enable && event.getSource() instanceof TabFolderManager) { - enable = event.getSelection() instanceof StructuredSelection - && !event.getSelection().isEmpty() - && (((StructuredSelection)event.getSelection()).getFirstElement() instanceof CTabItem - || ((StructuredSelection)event.getSelection()).getFirstElement() instanceof String); - } - - updateToolbarItems(enable); - } - } - - /** - * Constructor. - * - * @param parentView The parent terminals console view. Must not be null. - */ - public TabFolderToolbarHandler(ITerminalsView parentView) { - super(); - Assert.isNotNull(parentView); - this.parentView = parentView; - } - - /** - * Returns the parent terminals console view. - * - * @return The terminals console view instance. - */ - protected final ITerminalsView getParentView() { - return parentView; - } - - /** - * Returns the tab folder associated with the parent view. - * - * @return The tab folder or null. - */ - @SuppressWarnings("cast") - protected final CTabFolder getTabFolder() { - return (CTabFolder) getParentView().getAdapter(CTabFolder.class); - } - - /** - * Returns the currently active terminal control. - * - * @return The currently active terminal control or null. - */ - @SuppressWarnings("cast") - public ITerminalViewControl getActiveTerminalViewControl() { - ITerminalViewControl terminal = null; - - // Get the active tab item from the tab folder manager - TabFolderManager manager = (TabFolderManager) getParentView().getAdapter(TabFolderManager.class); - if (manager != null) { - // If we have the active tab item, we can get the active terminal control - CTabItem activeTabItem = manager.getActiveTabItem(); - if (activeTabItem != null && !activeTabItem.isDisposed()) { - terminal = (ITerminalViewControl)activeTabItem.getData(); - } - } - - return terminal; - } - - /** - * Dispose the tab folder menu handler instance. - */ - public void dispose() { - // Dispose the selection changed listener - if (selectionChangedListener != null) { - getParentView().getViewSite().getSelectionProvider().removeSelectionChangedListener(selectionChangedListener); - selectionChangedListener = null; - } - - // Clear all actions - toolbarActions.clear(); - } - - /** - * Setup the context menu for the tab folder. The method will return - * immediately if the toolbar handler had been initialized before. - * - * @param tabFolder The tab folder control. Must not be null. - */ - public void initialize() { - // Return immediately if the toolbar manager got initialized already - if (toolbarManager != null) { - return; - } - - // Register ourself as selection listener to the tab folder - selectionChangedListener = doCreateSelectionChangedListener(); - Assert.isNotNull(selectionChangedListener); - getParentView().getViewSite().getSelectionProvider().addSelectionChangedListener(selectionChangedListener); - - // Get the parent view action bars - IActionBars bars = getParentView().getViewSite().getActionBars(); - - // From the action bars, get the toolbar manager - toolbarManager = bars.getToolBarManager(); - - // Create the toolbar action instances - doCreateToolbarActions(); - - // Fill the toolbar - doFillToolbar(toolbarManager); - - // Update actions - updateToolbarItems(false); - } - - /** - * Creates a new selection changed listener instance. - * - * @return The new selection changed listener instance. - */ - protected ToolbarSelectionChangedListener doCreateSelectionChangedListener() { - return new ToolbarSelectionChangedListener(); - } - - /** - * Adds the given action to the toolbar actions list. - * - * @param action The action instance. Must not be null. - */ - protected final void add(AbstractTerminalAction action) { - Assert.isNotNull(action); - toolbarActions.add(action); - } - - /** - * Removes the given action from the toolbar actions list. - * - * @param action The action instance. Must not be null. - */ - protected final void remove(AbstractTerminalAction action) { - Assert.isNotNull(action); - toolbarActions.remove(action); - } - - /** - * Create the toolbar actions. - */ - protected void doCreateToolbarActions() { - // Create and add the paste action - add(new TerminalActionPaste() { - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#getTarget() - */ - @Override - protected ITerminalViewControl getTarget() { - return getActiveTerminalViewControl(); - } - }); - - // Create and add the copy action - add(new TerminalActionCopy() { - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#getTarget() - */ - @Override - protected ITerminalViewControl getTarget() { - return getActiveTerminalViewControl(); - } - }); - - // Create and add the scroll lock action - add (new TabScrollLockAction() { - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#getTarget() - */ - @Override - protected ITerminalViewControl getTarget() { - return getActiveTerminalViewControl(); - } - }); - - // Create and add the clear all action - add(new TerminalActionClearAll() { - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#getTarget() - */ - @Override - protected ITerminalViewControl getTarget() { - return getActiveTerminalViewControl(); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.TerminalActionPaste#updateAction(boolean) - */ - @Override - public void updateAction(boolean aboutToShow) { - super.updateAction(aboutToShow); - if (getTarget() != null && getTarget().getState() != TerminalState.CONNECTED) { - setEnabled(false); - } - } - }); - - // Create and add the toggle command input field action - add (new ToggleCommandFieldAction(getParentView()) { - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#getTarget() - */ - @Override - protected ITerminalViewControl getTarget() { - return getActiveTerminalViewControl(); - } - }); - - // Create and add the new terminal view action - add (new NewTerminalViewAction(getParentView()) { - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.actions.AbstractTerminalAction#getTarget() - */ - @Override - protected ITerminalViewControl getTarget() { - return getActiveTerminalViewControl(); - } - }); - } - - /** - * Fill in the context menu content within the given manager. - * - * @param manager The menu manager. Must not be null. - */ - protected void doFillToolbar(IToolBarManager manager) { - Assert.isNotNull(manager); - - // Note: For the toolbar, the actions are added from left to right! - // So we start with the additions marker here which is the most - // left contribution item. - manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); - manager.add(new Separator("anchor")); //$NON-NLS-1$ - - // we want that at the end - NewTerminalViewAction newTerminalAction = null; - - // Loop all actions and add them to the menu manager - for (AbstractTerminalAction action : toolbarActions) { - // Add a separator before the clear all action or if the action is a separator - if (action instanceof TabScrollLockAction - || (action instanceof AbstractAction && ((AbstractAction)action).isSeparator())) { - manager.insertAfter("anchor", new Separator()); //$NON-NLS-1$ - } - // skip new terminal view action for now - if (action instanceof NewTerminalViewAction){ - newTerminalAction = (NewTerminalViewAction)action; - continue; - } - // Add the action itself - manager.insertAfter("anchor", action); //$NON-NLS-1$ - } - // now add to the end - if (newTerminalAction != null){ - manager.add(newTerminalAction); - } - } - - /** - * Update the toolbar items. - * - * @param enabled True if the items shall be enabled, false otherwise. - */ - protected void updateToolbarItems(boolean enabled) { - // Determine the currently active terminal control - ITerminalViewControl control = getActiveTerminalViewControl(); - // Loop all actions and update the status - for (AbstractTerminalAction action : toolbarActions) { - // If the terminal control is not available, the updateAction - // method of certain actions enable the action (bugzilla #260372). - // Workaround by forcing the action to get disabled with setEnabled. - if (control == null && !(action instanceof NewTerminalViewAction)) { - action.setEnabled(false); - } - else { - action.updateAction(enabled); - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(java.lang.Class) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public Object getAdapter(Class adapter) { - if (IToolBarManager.class.isAssignableFrom(adapter)) { - return toolbarManager; - } - - // Try the toolbar actions - for (AbstractTerminalAction action : toolbarActions) { - if (adapter.isAssignableFrom(action.getClass())) { - return action; - } - } - - // Try the parent view - Object adapted = getParentView().getAdapter(adapter); - if (adapted != null) { - return adapted; - } - - return super.getAdapter(adapter); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabTerminalListener.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabTerminalListener.java deleted file mode 100644 index 2b711be..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/tabs/TabTerminalListener.java +++ /dev/null @@ -1,160 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.tabs; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.viewers.ISelectionProvider; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.swt.widgets.Display; -import org.eclipse.tm.internal.terminal.control.ITerminalListener2; -import org.eclipse.tm.internal.terminal.provisional.api.TerminalState; -import org.eclipse.tm.terminal.view.ui.nls.Messages; - -/** - * Terminal tab default terminal listener implementation. - */ -public class TabTerminalListener implements ITerminalListener2 { - private static final String TAB_TERMINAL_LISTENER = "TabTerminalListener"; //$NON-NLS-1$ - /* default */ final TabFolderManager tabFolderManager; - private CTabItem tabItem; - private final String tabItemTitle; - - /** - * Move a TabTerminalListener instance to another item (for DnD). - * - * @param fromItem item to detach the listener from - * @param toItem item to attach listener to - */ - static void move(CTabItem fromItem, CTabItem toItem) { - TabTerminalListener listener = (TabTerminalListener) fromItem.getData(TAB_TERMINAL_LISTENER); - if (listener != null) { - listener.attachTo(toItem); - } - } - - /** - * Constructor. - * - * @param tabFolderManager The parent tab folder manager. Must not be null. - * @param tabItem The parent tab item. Must not be null. - */ - public TabTerminalListener(TabFolderManager tabFolderManager, CTabItem tabItem) { - super(); - Assert.isNotNull(tabFolderManager); - Assert.isNotNull(tabItem); - this.tabFolderManager = tabFolderManager; - // Remember the original tab item title - tabItemTitle = tabItem.getText(); - - attachTo(tabItem); - } - - private void attachTo(CTabItem item) { - if (tabItem != null) tabItem.setData(TAB_TERMINAL_LISTENER, null); - item.setData(TAB_TERMINAL_LISTENER, this); - tabItem = item; - } - - /** - * Returns the associated parent tab item. - * - * @return The parent tab item. - */ - protected final CTabItem getTabItem() { - return tabItem; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.ITerminalListener#setState(org.eclipse.tm.internal.terminal.provisional.api.TerminalState) - */ - @Override - public void setState(final TerminalState state) { - // The tab item must have been not yet disposed - final CTabItem item = getTabItem(); - if (item == null || item.isDisposed()) return; - - // Run asynchronously in the display thread - item.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - // Update the tab item title - String newTitle = getTerminalConsoleTabTitle(state); - if (newTitle != null) item.setText(newTitle); - - // Turn off the command field (if necessary) - TabCommandFieldHandler handler = tabFolderManager.getTabCommandFieldHandler(item); - if (TerminalState.CLOSED.equals(state) && handler != null && handler.hasCommandInputField()) { - handler.setCommandInputField(false); - // Trigger a selection changed event to update the action enablements - // and the status line - ISelectionProvider provider = tabFolderManager.getParentView().getViewSite().getSelectionProvider(); - Assert.isNotNull(provider); - provider.setSelection(provider.getSelection()); - } else { - // Update the status line - tabFolderManager.updateStatusLine(); - } - } - }); - } - - /** - * Returns the title to set to the terminal console tab for the given state. - *

              - * Note: This method is called from {@link #setState(TerminalState)} and - * is expected to by called within the UI thread. - * - * @param state The terminal state. Must not be null. - * @return The terminal console tab title to set or null to leave the title unchanged. - */ - protected String getTerminalConsoleTabTitle(TerminalState state) { - Assert.isNotNull(state); - Assert.isNotNull(Display.findDisplay(Thread.currentThread())); - - // The tab item must have been not yet disposed - CTabItem item = getTabItem(); - if (item == null || item.isDisposed()) return null; - - // Get the current tab title - String oldTitle = item.getText(); - - // Construct the new title - String newTitle = null; - - if (TerminalState.CLOSED.equals(state)) { - newTitle = NLS.bind(Messages.TabTerminalListener_consoleClosed, tabItemTitle, tabFolderManager.state2msg(item, state)); - } - else if (TerminalState.CONNECTING.equals(state)) { - newTitle = NLS.bind(Messages.TabTerminalListener_consoleConnecting, tabItemTitle, tabFolderManager.state2msg(item, state)); - } - else if (TerminalState.CONNECTED.equals(state)) { - newTitle = tabItemTitle; - } - - return newTitle != null && !newTitle.equals(oldTitle) ? newTitle : null; - } - - /* (non-Javadoc) - * @see org.eclipse.tm.internal.terminal.control.ITerminalListener#setTerminalTitle(java.lang.String) - */ - @Override - public void setTerminalTitle(String title) { - } - - /** - * @see org.eclipse.tm.internal.terminal.control.ITerminalListener2#setTerminalSelectionChanged() - * @since 4.1 - */ - @Override - public void setTerminalSelectionChanged() { - tabFolderManager.fireTerminalSelectionChanged(); - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/OldTerminalsViewHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/OldTerminalsViewHandler.java deleted file mode 100644 index 3317a49..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/OldTerminalsViewHandler.java +++ /dev/null @@ -1,124 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.view; - -import org.eclipse.swt.widgets.Composite; -import org.eclipse.tm.terminal.view.ui.interfaces.IUIConstants; -import org.eclipse.ui.IPartListener2; -import org.eclipse.ui.IViewSite; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.IWorkbenchPartReference; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.part.ViewPart; - -/** - * Old terminals view handler implementation. - *

              - * If invoked, the view implementation opens the new terminals view and - * closes itself afterwards. - */ -public class OldTerminalsViewHandler extends ViewPart { - - boolean fReplaced; - IPartListener2 fPartlistener; - - /** - * Constructor. - */ - public OldTerminalsViewHandler() { - super(); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) - */ - @Override - public void createPartControl(Composite parent) { - replaceWithTerminalsView(); - } - - protected void replaceWithTerminalsView() { - if (fReplaced) - return; - IViewSite site = getViewSite(); - final IWorkbenchPage page = site.getPage(); - - site.getShell().getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - if (fReplaced) - return; - if (!page.isPageZoomed() || page.getActivePart() instanceof TerminalsView) { - fReplaced = true; - // Show the new view - try { - page.showView(IUIConstants.ID, null, IWorkbenchPage.VIEW_CREATE); - } - catch (PartInitException e) { /* ignored on purpose */ } - - // Hide ourself in the current perspective - page.hideView(OldTerminalsViewHandler.this); - } else if (fPartlistener == null) { - final IWorkbenchPart maximizedPart = page.getActivePart(); - page.addPartListener(fPartlistener = new IPartListener2() { - @Override - public void partVisible(IWorkbenchPartReference partRef) { - if (partRef.getPart(false) == OldTerminalsViewHandler.this) { - page.removePartListener(this); - fPartlistener = null; - replaceWithTerminalsView(); - } - } - @Override - public void partOpened(IWorkbenchPartReference partRef) { - } - @Override - public void partInputChanged(IWorkbenchPartReference partRef) { - } - @Override - public void partHidden(IWorkbenchPartReference partRef) { - } - @Override - public void partDeactivated(IWorkbenchPartReference partRef) { - } - @Override - public void partClosed(IWorkbenchPartReference partRef) { - if (partRef.getPart(false) == OldTerminalsViewHandler.this) { - page.removePartListener(this); - fPartlistener = null; - } else if (partRef.getPart(false) == maximizedPart) { - page.removePartListener(this); - fPartlistener = null; - replaceWithTerminalsView(); - } - } - @Override - public void partBroughtToTop(IWorkbenchPartReference partRef) { - } - @Override - public void partActivated(IWorkbenchPartReference partRef) { - } - }); - } - } - }); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#setFocus() - */ - @Override - public void setFocus() { - // should not happen, but just in case - replace on focus - replaceWithTerminalsView(); - } - -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/TerminalsView.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/TerminalsView.java deleted file mode 100644 index 9f12b26..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/TerminalsView.java +++ /dev/null @@ -1,778 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - * Max Weninger (Wind River) - [361363] [TERMINALS] Implement "Pin&Clone" for the "Terminals" view - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.view; - -import java.io.File; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - -import org.eclipse.core.commands.Command; -import org.eclipse.core.commands.ParameterizedCommand; -import org.eclipse.core.expressions.EvaluationContext; -import org.eclipse.core.expressions.IEvaluationContext; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CTabFolder; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.swt.dnd.ByteArrayTransfer; -import org.eclipse.swt.dnd.DND; -import org.eclipse.swt.dnd.DragSource; -import org.eclipse.swt.dnd.DragSourceEvent; -import org.eclipse.swt.dnd.DragSourceListener; -import org.eclipse.swt.dnd.DropTarget; -import org.eclipse.swt.dnd.DropTargetEvent; -import org.eclipse.swt.dnd.DropTargetListener; -import org.eclipse.swt.dnd.Transfer; -import org.eclipse.swt.dnd.TransferData; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; -import org.eclipse.tm.terminal.view.ui.interfaces.ITerminalsView; -import org.eclipse.tm.terminal.view.ui.nls.Messages; -import org.eclipse.tm.terminal.view.ui.tabs.TabFolderManager; -import org.eclipse.tm.terminal.view.ui.tabs.TabFolderMenuHandler; -import org.eclipse.tm.terminal.view.ui.tabs.TabFolderToolbarHandler; -import org.eclipse.tm.terminal.view.ui.view.showin.GitShowInContextHandler; -import org.eclipse.ui.IMemento; -import org.eclipse.ui.ISources; -import org.eclipse.ui.IViewSite; -import org.eclipse.ui.IWorkbenchPreferenceConstants; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.commands.ICommandService; -import org.eclipse.ui.handlers.IHandlerService; -import org.eclipse.ui.part.IShowInTarget; -import org.eclipse.ui.part.PageBook; -import org.eclipse.ui.part.ShowInContext; -import org.eclipse.ui.part.ViewPart; -import org.osgi.framework.Bundle; - -/** - * Terminal view. - */ -public class TerminalsView extends ViewPart implements ITerminalsView, IShowInTarget { - - // Reference to the main page book control - private PageBook pageBookControl; - // Reference to the tab folder maintaining the consoles - /* default */ CTabFolder tabFolderControl; - // Reference to the tab folder manager - /* default */ TabFolderManager tabFolderManager; - // Reference to the tab folder menu handler - private TabFolderMenuHandler tabFolderMenuHandler; - // Reference to the tab folder toolbar handler - private TabFolderToolbarHandler tabFolderToolbarHandler; - // Reference to the empty page control (to be show if no console is open) - private Control emptyPageControl; - // The view's memento handler - private final TerminalsViewMementoHandler mementoHandler = new TerminalsViewMementoHandler(); - - /** - * "dummy" transfer just to store the information needed for the DnD - * - */ - private static class TerminalTransfer extends ByteArrayTransfer { - // The static terminal transfer type name. Unique per terminals view instance. - private static final String TYPE_NAME = "terminal-transfer-format:" + UUID.randomUUID().toString(); //$NON-NLS-1$ - // Register the type name and remember the associated unique type id. - private static final int TYPEID = registerType(TYPE_NAME); - - private CTabItem draggedFolderItem; - private TabFolderManager draggedTabFolderManager; - - /* - * Thread save singleton instance creation. - */ - private static class LazyInstanceHolder { - public static TerminalTransfer instance = new TerminalTransfer(); - } - - /** - * Constructor. - */ - TerminalTransfer() { - } - - /** - * Returns the singleton terminal transfer instance. - * @return - */ - public static TerminalTransfer getInstance() { - return LazyInstanceHolder.instance; - } - - /** - * Sets the dragged folder item. - * - * @param tabFolderItem The dragged folder item or null. - */ - public void setDraggedFolderItem(CTabItem tabFolderItem) { - draggedFolderItem = tabFolderItem; - } - - /** - * Returns the dragged folder item. - * - * @return The dragged folder item or null. - */ - public CTabItem getDraggedFolderItem() { - return draggedFolderItem; - } - - /** - * Sets the tab folder manager the associated folder item is dragged from. - * - * @param tabFolderManager The tab folder manager or null. - */ - public void setTabFolderManager(TabFolderManager tabFolderManager) { - draggedTabFolderManager = tabFolderManager; - } - - /** - * Returns the tab folder manager the associated folder item is dragged from. - * - * @return The tab folder manager or null. - */ - public TabFolderManager getTabFolderManager() { - return draggedTabFolderManager; - } - - /* (non-Javadoc) - * @see org.eclipse.swt.dnd.Transfer#getTypeIds() - */ - @Override - protected int[] getTypeIds() { - return new int[] { TYPEID }; - } - - /* (non-Javadoc) - * @see org.eclipse.swt.dnd.Transfer#getTypeNames() - */ - @Override - protected String[] getTypeNames() { - return new String[] { TYPE_NAME }; - } - - /* (non-Javadoc) - * @see org.eclipse.swt.dnd.ByteArrayTransfer#javaToNative(java.lang.Object, org.eclipse.swt.dnd.TransferData) - */ - @Override - public void javaToNative(Object data, TransferData transferData) { - } - - /* (non-Javadoc) - * @see org.eclipse.swt.dnd.ByteArrayTransfer#nativeToJava(org.eclipse.swt.dnd.TransferData) - */ - @Override - public Object nativeToJava(TransferData transferData) { - return null; - } - } - - /** - * Constructor. - */ - public TerminalsView() { - super(); - } - - /** - * Initialize the drag support. - */ - private void addDragSupport() { - // The event listener is registered as filter. It will receive events from all widgets. - PlatformUI.getWorkbench().getDisplay().addFilter(SWT.DragDetect, new Listener() { - /* (non-Javadoc) - * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event) - */ - @Override - public void handleEvent(Event event) { - // Only handle events where a CTabFolder is the source - if (!(event.widget instanceof CTabFolder)) return; - // TabFolderManager must be created - if (tabFolderManager == null) return; - - // only for own tab folders - if (event.widget != tabFolderControl) return; - - // Skip drag if DnD is still ongoing (bug 443787) - if (tabFolderControl.getData(DND.DRAG_SOURCE_KEY) != null) return; - - final CTabFolder draggedFolder = (CTabFolder) event.widget; - - int operations = DND.DROP_MOVE | DND.DROP_DEFAULT; - final DragSource dragSource = new DragSource(draggedFolder, operations); - - // Initialize the terminal transfer type data - TerminalTransfer.getInstance().setDraggedFolderItem(tabFolderManager.getActiveTabItem()); - TerminalTransfer.getInstance().setTabFolderManager(tabFolderManager); - - Transfer[] transferTypes = new Transfer[] { TerminalTransfer.getInstance() }; - dragSource.setTransfer(transferTypes); - - // Add a drag source listener to cleanup after the drag operation finished - dragSource.addDragListener(new DragSourceListener() { - @Override - public void dragStart(DragSourceEvent event) { - } - - @Override - public void dragSetData(DragSourceEvent event) { - } - - @Override - public void dragFinished(DragSourceEvent event) { - // dispose this drag-source-listener by disposing its drag-source - dragSource.dispose(); - - // Inhibit the action of CTabFolder's default DragDetect-listeners, - // fire a mouse-click event on the widget that was dragged. - draggedFolder.notifyListeners(SWT.MouseUp, null); - } - }); - } - }); - } - - /** - * Initialize the drop support on the terminals page book control. - */ - private void addDropSupport() { - int operations = DND.DROP_MOVE | DND.DROP_DEFAULT; - final DropTarget target = new DropTarget(pageBookControl, operations); - - Transfer[] transferTypes = new Transfer[] { TerminalTransfer.getInstance() }; - target.setTransfer(transferTypes); - - target.addDropListener(new DropTargetListener() { - @Override - public void dragEnter(DropTargetEvent event) { - // only if the drop target is different then the drag source - if (TerminalTransfer.getInstance().getTabFolderManager() == tabFolderManager) { - event.detail = DND.DROP_NONE; - } - else { - event.detail = DND.DROP_MOVE; - } - } - - @Override - public void dragOver(DropTargetEvent event) { - } - - @Override - public void dragOperationChanged(DropTargetEvent event) { - } - - @Override - public void dragLeave(DropTargetEvent event) { - } - - @Override - public void dropAccept(DropTargetEvent event) { - } - - @Override - public void drop(DropTargetEvent event) { - if (TerminalTransfer.getInstance().getDraggedFolderItem() != null && tabFolderManager != null) { - CTabItem draggedItem = TerminalTransfer.getInstance().getDraggedFolderItem(); - - CTabItem item = tabFolderManager.cloneTabItemAfterDrop(draggedItem); - tabFolderManager.bringToTop(item); - switchToTabFolderControl(); - - // dispose tab item control - final Control control = draggedItem.getControl(); - draggedItem.setControl(null); - if (control != null) control.dispose(); - - // need to remove the dispose listener first - DisposeListener disposeListener = (DisposeListener) draggedItem.getData("disposeListener"); //$NON-NLS-1$ - draggedItem.removeDisposeListener(disposeListener); - draggedItem.dispose(); - - // make sure the "new" terminals view has the focus after dragging a terminal - setFocus(); - } - } - }); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#dispose() - */ - @Override - public void dispose() { - // Dispose the tab folder manager - if (tabFolderManager != null) { - tabFolderManager.dispose(); - tabFolderManager = null; - } - // Dispose the tab folder menu handler - if (tabFolderMenuHandler != null) { - tabFolderMenuHandler.dispose(); - tabFolderMenuHandler = null; - } - // Dispose the tab folder toolbar handler - if (tabFolderToolbarHandler != null) { - tabFolderToolbarHandler.dispose(); - tabFolderToolbarHandler = null; - } - - super.dispose(); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento) - */ - @Override - public void init(IViewSite site, IMemento memento) throws PartInitException { - super.init(site, memento); - restoreState(memento); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) - */ - @Override - public void createPartControl(Composite parent) { - // Create the page book control - pageBookControl = doCreatePageBookControl(parent); - Assert.isNotNull(pageBookControl); - // Configure the page book control - doConfigurePageBookControl(pageBookControl); - - // Create the empty page control - emptyPageControl = doCreateEmptyPageControl(pageBookControl); - Assert.isNotNull(emptyPageControl); - // Configure the empty page control - doConfigureEmptyPageControl(emptyPageControl); - - // Create the tab folder control (empty) - tabFolderControl = doCreateTabFolderControl(pageBookControl); - Assert.isNotNull(tabFolderControl); - // Configure the tab folder control - doConfigureTabFolderControl(tabFolderControl); - - // Create the tab folder manager - tabFolderManager = doCreateTabFolderManager(this); - Assert.isNotNull(tabFolderManager); - // Set the tab folder manager as the selection provider - getSite().setSelectionProvider(tabFolderManager); - - // Setup the tab folder menu handler - tabFolderMenuHandler = doCreateTabFolderMenuHandler(this); - Assert.isNotNull(tabFolderMenuHandler); - doConfigureTabFolderMenuHandler(tabFolderMenuHandler); - - // Setup the tab folder toolbar handler - tabFolderToolbarHandler = doCreateTabFolderToolbarHandler(this); - Assert.isNotNull(tabFolderToolbarHandler); - doConfigureTabFolderToolbarHandler(tabFolderToolbarHandler); - - // Show the empty page control by default - switchToEmptyPageControl(); - - String secondaryId = ((IViewSite) getSite()).getSecondaryId(); - if (secondaryId != null) { - String defaultTitle = getPartName(); - // set title - setPartName(defaultTitle + " " + secondaryId); //$NON-NLS-1$ - } - - // Initialize DnD support - addDragSupport(); - addDropSupport(); - } - - /** - * Creates the {@link PageBook} instance. - * - * @param parent The parent composite. Must not be null. - * @return The page book instance. Must never be null. - */ - protected PageBook doCreatePageBookControl(Composite parent) { - return new PageBook(parent, SWT.NONE); - } - - /** - * Configure the given page book control. - * - * @param pagebook The page book control. Must not be null. - */ - protected void doConfigurePageBookControl(PageBook pagebook) { - Assert.isNotNull(pagebook); - - if (getContextHelpId() != null) PlatformUI.getWorkbench().getHelpSystem().setHelp(pagebook, getContextHelpId()); - } - - /** - * Returns the context help id associated with the terminals console view instance. - *

              - * Note: The default implementation returns the view id as context help id. - * - * @return The context help id or null if none is associated. - */ - @Override - public String getContextHelpId() { - return getViewSite().getId(); - } - - /** - * Creates the empty page control instance. - * - * @param parent The parent composite. Must not be null. - * @return The empty page control instance. Must never be null. - */ - protected Control doCreateEmptyPageControl(Composite parent) { - Composite composite = new Composite(parent, SWT.NONE); - composite.setLayout(new GridLayout()); - composite.setLayoutData(new GridData(GridData.FILL_BOTH)); - return composite; - } - - /** - * Configures the empty page control. - * - * @param control The empty page control. Must not be null. - */ - protected void doConfigureEmptyPageControl(Control control) { - Assert.isNotNull(control); - } - - /** - * Creates the tab folder control instance. - * - * @param parent The parent composite. Must not be null. - * @return The tab folder control instance. Must never be null. - */ - protected CTabFolder doCreateTabFolderControl(Composite parent) { - return new CTabFolder(parent, SWT.NO_REDRAW_RESIZE | SWT.NO_TRIM | SWT.FLAT | SWT.BORDER); - } - - /** - * Configures the tab folder control. - * - * @param tabFolder The tab folder control. Must not be null. - */ - protected void doConfigureTabFolderControl(final CTabFolder tabFolder) { - Assert.isNotNull(tabFolder); - - // Set the layout data - tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH)); - - // Set the tab gradient coloring from the global preferences - if (useGradientTabBackgroundColor()) { - tabFolder.setSelectionBackground(new Color[] { - JFaceResources.getColorRegistry().get("org.eclipse.ui.workbench.ACTIVE_TAB_BG_START"), //$NON-NLS-1$ - JFaceResources.getColorRegistry().get("org.eclipse.ui.workbench.ACTIVE_TAB_BG_END") //$NON-NLS-1$ - }, new int[] { 100 }, true); - } - // Apply the tab folder selection foreground color - tabFolder.setSelectionForeground(JFaceResources.getColorRegistry().get("org.eclipse.ui.workbench.ACTIVE_TAB_TEXT_COLOR")); //$NON-NLS-1$ - - // Set the tab style from the global preferences - tabFolder.setSimple(PlatformUI.getPreferenceStore().getBoolean(IWorkbenchPreferenceConstants.SHOW_TRADITIONAL_STYLE_TABS)); - - // Attach the mouse listener - tabFolder.addMouseListener(new MouseAdapter() { - @Override - public void mouseDown(MouseEvent e) { - if (e.button == 2) { - // middle mouse button click - close tab - CTabItem item = tabFolder.getItem(new Point(e.x, e.y)); - if (item != null) item.dispose(); - } - } - }); - } - - /** - * If True is returned, the inner tabs are colored with gradient coloring set in - * the Eclipse workbench color settings. - * - * @return True to use gradient tab colors, false otherwise. - */ - protected boolean useGradientTabBackgroundColor() { - return false; - } - - /** - * Creates the tab folder manager. - * - * @param parentView The parent view instance. Must not be null. - * @return The tab folder manager. Must never be null. - */ - protected TabFolderManager doCreateTabFolderManager(ITerminalsView parentView) { - Assert.isNotNull(parentView); - return new TabFolderManager(parentView); - } - - /** - * Creates the tab folder menu handler. - * - * @param parentView The parent view instance. Must not be null. - * @return The tab folder menu handler. Must never be null. - */ - protected TabFolderMenuHandler doCreateTabFolderMenuHandler(ITerminalsView parentView) { - Assert.isNotNull(parentView); - return new TabFolderMenuHandler(parentView); - } - - /** - * Configure the tab folder menu handler - * - * @param menuHandler The tab folder menu handler. Must not be null. - */ - protected void doConfigureTabFolderMenuHandler(TabFolderMenuHandler menuHandler) { - Assert.isNotNull(menuHandler); - menuHandler.initialize(); - } - - /** - * Creates the tab folder toolbar handler. - * - * @param parentView The parent view instance. Must not be null. - * @return The tab folder toolbar handler. Must never be null. - */ - protected TabFolderToolbarHandler doCreateTabFolderToolbarHandler(ITerminalsView parentView) { - Assert.isNotNull(parentView); - return new TabFolderToolbarHandler(parentView); - } - - /** - * Configure the tab folder toolbar handler - * - * @param toolbarHandler The tab folder toolbar handler. Must not be null. - */ - protected void doConfigureTabFolderToolbarHandler(TabFolderToolbarHandler toolbarHandler) { - Assert.isNotNull(toolbarHandler); - toolbarHandler.initialize(); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#setFocus() - */ - @Override - public void setFocus() { - if (pageBookControl != null) pageBookControl.setFocus(); - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ITerminalsView#switchToEmptyPageControl() - */ - @Override - public void switchToEmptyPageControl() { - if (pageBookControl != null && !pageBookControl.isDisposed() - && emptyPageControl != null && !emptyPageControl.isDisposed()) { - pageBookControl.showPage(emptyPageControl); - } - } - - /* (non-Javadoc) - * @see org.eclipse.tm.terminal.view.ui.interfaces.ITerminalsView#switchToTabFolderControl() - */ - @Override - public void switchToTabFolderControl() { - if (pageBookControl != null && !pageBookControl.isDisposed() - && tabFolderControl != null && !tabFolderControl.isDisposed()) { - pageBookControl.showPage(tabFolderControl); - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(java.lang.Class) - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public Object getAdapter(Class adapter) { - if (CTabFolder.class.isAssignableFrom(adapter)) { - return tabFolderControl; - } - if (TabFolderManager.class.isAssignableFrom(adapter)) { - return tabFolderManager; - } - if (TabFolderMenuHandler.class.isAssignableFrom(adapter)) { - return tabFolderMenuHandler; - } - if (TabFolderToolbarHandler.class.isAssignableFrom(adapter)) { - return tabFolderToolbarHandler; - } - if (TerminalsViewMementoHandler.class.isAssignableFrom(adapter)) { - return mementoHandler; - } - - return super.getAdapter(adapter); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento) - */ - @Override - public void saveState(IMemento memento) { - super.saveState(memento); - if (memento == null) return; - mementoHandler.saveState(this, memento); - } - - /** - * Restore the view state from the given memento. - * - * @param memento The memento or null. - */ - public void restoreState(IMemento memento) { - if (memento == null) return; - mementoHandler.restoreState(this, memento); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.IShowInTarget#show(org.eclipse.ui.part.ShowInContext) - */ - @SuppressWarnings("cast") - @Override - public boolean show(ShowInContext context) { - if (context != null) { - // Get the selection from the context - ISelection selection = context.getSelection(); - - // If the selection is not set or empty, look at the input element of - // the show in context. - if (!(selection instanceof IStructuredSelection) || selection.isEmpty()) { - Object input = context.getInput(); - // If coming from the EGit repository viewer, the input element is - // org.eclipse.egit.ui.internal.history.HistoryPageInput - if ("org.eclipse.egit.ui.internal.history.HistoryPageInput".equals(input.getClass().getName())) { //$NON-NLS-1$ - Bundle bundle = Platform.getBundle("org.eclipse.egit.ui"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - selection = GitShowInContextHandler.getSelection(input); - } - } - } - - // The selection must contain elements that can be adapted to IResource, File or IPath - if (selection instanceof IStructuredSelection && !selection.isEmpty()) { - boolean isValid = true; - - // Build a new structured selection with the adapted elements - List elements = new ArrayList(); - - Iterator iterator = ((IStructuredSelection)selection).iterator(); - while (iterator.hasNext() && isValid) { - Object element = iterator.next(); - Object adapted = null; - - if (element instanceof File) { - if (!elements.contains(element)) elements.add(element); - continue; - } - adapted = element instanceof IAdaptable ? ((IAdaptable)element).getAdapter(File.class) : null; - if (adapted == null) adapted = Platform.getAdapterManager().getAdapter(element, File.class); - if (adapted == null) adapted = Platform.getAdapterManager().loadAdapter(element, File.class.getName()); - if (adapted != null) { - if (!elements.contains(adapted)) elements.add(adapted); - continue; - } - - if (element instanceof IPath) { - if (!elements.contains(element)) elements.add(element); - continue; - } - adapted = element instanceof IAdaptable ? ((IAdaptable)element).getAdapter(IPath.class) : null; - if (adapted == null) adapted = Platform.getAdapterManager().getAdapter(element, IPath.class); - if (adapted == null) adapted = Platform.getAdapterManager().loadAdapter(element, IPath.class.getName()); - if (adapted != null) { - if (!elements.contains(adapted)) elements.add(adapted); - continue; - } - - Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - if (element instanceof org.eclipse.core.resources.IResource) { - if (!elements.contains(element)) elements.add(element); - continue; - } - - adapted = element instanceof IAdaptable ? ((IAdaptable)element).getAdapter(org.eclipse.core.resources.IResource.class) : null; - if (adapted == null) adapted = Platform.getAdapterManager().getAdapter(element, org.eclipse.core.resources.IResource.class); - if (adapted == null) adapted = Platform.getAdapterManager().loadAdapter(element, org.eclipse.core.resources.IResource.class.getName()); - } - if (adapted != null) { - if (!elements.contains(adapted)) elements.add(adapted); - continue; - } - - // The EGit repository view can also set a RepositoryTreeNode (and subclasses) - // "org.eclipse.egit.ui.internal.repository.tree...." - if (element.getClass().getName().startsWith("org.eclipse.egit.ui.internal.repository.tree")) { //$NON-NLS-1$ - bundle = Platform.getBundle("org.eclipse.egit.ui"); //$NON-NLS-1$ - if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { - adapted = GitShowInContextHandler.getPath(element); - } - } - if (adapted != null) { - if (!elements.contains(adapted)) elements.add(adapted); - continue; - } - - isValid = false; - } - - // If the selection is valid, fire the command to open the local terminal - if (isValid) { - selection = new StructuredSelection(elements); - ICommandService service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class); - Command command = service != null ? service.getCommand("org.eclipse.tm.terminal.connector.local.command.launch") : null; //$NON-NLS-1$ - if (command != null && command.isDefined() && command.isEnabled()) { - try { - ParameterizedCommand pCmd = ParameterizedCommand.generateCommand(command, null); - Assert.isNotNull(pCmd); - IHandlerService handlerSvc = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class); - Assert.isNotNull(handlerSvc); - IEvaluationContext ctx = handlerSvc.getCurrentState(); - ctx = new EvaluationContext(ctx, selection); - ctx.addVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME, selection); - handlerSvc.executeCommandInContext(pCmd, null, ctx); - } catch (Exception e) { - // If the platform is in debug mode, we print the exception to the log view - if (Platform.inDebugMode()) { - IStatus status = new Status(IStatus.ERROR, UIPlugin.getUniqueIdentifier(), - Messages.AbstractTriggerCommandHandler_error_executionFailed, e); - UIPlugin.getDefault().getLog().log(status); - } - } - } - return true; - } - } - } - return false; - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/TerminalsViewMementoHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/TerminalsViewMementoHandler.java deleted file mode 100644 index 9826c31..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/TerminalsViewMementoHandler.java +++ /dev/null @@ -1,178 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.view; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.swt.custom.CTabItem; -import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; -import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; -import org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate; -import org.eclipse.tm.terminal.view.ui.interfaces.IMementoHandler; -import org.eclipse.tm.terminal.view.ui.launcher.LauncherDelegateManager; -import org.eclipse.ui.IMemento; -import org.eclipse.ui.PlatformUI; - -/** - * Take care of the persisted state handling of the "Terminal" view. - */ -public class TerminalsViewMementoHandler { - // The list of items to save. See the workbench listener implementation - // in o.e.tm.terminal.view.ui.activator.UIPlugin. - private final List saveables = new ArrayList(); - - /** - * Sets the list of saveable items. - * - * @param saveables The list of saveable items. Must not be null. - */ - public void setSaveables(List saveables) { - Assert.isNotNull(saveables); - this.saveables.clear(); - this.saveables.addAll(saveables); - } - - /** - * Saves the view state in the given memento. - * - * @param view The terminals view. Must not be null. - * @param memento The memento. Must not be null. - */ - @SuppressWarnings("unchecked") - public void saveState(TerminalsView view, IMemento memento) { - Assert.isNotNull(view); - Assert.isNotNull(memento); - - // Create a child element within the memento holding the - // connection info of the open, non-terminated tab items - memento = memento.createChild("terminalConnections"); //$NON-NLS-1$ - Assert.isNotNull(memento); - - // Write the view id and secondary id - memento.putString("id", view.getViewSite().getId()); //$NON-NLS-1$ - memento.putString("secondaryId", view.getViewSite().getSecondaryId()); //$NON-NLS-1$ - - // Loop the saveable items and store the connection data of each - // item to the memento - for (CTabItem item : saveables) { - // Ignore disposed items - if (item.isDisposed()) continue; - - // Get the original terminal properties associated with the tab item - Map properties = (Map)item.getData("properties"); //$NON-NLS-1$ - if (properties == null) continue; - - // Get the terminal launcher delegate - String delegateId = (String)properties.get(ITerminalsConnectorConstants.PROP_DELEGATE_ID); - ILauncherDelegate delegate = delegateId != null ? LauncherDelegateManager.getInstance().getLauncherDelegate(delegateId, false) : null; - IMementoHandler mementoHandler = delegate != null ? (IMementoHandler)delegate.getAdapter(IMementoHandler.class) : null; - if (mementoHandler != null) { - // Create terminal connection child memento - IMemento connectionMemento = memento.createChild("connection"); //$NON-NLS-1$ - Assert.isNotNull(connectionMemento); - // Store the common attributes - connectionMemento.putString(ITerminalsConnectorConstants.PROP_DELEGATE_ID, delegateId); - - String terminalConnectorId = (String)properties.get(ITerminalsConnectorConstants.PROP_TERMINAL_CONNECTOR_ID); - if (terminalConnectorId != null) { - connectionMemento.putString(ITerminalsConnectorConstants.PROP_TERMINAL_CONNECTOR_ID, terminalConnectorId); - } - - if (properties.get(ITerminalsConnectorConstants.PROP_FORCE_NEW) instanceof Boolean) { - connectionMemento.putBoolean(ITerminalsConnectorConstants.PROP_FORCE_NEW, ((Boolean)properties.get(ITerminalsConnectorConstants.PROP_FORCE_NEW)).booleanValue()); - } - - // Store the current encoding - ITerminalViewControl terminal = (ITerminalViewControl)item.getData(); - String encoding = terminal != null ? terminal.getEncoding() : null; - if (encoding == null || "".equals(encoding)) encoding = (String)properties.get(ITerminalsConnectorConstants.PROP_ENCODING); //$NON-NLS-1$ - if (encoding != null && !"".equals(encoding)) { //$NON-NLS-1$ - connectionMemento.putString(ITerminalsConnectorConstants.PROP_ENCODING, encoding); - } - - // Pass on to the memento handler - mementoHandler.saveState(connectionMemento, properties); - } - } - } - - /** - * Restore the view state from the given memento. - * - * @param view The terminals view. Must not be null. - * @param memento The memento. Must not be null. - */ - protected void restoreState(final TerminalsView view, IMemento memento) { - Assert.isNotNull(view); - Assert.isNotNull(memento); - - // Get the "terminalConnections" memento - memento = memento.getChild("terminalConnections"); //$NON-NLS-1$ - if (memento != null) { - // Read view id and secondary id - String id = memento.getString("id"); //$NON-NLS-1$ - String secondaryId = memento.getString("secondaryId"); //$NON-NLS-1$ - if ("null".equals(secondaryId)) secondaryId = null; //$NON-NLS-1$ - - // Get all the "connection" memento's. - IMemento[] connections = memento.getChildren("connection"); //$NON-NLS-1$ - for (IMemento connection : connections) { - // Create the properties container that holds the terminal properties - Map properties = new HashMap(); - - // Set the view id attributes - properties.put(ITerminalsConnectorConstants.PROP_ID, id); - properties.put(ITerminalsConnectorConstants.PROP_SECONDARY_ID, secondaryId); - - // Restore the common attributes - properties.put(ITerminalsConnectorConstants.PROP_DELEGATE_ID, connection.getString(ITerminalsConnectorConstants.PROP_DELEGATE_ID)); - properties.put(ITerminalsConnectorConstants.PROP_TERMINAL_CONNECTOR_ID, connection.getString(ITerminalsConnectorConstants.PROP_TERMINAL_CONNECTOR_ID)); - if (connection.getBoolean(ITerminalsConnectorConstants.PROP_FORCE_NEW) != null) { - properties.put(ITerminalsConnectorConstants.PROP_FORCE_NEW, connection.getBoolean(ITerminalsConnectorConstants.PROP_FORCE_NEW)); - } - - // Restore the encoding - if (connection.getString(ITerminalsConnectorConstants.PROP_ENCODING) != null) { - properties.put(ITerminalsConnectorConstants.PROP_ENCODING, connection.getString(ITerminalsConnectorConstants.PROP_ENCODING)); - } - - // Get the terminal launcher delegate - String delegateId = (String)properties.get(ITerminalsConnectorConstants.PROP_DELEGATE_ID); - ILauncherDelegate delegate = delegateId != null ? LauncherDelegateManager.getInstance().getLauncherDelegate(delegateId, false) : null; - IMementoHandler mementoHandler = delegate != null ? (IMementoHandler)delegate.getAdapter(IMementoHandler.class) : null; - if (mementoHandler != null) { - // Pass on to the memento handler - mementoHandler.restoreState(connection, properties); - } - - // Restore the terminal connection - if (delegate != null && !properties.isEmpty()) { - delegate.execute(properties, null); - } - } - } - } - - /** - * Executes the given runnable asynchronously in the display thread. - * - * @param runnable The runnable. Must not be null. - */ - /* default */ void asyncExec(Runnable runnable) { - Assert.isNotNull(runnable); - if (PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getDisplay() != null && !PlatformUI.getWorkbench().getDisplay().isDisposed()) { - PlatformUI.getWorkbench().getDisplay().asyncExec(runnable); - } - } -} diff --git a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/showin/GitShowInContextHandler.java b/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/showin/GitShowInContextHandler.java deleted file mode 100644 index cdd4381..0000000 --- a/rtosTMTerminal/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/view/showin/GitShowInContextHandler.java +++ /dev/null @@ -1,85 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 Wind River Systems, Inc. and others. All rights reserved. - * This program and the accompanying materials are made available under the terms - * of the Eclipse Public License v1.0 which accompanies this distribution, and is - * available at http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Wind River Systems - initial API and implementation - *******************************************************************************/ -package org.eclipse.tm.terminal.view.ui.view.showin; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IPath; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.StructuredSelection; - -/** - * Git show in context handler implementation. - */ -@SuppressWarnings("restriction") -public class GitShowInContextHandler { - - /** - * Converts the data from the input object into a selection. - * - * @param input The input element. Must not be null. - * @return The selection or null. - */ - public static ISelection getSelection(Object input) { - Assert.isNotNull(input); - - List elements = new ArrayList(); - - if (input instanceof org.eclipse.egit.ui.internal.history.HistoryPageInput) { - org.eclipse.egit.ui.internal.history.HistoryPageInput inp = (org.eclipse.egit.ui.internal.history.HistoryPageInput) input; - - if (inp.isSingleFile()) { - elements.add(inp.getSingleFile()); - } else { - File[] fl = inp.getFileList(); - if (fl != null && fl.length > 0) { - for (File f : fl) { - if (f.canRead() && !elements.contains(f)) { - elements.add(f); - } - } - } - - IResource[] rl = inp.getItems(); - if (rl != null && rl.length > 0) { - for (IResource r : rl) { - if (r.isAccessible() && !elements.contains(r)) { - elements.add(r); - } - } - } - } - } - - return elements.isEmpty() ? null : new StructuredSelection(elements); - } - - /** - * Returns the path of the given element. - * - * @param element The element. Must not be null. - * @return The path or null. - */ - public static IPath getPath(Object element) { - Assert.isNotNull(element); - - IPath path = null; - - if (element instanceof org.eclipse.egit.ui.internal.repository.tree.RepositoryTreeNode) { - path = ((org.eclipse.egit.ui.internal.repository.tree.RepositoryTreeNode)element).getPath(); - } - - return path; - } -} -- 2.7.4