From 2f5b387647e8f8024db494911d161951a574ff50 Mon Sep 17 00:00:00 2001 From: Michael Scharf Date: Wed, 16 May 2007 20:38:23 +0000 Subject: [PATCH] [186136] [terminal] Terminal activates extensions too early Now the plugins are activated only when they are really needed: - when a connection is made - when the user selects the connection in the settings dialog --- .../plugin.properties | 1 + org.eclipse.tm.terminal.serial/plugin.xml | 2 +- .../terminal/serial/ISerialSettings.java | 2 +- .../terminal/serial/SerialConnector.java | 9 +- .../terminal/serial/SerialMessages.java | 1 - .../terminal/serial/SerialMessages.properties | 1 - .../terminal/serial/SerialSettings.java | 8 +- .../terminal/serial/SerialSettingsPage.java | 4 - org.eclipse.tm.terminal.ssh/plugin.properties | 1 + org.eclipse.tm.terminal.ssh/plugin.xml | 2 +- .../internal/terminal/ssh/ISshSettings.java | 2 +- .../internal/terminal/ssh/SshConnector.java | 9 +- .../tm/internal/terminal/ssh/SshMessages.java | 1 - .../terminal/ssh/SshMessages.properties | 1 - .../tm/internal/terminal/ssh/SshSettings.java | 8 +- .../terminal/ssh/SshSettingsPage.java | 4 - .../terminal/view/TerminalSettingsDlg.java | 76 +++++++-- .../internal/terminal/view/TerminalView.java | 36 ++++- .../internal/terminal/view/ViewMessages.java | 1 + .../terminal/view/ViewMessages.properties | 1 + org.eclipse.tm.terminal/plugin.properties | 2 + org.eclipse.tm.terminal/plugin.xml | 2 +- .../schema/terminalConnector.exsd | 18 ++- .../control/ITerminalViewControl.java | 2 +- .../control/impl/TerminalControl.java | 6 +- .../provisional/api/ISettingsPage.java | 6 - .../provisional/api/ITerminalConnector.java | 19 ++- .../api/TerminalConnectorExtension.java | 146 ++++++++++++++++-- .../terminal/telnet/ITelnetSettings.java | 2 +- .../terminal/telnet/TelnetConnection.java | 4 +- .../terminal/telnet/TelnetConnector.java | 9 +- .../terminal/telnet/TelnetMessages.java | 1 - .../terminal/telnet/TelnetMessages.properties | 1 - .../terminal/telnet/TelnetSettings.java | 7 +- .../terminal/telnet/TelnetSettingsPage.java | 4 - 35 files changed, 304 insertions(+), 95 deletions(-) diff --git a/org.eclipse.tm.terminal.serial/plugin.properties b/org.eclipse.tm.terminal.serial/plugin.properties index 39efa2d66cc..9d2bfc04216 100644 --- a/org.eclipse.tm.terminal.serial/plugin.properties +++ b/org.eclipse.tm.terminal.serial/plugin.properties @@ -16,3 +16,4 @@ ############################################################################### pluginName = Target Management Terminal Serial Connector providerName = Eclipse.org +serialConnection = Serial \ No newline at end of file diff --git a/org.eclipse.tm.terminal.serial/plugin.xml b/org.eclipse.tm.terminal.serial/plugin.xml index b4590bd127c..7c62d8dd123 100644 --- a/org.eclipse.tm.terminal.serial/plugin.xml +++ b/org.eclipse.tm.terminal.serial/plugin.xml @@ -14,6 +14,6 @@ - + diff --git a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/ISerialSettings.java b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/ISerialSettings.java index ac56d363989..5fc3a02902c 100644 --- a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/ISerialSettings.java +++ b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/ISerialSettings.java @@ -22,7 +22,7 @@ public interface ISerialSettings { int getParity(); int getFlowControl(); int getTimeout(); - String getStatusString(String strConnected); + String getSummary(); void load(ISettingsStore store); void save(ISettingsStore store); } \ No newline at end of file diff --git a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialConnector.java b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialConnector.java index f7b860a804f..6cc5df9a497 100644 --- a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialConnector.java +++ b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialConnector.java @@ -52,7 +52,10 @@ public class SerialConnector implements ITerminalConnector { fSettings=settins; } public String getId() { - return getClass().getName(); + return null; + } + public String getName() { + return null; } public boolean isInstalled() { // check if serial is installed @@ -191,8 +194,8 @@ public class SerialConnector implements ITerminalConnector { public ISettingsPage makeSettingsPage() { return new SerialSettingsPage(fSettings); } - public String getStatusString(String strConnected) { - return fSettings.getStatusString(strConnected); + public String getSettingsSummary() { + return fSettings.getSummary(); } public void load(ISettingsStore store) { fSettings.load(store); diff --git a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialMessages.java b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialMessages.java index 2d69c628163..8dfb5cbf75b 100644 --- a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialMessages.java +++ b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialMessages.java @@ -21,7 +21,6 @@ public class SerialMessages extends NLS { static { NLS.initializeMessages(SerialMessages.class.getName(), SerialMessages.class); } - public static String CONNTYPE_SERIAL; public static String PROP_TITLE; public static String PORT; public static String BAUDRATE; diff --git a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialMessages.properties b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialMessages.properties index bb98d9f381a..c9c0acfd3c5 100644 --- a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialMessages.properties +++ b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialMessages.properties @@ -15,7 +15,6 @@ # Martin Oberhuber (Wind River) - fixed copyright headers and beautified ############################################################################### PORT_IN_USE = Serial port \''{0}\'' is currently in use\!\nDo you want to close the port? -CONNTYPE_SERIAL = Serial PROP_TITLE = Terminal PORT = Port BAUDRATE = Baud Rate diff --git a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialSettings.java b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialSettings.java index 29778acec62..7980b7afe5d 100644 --- a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialSettings.java +++ b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialSettings.java @@ -144,15 +144,13 @@ public class SerialSettings implements ISerialSettings { fFlowControl = strFlow; } - public String getStatusString(String strConnected) { - return " (" + //$NON-NLS-1$ - getSerialPort() + ", " + //$NON-NLS-1$ + 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() + " - " + //$NON-NLS-1$ - strConnected + ")"; //$NON-NLS-1$ + getFlowControlString(); } public void load(ISettingsStore store) { diff --git a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialSettingsPage.java b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialSettingsPage.java index 0edfc522c05..427074d4079 100644 --- a/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialSettingsPage.java +++ b/org.eclipse.tm.terminal.serial/src/org/eclipse/tm/internal/terminal/serial/SerialSettingsPage.java @@ -134,8 +134,4 @@ public class SerialSettingsPage implements ISettingsPage { ctlCombo.add(label); } } - - public String getName() { - return SerialMessages.CONNTYPE_SERIAL; - } } diff --git a/org.eclipse.tm.terminal.ssh/plugin.properties b/org.eclipse.tm.terminal.ssh/plugin.properties index 1fa66347851..000620e9d7f 100644 --- a/org.eclipse.tm.terminal.ssh/plugin.properties +++ b/org.eclipse.tm.terminal.ssh/plugin.properties @@ -10,3 +10,4 @@ ############################################################################### pluginName = Target Management Terminal SSH Connector providerName = Eclipse.org +sshConnection = SSH \ No newline at end of file diff --git a/org.eclipse.tm.terminal.ssh/plugin.xml b/org.eclipse.tm.terminal.ssh/plugin.xml index 61731170b49..fcf13b1a3a0 100644 --- a/org.eclipse.tm.terminal.ssh/plugin.xml +++ b/org.eclipse.tm.terminal.ssh/plugin.xml @@ -14,7 +14,7 @@ - + diff --git a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/ISshSettings.java b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/ISshSettings.java index 1c7fe58e192..8c1b7805828 100644 --- a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/ISshSettings.java +++ b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/ISshSettings.java @@ -19,7 +19,7 @@ public interface ISshSettings { String getPassword(); int getTimeout(); int getPort(); - String getStatusString(String strConnected); + String getSummary(); void load(ISettingsStore store); void save(ISettingsStore store); } diff --git a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshConnector.java b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshConnector.java index 7e648a8675a..ad348e8b5a0 100644 --- a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshConnector.java +++ b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshConnector.java @@ -47,7 +47,10 @@ public class SshConnector implements ITerminalConnector { fSettings=settings; } public String getId() { - return getClass().getName(); + return null; + } + public String getName() { + return null; } public boolean isInstalled() { return fJsch!=null; @@ -111,8 +114,8 @@ public class SshConnector implements ITerminalConnector { public ISettingsPage makeSettingsPage() { return new SshSettingsPage(fSettings); } - public String getStatusString(String strConnected) { - return fSettings.getStatusString(strConnected); + public String getSettingsSummary() { + return fSettings.getSummary(); } public void load(ISettingsStore store) { fSettings.load(store); diff --git a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshMessages.java b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshMessages.java index e51bc7fde40..ca912590635 100644 --- a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshMessages.java +++ b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshMessages.java @@ -17,7 +17,6 @@ public class SshMessages extends NLS { static { NLS.initializeMessages(SshMessages.class.getName(), SshMessages.class); } - public static String CONNTYPE; public static String USER; public static String HOST; public static String PORT; diff --git a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshMessages.properties b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshMessages.properties index 540e9c95459..3a3327ca7c3 100644 --- a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshMessages.properties +++ b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshMessages.properties @@ -9,7 +9,6 @@ # Michael Scharf (Wind River) - initial API and implementation # Martin Oberhuber (Wind River) - fixed copyright headers and beautified ############################################################################### -CONNTYPE = SSH HOST = Host USER = User PORT = Port diff --git a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshSettings.java b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshSettings.java index 43fd674c9fe..af9a684ed3a 100644 --- a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshSettings.java +++ b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshSettings.java @@ -27,11 +27,9 @@ public class SshSettings implements ISshSettings { fHost = strHost; } - public String getStatusString(String strConnected) { - return " (" + //$NON-NLS-1$ - getHost() + ":" + //$NON-NLS-1$ - getUser() + " - " + //$NON-NLS-1$ - strConnected + ")"; //$NON-NLS-1$ + public String getSummary() { + return getHost() + ":" + getUser(); //$NON-NLS-1$ + } public void load(ISettingsStore store) { diff --git a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshSettingsPage.java b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshSettingsPage.java index 55e2088349e..5ae8292f4a1 100644 --- a/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshSettingsPage.java +++ b/org.eclipse.tm.terminal.ssh/src/org/eclipse/tm/internal/terminal/ssh/SshSettingsPage.java @@ -86,8 +86,4 @@ public class SshSettingsPage implements ISettingsPage { return createTextField(composite, labelTxt, 0); } - public String getName() { - return SshMessages.CONNTYPE; - } - } diff --git a/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalSettingsDlg.java b/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalSettingsDlg.java index 0a88dcbe94a..cf897b697b9 100644 --- a/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalSettingsDlg.java +++ b/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalSettingsDlg.java @@ -18,15 +18,19 @@ package org.eclipse.tm.internal.terminal.view; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogSettings; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; 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.Control; import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; @@ -35,6 +39,11 @@ class TerminalSettingsDlg extends Dialog { private Combo fCtlConnTypeCombo; private final ITerminalConnector[] fConnectors; private final ISettingsPage[] fPages; + /** + * Maps the fConnectors index to the fPages index + */ + private final int[] fPageIndex; + private int fNPages; private int fSelectedConnector; private PageBook fPageBook; private IDialogSettings fDialogSettings; @@ -43,17 +52,66 @@ class TerminalSettingsDlg extends Dialog { super(shell); fConnectors=connectors; fPages=new ISettingsPage[fConnectors.length]; + fPageIndex=new int[fConnectors.length]; + fSelectedConnector=-1; for (int i = 0; i < fConnectors.length; i++) { - fPages[i]=fConnectors[i].makeSettingsPage(); if(fConnectors[i]==connector) fSelectedConnector=i; } } + ISettingsPage getPage(int i) { + if(fPages[i]==null) { + try { + fPages[i]=fConnectors[i].makeSettingsPage(); + // TODO: what happens if an error occurs while + // the control is partly created? + fPages[i].createControl(fPageBook); + } catch (final Exception e) { + // create a error message + fPages[i]=new ISettingsPage(){ + public void createControl(Composite parent) { + Label l=new Label(parent,SWT.WRAP); + l.setText("Error"); //$NON-NLS-1$ + l.setForeground(l.getDisplay().getSystemColor(SWT.COLOR_RED)); + MessageDialog.openError(getShell(), "Initialization Problems!", e.getLocalizedMessage()); //$NON-NLS-1$ + } + public void loadSettings() {} + public void saveSettings() {} + public boolean validateSettings() {return false;} + }; + fPages[i].createControl(fPageBook); + } + fPageIndex[i]=fNPages++; + resize(); + } + return fPages[i]; + + } + void resize() { + Point size=getShell().getSize(); + Point newSize=getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT,true); + newSize.x=Math.max(newSize.x,size.x); + newSize.y=Math.max(newSize.y,size.y); + if(newSize.x!=size.x || newSize.y!=size.y) { + setShellSize(newSize); + } else { + fPageBook.getParent().layout(); + } + } + /** + * Increase the size of this dialog's Shell by the specified amounts. + * Do not increase the size of the Shell beyond the bounds of the Display. + */ + protected void setShellSize(Point size) { + Rectangle bounds = getShell().getMonitor().getClientArea(); + getShell().setSize(Math.min(size.x, bounds.width), Math.min(size.y, bounds.height)); + } + protected void okPressed() { if (!validateSettings()) return; if(fSelectedConnector>=0) { - fPages[fSelectedConnector].saveSettings(); + getPage(fSelectedConnector).saveSettings(); } super.okPressed(); } @@ -80,8 +138,8 @@ class TerminalSettingsDlg extends Dialog { } private void initFields() { // Load controls - for (int i = 0; i < fPages.length; i++) { - String name=fPages[i].getName(); + for (int i = 0; i < fConnectors.length; i++) { + String name=fConnectors[i].getName(); fCtlConnTypeCombo.add(name); if(fSelectedConnector==i) { fCtlConnTypeCombo.select(i); @@ -92,7 +150,7 @@ class TerminalSettingsDlg extends Dialog { private boolean validateSettings() { if(fSelectedConnector<0) return true; - return fPages[fSelectedConnector].validateSettings(); + return getPage(fSelectedConnector).validateSettings(); } private void setupPanel(Composite wndParent) { setupConnTypePanel(wndParent); @@ -123,11 +181,6 @@ class TerminalSettingsDlg extends Dialog { group.setLayoutData(new GridData(GridData.FILL_BOTH)); fPageBook=new PageBook(group,SWT.NONE); fPageBook.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - - - for (int i = 0; i < fPages.length; i++) { - fPages[i].createControl(fPageBook); - } } private void setupListeners() { fCtlConnTypeCombo.addSelectionListener(new SelectionAdapter() { @@ -143,8 +196,9 @@ class TerminalSettingsDlg extends Dialog { } private void selectPage(int index) { fSelectedConnector=index; + getPage(index); Control[] pages=fPageBook.getChildren(); - fPageBook.showPage(pages[fSelectedConnector]); + fPageBook.showPage(pages[fPageIndex[fSelectedConnector]]); } protected IDialogSettings getDialogBoundsSettings() { IDialogSettings ds=TerminalViewPlugin.getDefault().getDialogSettings(); diff --git a/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalView.java b/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalView.java index fc8a994c98a..1e2c34f9005 100644 --- a/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalView.java +++ b/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalView.java @@ -67,7 +67,9 @@ import org.eclipse.ui.part.ViewPart; public class TerminalView extends ViewPart implements ITerminalView, ITerminalListener { private static final String STORE_CONNECTION_TYPE = "ConnectionType"; //$NON-NLS-1$ - private static final String STORE_HAS_COMMAND_INPUT_FIELD = "HasCommandInputField"; //$NON-NLS-1$ + private static final String STORE_SETTING_SUMMARY = "SettingSummary"; //$NON-NLS-1$ + + private static final String STORE_HAS_COMMAND_INPUT_FIELD = "HasCommandInputField"; //$NON-NLS-1$ private static final String STORE_COMMAND_INPUT_FIELD_HISTORY = "CommandInputFieldHistory"; //$NON-NLS-1$ @@ -244,20 +246,41 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi // display in the view's content description line. This is used by class // TerminalText when it processes an ANSI OSC escape sequence that commands // the terminal to display text in its title bar. + } else if(fCtlTerminal.getTerminalConnection()==null){ + strTitle=ViewMessages.NO_CONNECTION_SELECTED; } else { // When parameter 'data' is null, we construct a descriptive string to // display in the content description line. String strConnected = getStateDisplayName(fCtlTerminal.getState()); - String status=fCtlTerminal.getStatusString(strConnected); - if(status.length()>0) - status=": "+status; //$NON-NLS-1$ - strTitle = ViewMessages.PROP_TITLE + status; + String summary = getSettingsSummary(); + if(summary.length()>0) + summary=summary+" - "; //$NON-NLS-1$ + String name=fCtlTerminal.getTerminalConnection().getName(); + if(name.length()>0) { + name+=": "; //$NON-NLS-1$ + } + strTitle = name + "("+ summary + strConnected + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } setContentDescription(strTitle); getViewSite().getActionBars().getStatusLineManager().setMessage( strTitle); } + /** + * @return the setting summary. If there is no connection, or the connection + * has not been initialized, use the last stored state. + */ + private String getSettingsSummary() { + // TODO: use another mechanism than "?" for the magic non initialized state + // see TerminalConnectorProxy.getSettingsSummary + String summary="?"; //$NON-NLS-1$ + if(fCtlTerminal.getTerminalConnection()!=null) + summary=fCtlTerminal.getSettingsSummary(); + if("?".equals(summary)) { //$NON-NLS-1$ + summary=fStore.get(STORE_SETTING_SUMMARY, ""); //$NON-NLS-1$ + } + return summary; + } public void onTerminalStatus() { setTerminalTitle(null); } @@ -417,10 +440,11 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi if(fCommandInputField!=null) fStore.put(STORE_COMMAND_INPUT_FIELD_HISTORY, fCommandInputField.getHistory()); fStore.put(STORE_HAS_COMMAND_INPUT_FIELD,hasCommandInputField()?"true":"false"); //$NON-NLS-1$//$NON-NLS-2$ + fStore.put(STORE_SETTING_SUMMARY, getSettingsSummary()); fStore.saveState(memento); } private ISettingsStore getStore(ITerminalConnector connector) { - return new SettingStorePrefixDecorator(fStore,connector.getClass().getName()+"."); //$NON-NLS-1$ + return new SettingStorePrefixDecorator(fStore,connector.getId()+"."); //$NON-NLS-1$ } protected void setupActions() { diff --git a/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ViewMessages.java b/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ViewMessages.java index 7b284792187..a6ae47f360e 100644 --- a/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ViewMessages.java +++ b/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ViewMessages.java @@ -22,6 +22,7 @@ public class ViewMessages extends NLS { static { NLS.initializeMessages(ViewMessages.class.getName(), ViewMessages.class); } + public static String NO_CONNECTION_SELECTED; public static String PROP_TITLE; public static String SETTINGS; diff --git a/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ViewMessages.properties b/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ViewMessages.properties index 46f4f6da329..af72f181ce1 100644 --- a/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ViewMessages.properties +++ b/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ViewMessages.properties @@ -14,6 +14,7 @@ # Michael Scharf (Wind River) - split into core, view and connector plugins # Martin Oberhuber (Wind River) - fixed copyright headers and beautified ############################################################################### +NO_CONNECTION_SELECTED = No Connection Selected PROP_TITLE = Terminal SETTINGS = Settings diff --git a/org.eclipse.tm.terminal/plugin.properties b/org.eclipse.tm.terminal/plugin.properties index f5c474e9c62..c6e04d21c73 100644 --- a/org.eclipse.tm.terminal/plugin.properties +++ b/org.eclipse.tm.terminal/plugin.properties @@ -17,6 +17,8 @@ pluginName = Target Management Terminal Widget providerName = Eclipse.org +telnetConnection = Telnet + terminal.context.name=Terminal widget context terminal.context.description=Override ALT+x menu access keys diff --git a/org.eclipse.tm.terminal/plugin.xml b/org.eclipse.tm.terminal/plugin.xml index 2274c107522..8cba54c9549 100644 --- a/org.eclipse.tm.terminal/plugin.xml +++ b/org.eclipse.tm.terminal/plugin.xml @@ -15,7 +15,7 @@ - + diff --git a/org.eclipse.tm.terminal/schema/terminalConnector.exsd b/org.eclipse.tm.terminal/schema/terminalConnector.exsd index 87ccd84ab05..8da38f0552c 100644 --- a/org.eclipse.tm.terminal/schema/terminalConnector.exsd +++ b/org.eclipse.tm.terminal/schema/terminalConnector.exsd @@ -54,6 +54,23 @@ + + + + + + + + + + + The name of the connection (used in the UI) + + + + + + @@ -107,7 +124,6 @@ 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 - diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java index ba6a195dea4..df951caf813 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java @@ -35,7 +35,7 @@ public interface ITerminalViewControl { Clipboard getClipboard(); void disconnectTerminal(); void disposeTerminal(); - String getStatusString(String status); + String getSettingsSummary(); ITerminalConnector[] getConnectors(); void setFocus(); ITerminalConnector getTerminalConnection(); diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/impl/TerminalControl.java b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/impl/TerminalControl.java index 71c1048e383..d1b4e2a4dde 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/impl/TerminalControl.java +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/impl/TerminalControl.java @@ -811,10 +811,10 @@ public class TerminalControl implements ITerminalControlForText, ITerminalContro fTerminalListener.setState(state); } - public String getStatusString(String strConnected) { + public String getSettingsSummary() { if(fConnector!=null) - return fConnector.getStatusString(strConnected); - return strConnected; + return fConnector.getSettingsSummary(); + return ""; //$NON-NLS-1$ } public void setConnector(ITerminalConnector connector) { diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/ISettingsPage.java b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/ISettingsPage.java index 51f6db07e2f..d4c0faca7a1 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/ISettingsPage.java +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/ISettingsPage.java @@ -47,11 +47,5 @@ public interface ISettingsPage { * @return true if the */ boolean validateSettings(); - - /** - * @return a name of the connection type. Used in a tab page title or drop - * down to select the connection. - */ - String getName(); } diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalConnector.java b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalConnector.java index e3331026c28..e606c494d10 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalConnector.java +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/ITerminalConnector.java @@ -28,10 +28,21 @@ import java.io.OutputStream; */ public interface ITerminalConnector { /** - * @return an ID of this connector. Typically getClass().getName() + * @return an ID of this connector. The id from the plugin.xml. + *

