From 572bf57a40bb78298a91b9dd445d9b7e1250196c Mon Sep 17 00:00:00 2001 From: Michael Scharf Date: Wed, 11 Apr 2007 16:31:57 +0000 Subject: [PATCH] [173730] [terminal] Provide an optional input line editing field for dumb remote systems - created an interface ICommandInputField with 3 methods: createControl,dispose and setFont. - concrete class CommandInputFieldWithHistory creates a Text widget and keeps a history - ITerminalViewControl has [sg]etCommandInputField. If null no input field is shown. - TerminalView got new action TooggleCommandInputField - TerminalView uses concrete class CommandInputFieldWithHistory and saves history in memento. The idea is that all handling and widget creating is done in ICommandInputField. New fancy implementations with incremental search, history pop-up, history manager etc just have to implement ICommandInputField. Or enhance CommandInputFieldWithHistory... --- .../icons/clcl16/command_input_field.gif | Bin 0 -> 385 bytes .../icons/dlcl16/command_input_field.gif | Bin 0 -> 239 bytes .../icons/elcl16/command_input_field.gif | Bin 0 -> 239 bytes .../terminal/actions/ActionMessages.java | 1 + .../actions/ActionMessages.properties | 1 + .../terminal/actions/TerminalAction.java | 5 +- ...TerminalActionToggleCommandInputField.java | 36 ++++ .../internal/terminal/view/ITerminalView.java | 2 + .../internal/terminal/view/ImageConsts.java | 3 + .../internal/terminal/view/TerminalView.java | 49 +++++- .../terminal/view/TerminalViewPlugin.java | 3 + .../control/CommandInputFieldWithHistory.java | 164 ++++++++++++++++++ .../terminal/control/ICommandInputField.java | 35 ++++ .../control/ITerminalViewControl.java | 19 +- .../control/impl/TerminalControl.java | 66 +++++-- 15 files changed, 361 insertions(+), 23 deletions(-) create mode 100644 terminal/org.eclipse.tm.terminal.view/icons/clcl16/command_input_field.gif create mode 100644 terminal/org.eclipse.tm.terminal.view/icons/dlcl16/command_input_field.gif create mode 100644 terminal/org.eclipse.tm.terminal.view/icons/elcl16/command_input_field.gif create mode 100644 terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/TerminalActionToggleCommandInputField.java create mode 100644 terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/CommandInputFieldWithHistory.java create mode 100644 terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/ICommandInputField.java diff --git a/terminal/org.eclipse.tm.terminal.view/icons/clcl16/command_input_field.gif b/terminal/org.eclipse.tm.terminal.view/icons/clcl16/command_input_field.gif new file mode 100644 index 0000000000000000000000000000000000000000..9e3a547c145798fa08fb692df015a793213fbd1a GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/terminal/org.eclipse.tm.terminal.view/icons/dlcl16/command_input_field.gif b/terminal/org.eclipse.tm.terminal.view/icons/dlcl16/command_input_field.gif new file mode 100644 index 0000000000000000000000000000000000000000..f538ca707fc7480b4586effcebbb307e1979ae3b GIT binary patch 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$ literal 0 HcmV?d00001 diff --git a/terminal/org.eclipse.tm.terminal.view/icons/elcl16/command_input_field.gif b/terminal/org.eclipse.tm.terminal.view/icons/elcl16/command_input_field.gif new file mode 100644 index 0000000000000000000000000000000000000000..f538ca707fc7480b4586effcebbb307e1979ae3b GIT binary patch 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$ literal 0 HcmV?d00001 diff --git a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/ActionMessages.java b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/ActionMessages.java index 54ca7af2acb..11c91e393fd 100644 --- a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/ActionMessages.java +++ b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/ActionMessages.java @@ -24,6 +24,7 @@ public class ActionMessages extends NLS { } public static String NEW_TERMINAL; public static String CONNECT; + public static String TOGGLE_COMMAND_INPUT_FIELD; public static String DISCONNECT; public static String SETTINGS_ELLIPSE; public static String COPY; diff --git a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/ActionMessages.properties b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/ActionMessages.properties index b475440f688..62cc371b0cf 100644 --- a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/ActionMessages.properties +++ b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/ActionMessages.properties @@ -24,3 +24,4 @@ PASTE = Paste SELECTALL = Select All CLEARALL = Clear All SETTINGS = Settings +TOGGLE_COMMAND_INPUT_FIELD= Toggle Command Input Field diff --git a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/TerminalAction.java b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/TerminalAction.java index 33102f3885d..13b896fdb5f 100644 --- a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/TerminalAction.java +++ b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/TerminalAction.java @@ -25,7 +25,10 @@ import org.eclipse.tm.internal.terminal.view.TerminalViewPlugin; abstract public class TerminalAction extends Action { protected final ITerminalView fTarget; public TerminalAction(ITerminalView target, String strId) { - super(""); //$NON-NLS-1$ + this(target,strId,0); + } + public TerminalAction(ITerminalView target, String strId, int style) { + super("",style); //$NON-NLS-1$ fTarget = target; diff --git a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/TerminalActionToggleCommandInputField.java b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/TerminalActionToggleCommandInputField.java new file mode 100644 index 00000000000..17a29b17d7e --- /dev/null +++ b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/actions/TerminalActionToggleCommandInputField.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2007 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.actions; + +import org.eclipse.jface.action.IAction; +import org.eclipse.tm.internal.terminal.view.ITerminalView; +import org.eclipse.tm.internal.terminal.view.ImageConsts; + +public class TerminalActionToggleCommandInputField extends TerminalAction +{ + public TerminalActionToggleCommandInputField(ITerminalView target) + { + super(target, + TerminalActionToggleCommandInputField.class.getName(),IAction.AS_RADIO_BUTTON); + + setupAction(ActionMessages.TOGGLE_COMMAND_INPUT_FIELD, + ActionMessages.TOGGLE_COMMAND_INPUT_FIELD, + ImageConsts.IMAGE_CLCL_COMMAND_INPUT_FIELD, + ImageConsts.IMAGE_ELCL_COMMAND_INPUT_FIELD, + ImageConsts.IMAGE_DLCL_COMMAND_INPUT_FIELD, + true); + setChecked(fTarget.hasCommandInputField()); + } + public void run() { + fTarget.setCommandInputField(!fTarget.hasCommandInputField()); + setChecked(fTarget.hasCommandInputField()); + } +} diff --git a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ITerminalView.java b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ITerminalView.java index ce3809d4f83..65abe655307 100644 --- a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ITerminalView.java +++ b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ITerminalView.java @@ -26,4 +26,6 @@ public interface ITerminalView { public void onEditPaste(); public void onEditClearAll(); public void onEditSelectAll(); + public boolean hasCommandInputField(); + public void setCommandInputField(boolean on); } diff --git a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ImageConsts.java b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ImageConsts.java index c126ee80bc7..d09d6916bee 100644 --- a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ImageConsts.java +++ b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/ImageConsts.java @@ -41,4 +41,7 @@ public interface ImageConsts public static final String IMAGE_ELCL_CONNECT = "ImageElclConnect"; //$NON-NLS-1$ public static final String IMAGE_ELCL_DISCONNECT = "ImageElclDisconnect"; //$NON-NLS-1$ public static final String IMAGE_ELCL_SETTINGS = "ImageElclSettings"; //$NON-NLS-1$ + public static final String IMAGE_CLCL_COMMAND_INPUT_FIELD = "ImageClclCommandInputField";//$NON-NLS-1$ + public static final String IMAGE_ELCL_COMMAND_INPUT_FIELD = "ImageDlclCommandInputField";//$NON-NLS-1$ + public static final String IMAGE_DLCL_COMMAND_INPUT_FIELD = "ImageDlclCommandInputField";//$NON-NLS-1$ } diff --git a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalView.java b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalView.java index 3136b107c13..31482cdb438 100644 --- a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalView.java +++ b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalView.java @@ -44,6 +44,8 @@ import org.eclipse.tm.internal.terminal.actions.TerminalActionNewTerminal; import org.eclipse.tm.internal.terminal.actions.TerminalActionPaste; import org.eclipse.tm.internal.terminal.actions.TerminalActionSelectAll; import org.eclipse.tm.internal.terminal.actions.TerminalActionSettings; +import org.eclipse.tm.internal.terminal.actions.TerminalActionToggleCommandInputField; +import org.eclipse.tm.internal.terminal.control.CommandInputFieldWithHistory; import org.eclipse.tm.internal.terminal.control.ITerminalListener; import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; import org.eclipse.tm.internal.terminal.control.TerminalViewControlFactory; @@ -63,7 +65,13 @@ import org.eclipse.ui.actions.RetargetAction; import org.eclipse.ui.part.ViewPart; public class TerminalView extends ViewPart implements ITerminalView, ITerminalListener { - public static final String FONT_DEFINITION = "terminal.views.view.font.definition"; //$NON-NLS-1$ + 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_COMMAND_INPUT_FIELD_HISTORY = "CommandInputFieldHistory"; //$NON-NLS-1$ + + public static final String FONT_DEFINITION = "terminal.views.view.font.definition"; //$NON-NLS-1$ protected ITerminalViewControl fCtlTerminal; @@ -85,6 +93,8 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi protected TerminalAction fActionEditSelectAll; + protected TerminalAction fActionToggleCommandInputField; + protected TerminalMenuHandlerEdit fMenuHandlerEdit; protected TerminalPropertyChangeHandler fPropertyChangeHandler; @@ -93,6 +103,8 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi private SettingsStore fStore; + private CommandInputFieldWithHistory fCommandInputField; + public TerminalView() { Logger .log("==============================================================="); //$NON-NLS-1$ @@ -265,11 +277,7 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi } public void onTerminalFontChanged() { - fCtlTerminal.getCtlText().setFont(JFaceResources.getFont(FONT_DEFINITION)); - - // Tell the TerminalControl singleton that the font has changed. - - fCtlTerminal.onFontChanged(); + fCtlTerminal.setFont(JFaceResources.getFont(FONT_DEFINITION)); } public void onEditCopy() { @@ -379,20 +387,22 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi protected void setupControls(Composite wndParent) { ITerminalConnector[] connectors=TerminalConnectorExtension.getTerminalConnectors(); fCtlTerminal = TerminalViewControlFactory.makeControl(this, wndParent, connectors); - String connectionType=fStore.get("ConnectionType"); //$NON-NLS-1$ + String connectionType=fStore.get(STORE_CONNECTION_TYPE); for (int i = 0; i < connectors.length; i++) { connectors[i].load(getStore(connectors[i])); if(connectors[i].getId().equals(connectionType)) fCtlTerminal.setConnector(connectors[i]); } + setCommandInputField("true".equals(fStore.get(STORE_HAS_COMMAND_INPUT_FIELD))); //$NON-NLS-1$ } + private void saveSettings(ITerminalConnector connector) { ITerminalConnector[] connectors=fCtlTerminal.getConnectors(); for (int i = 0; i < connectors.length; i++) { connectors[i].save(getStore(connectors[i])); } if(connector!=null) { - fStore.put("ConnectionType",connector.getId()); //$NON-NLS-1$ + fStore.put(STORE_CONNECTION_TYPE,connector.getId()); } } @@ -403,6 +413,9 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi public void saveState(IMemento memento) { super.saveState(memento); + 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.saveState(memento); } private ISettingsStore getStore(ITerminalConnector connector) { @@ -419,6 +432,7 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi fActionEditPaste = new TerminalActionPaste(this); fActionEditClearAll = new TerminalActionClearAll(this); fActionEditSelectAll = new TerminalActionSelectAll(this); + fActionToggleCommandInputField = new TerminalActionToggleCommandInputField(this); IActionBars actionBars = getViewSite().getActionBars(); actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), fActionEditCopy); @@ -456,6 +470,7 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi toolBarMgr.add(fActionTerminalConnect); toolBarMgr.add(fActionTerminalDisconnect); toolBarMgr.add(fActionTerminalSettings); + toolBarMgr.add(fActionToggleCommandInputField); } protected void setupContextMenus() { @@ -481,6 +496,7 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi menuMgr.add(new Separator()); menuMgr.add(fActionEditClearAll); menuMgr.add(fActionEditSelectAll); + menuMgr.add(fActionToggleCommandInputField); // Other plug-ins can contribute there actions here menuMgr.add(new Separator("Additions")); //$NON-NLS-1$ @@ -625,4 +641,21 @@ public class TerminalView extends ViewPart implements ITerminalView, ITerminalLi } } } + + public boolean hasCommandInputField() { + return fCommandInputField!=null; + } + public void setCommandInputField(boolean on) { + // save the old history + if(fCommandInputField!=null) { + fStore.put(STORE_COMMAND_INPUT_FIELD_HISTORY, fCommandInputField.getHistory()); + fCommandInputField=null; + } + if(on) { + // TODO make history size configurable + fCommandInputField=new CommandInputFieldWithHistory(100); + fCommandInputField.setHistory(fStore.get(STORE_COMMAND_INPUT_FIELD_HISTORY)); + } + fCtlTerminal.setCommandInputField(fCommandInputField); + } } diff --git a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalViewPlugin.java b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalViewPlugin.java index 824dc64a330..80b9185c8ba 100644 --- a/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalViewPlugin.java +++ b/terminal/org.eclipse.tm.terminal.view/src/org/eclipse/tm/internal/terminal/view/TerminalViewPlugin.java @@ -49,6 +49,7 @@ public class TerminalViewPlugin extends AbstractUIPlugin { map.put(ImageConsts.IMAGE_CLCL_CONNECT, "connect_co.gif"); //$NON-NLS-1$ map.put(ImageConsts.IMAGE_CLCL_DISCONNECT, "disconnect_co.gif"); //$NON-NLS-1$ map.put(ImageConsts.IMAGE_CLCL_SETTINGS, "properties_tsk.gif"); //$NON-NLS-1$ + map.put(ImageConsts.IMAGE_CLCL_COMMAND_INPUT_FIELD, "command_input_field.gif"); //$NON-NLS-1$ loadImageRegistry(imageRegistry, ImageConsts.IMAGE_DIR_LOCALTOOL, map); @@ -59,6 +60,7 @@ public class TerminalViewPlugin extends AbstractUIPlugin { map.put(ImageConsts.IMAGE_ELCL_CONNECT, "connect_co.gif"); //$NON-NLS-1$ map.put(ImageConsts.IMAGE_ELCL_DISCONNECT, "disconnect_co.gif"); //$NON-NLS-1$ map.put(ImageConsts.IMAGE_ELCL_SETTINGS, "properties_tsk.gif"); //$NON-NLS-1$ + map.put(ImageConsts.IMAGE_ELCL_COMMAND_INPUT_FIELD, "command_input_field.gif"); //$NON-NLS-1$ loadImageRegistry(imageRegistry, ImageConsts.IMAGE_DIR_ELCL, map); @@ -69,6 +71,7 @@ public class TerminalViewPlugin extends AbstractUIPlugin { map.put(ImageConsts.IMAGE_DLCL_CONNECT, "connect_co.gif"); //$NON-NLS-1$ map.put(ImageConsts.IMAGE_DLCL_DISCONNECT, "disconnect_co.gif"); //$NON-NLS-1$ map.put(ImageConsts.IMAGE_DLCL_SETTINGS, "properties_tsk.gif"); //$NON-NLS-1$ + map.put(ImageConsts.IMAGE_DLCL_COMMAND_INPUT_FIELD, "command_input_field.gif"); //$NON-NLS-1$ loadImageRegistry(imageRegistry, ImageConsts.IMAGE_DIR_DLCL, map); diff --git a/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/CommandInputFieldWithHistory.java b/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/CommandInputFieldWithHistory.java new file mode 100644 index 00000000000..217746e533c --- /dev/null +++ b/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/CommandInputFieldWithHistory.java @@ -0,0 +1,164 @@ +/******************************************************************************* + * Copyright (c) 2007 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 java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +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.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Text; + + +/** + * Manages the Command History for the command line input + * of the terminal control. + * + */ +public class CommandInputFieldWithHistory implements ICommandInputField { + final List fHistory=new ArrayList(); + private int fHistoryPos=0; + private final int fMaxSize; + private boolean fInHistory=false; + private Text fInputField; + public CommandInputFieldWithHistory(int maxHistorySize) { + fMaxSize=maxHistorySize; + } + /** + * Add a line to the history. + * @param line + */ + protected void pushLine(String line) { + // if we used the history. therefore we added the current as 0th item + if(fInHistory) + fHistory.remove(0); + fInHistory=false; + fHistoryPos=0; + // 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) { + fHistory.clear(); + if(history==null) + return; + fHistory.addAll(Arrays.asList(history.split("\n"))); //$NON-NLS-1$ + } + /** + * @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=(String) 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 + * @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(!fInHistory) { + fInHistory=true; + fHistory.add(0,currLine); + } else { + fHistory.set(fHistoryPos,currLine); + } + if(fHistoryPos+count>=fHistory.size()) + return null; + if(fHistoryPos+count<0) + return null; + fHistoryPos+=count; + return (String) fHistory.get(fHistoryPos); + } + + /** + * Exit the history movements and go to position 0; + * @return the string to be shown in the command line + */ + protected String escape() { + if(!fInHistory) + return null; + fHistoryPos=0; + return (String) fHistory.get(fHistoryPos); + } + public void createControl(Composite parent,final ITerminalViewControl terminal) { + fInputField=new Text(parent, SWT.SINGLE|SWT.BORDER); + fInputField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + fInputField.setFont(terminal.getCtlText().getFont()); + fInputField.addKeyListener(new KeyListener(){ + public void keyPressed(KeyEvent e) { + if(e.keyCode=='\n' || e.keyCode=='\r') { + e.doit=false; + String line=fInputField.getText(); + if(!terminal.pasteString(line+"\n")) //$NON-NLS-1$ + 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() { + fInputField.dispose(); + fInputField=null; + + } +} \ No newline at end of file diff --git a/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/ICommandInputField.java b/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/ICommandInputField.java new file mode 100644 index 00000000000..4938a9f4f45 --- /dev/null +++ b/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/ICommandInputField.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2007 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/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java b/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java index d4d1fa23013..4fb3fd44dda 100644 --- a/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java +++ b/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/ITerminalViewControl.java @@ -13,6 +13,7 @@ package org.eclipse.tm.internal.terminal.control; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.dnd.Clipboard; +import org.eclipse.swt.graphics.Font; import org.eclipse.tm.terminal.ITerminalConnector; import org.eclipse.tm.terminal.TerminalState; @@ -22,7 +23,7 @@ import org.eclipse.tm.terminal.TerminalState; */ public interface ITerminalViewControl { boolean isEmpty(); - void onFontChanged(); + void setFont(Font font); StyledText getCtlText(); boolean isDisposed(); void selectAll(); @@ -40,7 +41,23 @@ public interface ITerminalViewControl { ITerminalConnector getTerminalConnection(); 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(); } \ No newline at end of file diff --git a/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/impl/TerminalControl.java b/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/impl/TerminalControl.java index 1af43ebf055..45d91169301 100644 --- a/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/impl/TerminalControl.java +++ b/terminal/org.eclipse.tm.terminal/src/org/eclipse/tm/internal/terminal/control/impl/TerminalControl.java @@ -35,11 +35,15 @@ import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.VerifyEvent; +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.Shell; +import org.eclipse.tm.internal.terminal.control.ICommandInputField; import org.eclipse.tm.internal.terminal.control.ITerminalListener; import org.eclipse.tm.internal.terminal.control.ITerminalViewControl; import org.eclipse.tm.terminal.ITerminalConnector; @@ -85,16 +89,16 @@ public class TerminalControl implements ITerminalControlForText, ITerminalContro private ITerminalConnector fConnector; private final ITerminalConnector[] fConnectors; + private ICommandInputField fCommandInputField; + private volatile TerminalState fState; public TerminalControl(ITerminalListener target, Composite wndParent, ITerminalConnector[] connectors) { fConnectors=connectors; fTerminalListener=target; - fWndParent = wndParent; - setTerminalText(new TerminalText(this)); - setupTerminal(); + setupTerminal(wndParent); } public ITerminalConnector[] getConnectors() { @@ -114,11 +118,7 @@ public class TerminalControl implements ITerminalControlForText, ITerminalContro public void paste() { TextTransfer textTransfer = TextTransfer.getInstance(); String strText = (String) fClipboard.getContents(textTransfer); - if (strText == null) - return; - for (int i = 0; i < strText.length(); i++) { - sendChar(strText.charAt(i), false); - } + pasteString(strText); // TODO paste in another thread.... to avoid blocking // new Thread() { // public void run() { @@ -130,6 +130,20 @@ public class TerminalControl implements ITerminalControlForText, ITerminalContro // }.start(); } + /** + * @param strText + */ + public boolean pasteString(String strText) { + if(!isConnected()) + return false; + if (strText == null) + return false; + for (int i = 0; i < strText.length(); i++) { + sendChar(strText.charAt(i), false); + } + return true; + } + /* (non-Javadoc) * @see org.eclipse.tm.terminal.ITerminalControl#selectAll() */ @@ -358,9 +372,9 @@ public class TerminalControl implements ITerminalControlForText, ITerminalContro /* (non-Javadoc) * @see org.eclipse.tm.terminal.ITerminalControl#setupTerminal() */ - public void setupTerminal() { + public void setupTerminal(Composite parent) { fState=TerminalState.CLOSED; - setupControls(); + setupControls(parent); setupListeners(); setupHelp(fWndParent, TerminalPlugin.HELP_VIEW); } @@ -368,11 +382,18 @@ public class TerminalControl implements ITerminalControlForText, ITerminalContro /* (non-Javadoc) * @see org.eclipse.tm.terminal.ITerminalControl#onFontChanged() */ - public void onFontChanged() { + public void setFont(Font font) { + getCtlText().setFont(font); + if(fCommandInputField!=null) { + fCommandInputField.setFont(font); + } + + // Tell the TerminalControl singleton that the font has changed. + getTerminalText().fontChanged(); } - protected void setupControls() { + protected void setupControls(Composite parent) { // The Terminal view now aims to be an ANSI-conforming terminal emulator, so it // can't have a horizontal scroll bar (but a vertical one is ok). Also, do // _not_ make the TextViewer read-only, because that prevents it from seeing a @@ -380,8 +401,15 @@ public class TerminalControl implements ITerminalControlForText, ITerminalContro // switch to another Workbench control). We prevent local keyboard input from // modifying the text in method TerminalVerifyKeyListener.verifyKey(). -// fViewer = new TextViewer(fWndParent, SWT.V_SCROLL); + fWndParent=new Composite(parent,SWT.NONE); + GridLayout layout=new GridLayout(); + layout.marginWidth=0; + layout.marginHeight=0; + + fWndParent.setLayout(layout); setCtlText(new StyledText(fWndParent, SWT.V_SCROLL)); + fCtlText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + fDisplay = getCtlText().getDisplay(); fClipboard = new Clipboard(fDisplay); @@ -791,4 +819,16 @@ public class TerminalControl implements ITerminalControlForText, ITerminalContro fConnector=connector; } + public ICommandInputField getCommandInputField() { + return fCommandInputField; + } + + public void setCommandInputField(ICommandInputField inputField) { + if(fCommandInputField!=null) + fCommandInputField.dispose(); + fCommandInputField=inputField; + if(fCommandInputField!=null) + fCommandInputField.createControl(fWndParent, this); + fWndParent.layout(true); + } }