Note: return null because the framework takes + * care to get the value from the plugin.xml */ + // TODO: eliminate the need of implementing this NOOP method for extensions String getId(); + /** + * @return null the name (as specified in the plugin.xml) + *

Note: return null because the framework takes + * care to get the value from the plugin.xml + */ + // TODO: eliminate the need of implementing this NOOP method for extensions + String getName(); + /** * @return true if the contribution is functioning (e.g. all external libraries are * installed). This was added for the serial support, because it requires the java comm @@ -73,7 +84,7 @@ public interface ITerminalConnector { * {@link #connect(ITerminalControl)}. * * @param store a string based data store. Short keys like "foo" can be used to - * store the state of the connectio. + * store the state of the connection. */ void load(ISettingsStore store); @@ -91,11 +102,9 @@ public interface ITerminalConnector { ISettingsPage makeSettingsPage(); /** - * @param connectedLabel a String with the connected state {@link TerminalState}. - * Like "CONNECTED", "CLOSED". Can be used to build up the status string. * @return A string that represents the state of the connection. * TODO: Michael Scharf: */ - String getStatusString(String connectedLabel); + String getSettingsSummary(); } diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/TerminalConnectorExtension.java b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/TerminalConnectorExtension.java index 4e8d001a0c5..f699304c081 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/TerminalConnectorExtension.java +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/provisional/api/TerminalConnectorExtension.java @@ -11,6 +11,7 @@ *******************************************************************************/ package org.eclipse.tm.internal.terminal.provisional.api; +import java.io.OutputStream; import java.util.ArrayList; import java.util.List; @@ -33,6 +34,138 @@ import org.eclipse.tm.internal.terminal.control.impl.TerminalPlugin; *

*/ public class TerminalConnectorExtension { + /** + * A placeholder for the ITerminalConnector. It gets initialized when + * the real connector is needed. + * The following methods can be called without initializing + * the contributed class: {@link #getId()}, {@link #getName()}, + * {@link #getSettingsSummary()},{@link #load(ISettingsStore)}, + * {@link #setTerminalSize(int, int)}, {@link #save(ISettingsStore)} + * + */ + static public class TerminalConnectorProxy implements ITerminalConnector { + /** + * The connector + */ + private ITerminalConnector fConnector; + /** + * The plugin contribution, needed for lazy initialization + * of {@link #fConnector} + */ + private final IConfigurationElement fConfig; + /** + * 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; + + TerminalConnectorProxy(IConfigurationElement config) { + fConfig=config; + } + public String getId() { + String id = fConfig.getAttribute("id"); //$NON-NLS-1$ + if(id==null || id.length()==0) + id=fConfig.getAttribute("class"); //$NON-NLS-1$ + return id; + } + public String getName() { + String name= fConfig.getAttribute("name"); //$NON-NLS-1$ + if(name==null || name.length()==0) { + name=getId(); + } + return name; + } + private ITerminalConnector getConnector() { + if(!isInitialized()) { + try { + fConnector=createConnector(fConfig); + if(!fConnector.isInstalled()) + throw new RuntimeException(getName()+ " is not properly installed!"); //$NON-NLS-1$ + } catch (Exception e) { + fException=e; + } + if(fConnector!=null && fStore!=null) + fConnector.load(fStore); + } + if(fConnector==null) { + throw new RuntimeException(fException); + } + return fConnector; + } + private boolean isInitialized() { + return fConnector!=null || fException!=null; + } + public void connect(ITerminalControl control) { + getConnector().connect(control); + } + public void disconnect() { + getConnector().disconnect(); + } + public OutputStream getOutputStream() { + return getConnector().getOutputStream(); + } + public String getSettingsSummary() { + if(fConnector!=null) + return getConnector().getSettingsSummary(); + else + // TODO: see TerminalView.getSettingsSummary + return "?"; //$NON-NLS-1$ + } + public boolean isInstalled() { + if(isInitialized() && fConnector==null) + return false; + return getConnector().isInstalled(); + } + public boolean isLocalEcho() { + return getConnector().isLocalEcho(); + } + public void load(ISettingsStore store) { + if(fConnector==null) { + fStore=store; + } else { + getConnector().load(store); + } + } + public ISettingsPage makeSettingsPage() { + return getConnector().makeSettingsPage(); + } + public void save(ISettingsStore store) { + // no need to save the settings: it cannot have changed + // because we are not initialized.... + if(!isInstalled()) + getConnector().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); + } + } + } + /** + * @return null or a new connector created from the extension + */ + static private ITerminalConnector createConnector(IConfigurationElement config) throws Exception { + try { + Object obj=config.createExecutableExtension("class"); //$NON-NLS-1$ + if(obj instanceof ITerminalConnector) { + ITerminalConnector conn=(ITerminalConnector) obj; + if(conn.isInstalled()) + return conn; + } + } catch (Exception e) { + log(e); + throw e; + } + return null; + } /** * @return a new list of ITerminalConnectors. */ @@ -40,18 +173,7 @@ public class TerminalConnectorExtension { IConfigurationElement[] config=RegistryFactory.getRegistry().getConfigurationElementsFor("org.eclipse.tm.terminal.terminalConnector"); //$NON-NLS-1$ List result=new ArrayList(); for (int i = 0; i < config.length; i++) { - try { - Object obj=config[i].createExecutableExtension("class"); //$NON-NLS-1$ - if(obj instanceof ITerminalConnector) { - ITerminalConnector conn=(ITerminalConnector) obj; - if(conn.isInstalled()) - result.add(conn); - } - } catch (NoClassDefFoundError e) { - log(e); - } catch (Exception e) { - log(e); - } + result.add(new TerminalConnectorProxy(config[i])); } return (ITerminalConnector[]) result.toArray(new ITerminalConnector[result.size()]); } diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/ITelnetSettings.java b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/ITelnetSettings.java index f7626790b5f..c18879d45db 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/ITelnetSettings.java +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/ITelnetSettings.java @@ -17,7 +17,7 @@ public interface ITelnetSettings { String getHost(); int getNetworkPort(); int getTimeout(); - String getStatusString(String strConnected); + String getSummary(); void load(ISettingsStore store); void save(ISettingsStore store); } diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetConnection.java b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetConnection.java index 0d3786695df..b4b2370ce44 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetConnection.java +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetConnection.java @@ -392,12 +392,12 @@ public class TelnetConnection extends Thread implements TelnetCodes { * because a multi-byte TELNET command might be split between two (or more) * calls to this function. The state is preserved in field telnetState. * This function implements an FSA that recognizes TELNET option codes. - * TELNET option state is stored in instances of {@link TelnetOption}. - * TELNET option subnegotiation is delegated to instances of TelnetOption. + * TELNET option sub-negotiation is delegated to instances of TelnetOption. * * @return The number of bytes remaining in the buffer after removing all * TELNET protocol bytes. */ + //TELNET option state is stored in instances of TelnetOption. protected int processTelnetProtocol(int count) { // This is too noisy to leave on all the time. // Logger.log("Processing " + count + " bytes of data."); diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetConnector.java b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetConnector.java index 6227ba9e0e1..6a629fdac33 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetConnector.java +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetConnector.java @@ -42,7 +42,10 @@ public class TelnetConnector implements ITerminalConnector { this(new TelnetSettings()); } public String getId() { - return getClass().getName(); + return null; + } + public String getName() { + return null; } public TelnetConnector(TelnetSettings settings) { fSettings=settings; @@ -152,8 +155,8 @@ public class TelnetConnector implements ITerminalConnector { public ISettingsPage makeSettingsPage() { return new TelnetSettingsPage(fSettings); } - public String getStatusString(String strConnected) { - return fSettings.getStatusString(strConnected); + public String getSettingsSummary() { + return fSettings.getSummary(); } public void load(ISettingsStore store) { fSettings.load(store); diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetMessages.java b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetMessages.java index fbe93a9952d..a30525005e4 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetMessages.java +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetMessages.java @@ -17,7 +17,6 @@ public class TelnetMessages extends NLS { static { NLS.initializeMessages(TelnetMessages.class.getName(), TelnetMessages.class); } - public static String CONNTYPE_NETWORK; public static String PORT; public static String HOST; public static String CONNECTION_CLOSED_BY_FOREIGN_HOST; diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetMessages.properties b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetMessages.properties index 10ae2034795..4eec9152803 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetMessages.properties +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetMessages.properties @@ -14,7 +14,6 @@ # Michael Scharf (Wind River) - split into core, view and connector plugins # Martin Oberhuber (Wind River) - fixed copyright headers and beautified ############################################################################### -CONNTYPE_NETWORK = Telnet PORT = Port HOST = Host CONNECTION_CLOSED_BY_FOREIGN_HOST= Connection closed by foreign host. diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetSettings.java b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetSettings.java index fd90849ed91..0518b25d6cc 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetSettings.java +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetSettings.java @@ -47,11 +47,8 @@ public class TelnetSettings implements ITelnetSettings { fNetworkPort = strNetworkPort; } - public String getStatusString(String strConnected) { - return " (" + //$NON-NLS-1$ - getHost() + ":" + //$NON-NLS-1$ - getNetworkPortString() + " - " + //$NON-NLS-1$ - strConnected + ")"; //$NON-NLS-1$ + public String getSummary() { + return getHost() + ":" + getNetworkPortString(); //$NON-NLS-1$ } public void load(ISettingsStore store) { diff --git a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetSettingsPage.java b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetSettingsPage.java index a3be7a74758..732bdba8491 100644 --- a/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetSettingsPage.java +++ b/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/telnet/TelnetSettingsPage.java @@ -134,8 +134,4 @@ public class TelnetSettingsPage implements ISettingsPage { } } - public String getName() { - return TelnetMessages.CONNTYPE_NETWORK; - } - }