/******************************************************************************* * Copyright (c) 2003, 2008 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) - [168197] Replace JFace MessagDialog by SWT MessageBox * Martin Oberhuber (Wind River) - [168186] Add Terminal User Docs * Michael Scharf (Wind River) - [196454] Initial connection settings dialog should not be blank * Michael Scharf (Wind River) - [240023] Get rid of the terminal's "Pin" button * Martin Oberhuber (Wind River) - [206917] Add validation for Terminal Settings *******************************************************************************/ package com.netifera.platform.host.terminal.ui.view.internal; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IDialogSettings; 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.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage; import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; import com.netifera.platform.host.internal.terminal.ui.Activator; public class TerminalSettingsDialog extends Dialog { private Combo fCtlConnTypeCombo; private Text fTerminalTitleText; 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; private String fTerminalTitle; private String fTitle="Settings"; public TerminalSettingsDialog(Shell shell, ITerminalConnector[] connectors, ITerminalConnector connector) { super(shell); fConnectors=getValidConnectors(connectors); fPages=new ISettingsPage[fConnectors.length]; fPageIndex=new int[fConnectors.length]; fSelectedConnector=-1; for (int i = 0; i < fConnectors.length; i++) { if(fConnectors[i]==connector) fSelectedConnector=i; } } public void setTitle(String title) { fTitle=title; } /** * @param connectors * @return connectors excluding connectors with errors */ private ITerminalConnector[] getValidConnectors(ITerminalConnector[] connectors) { List list=new ArrayList(Arrays.asList(connectors)); for (Iterator iterator = list.iterator(); iterator.hasNext();) { ITerminalConnector info = (ITerminalConnector) iterator.next(); if(info.isInitialized() && info.getInitializationErrorMessage()!=null) iterator.remove(); } connectors=(ITerminalConnector[]) list.toArray(new ITerminalConnector[list.size()]); return connectors; } ISettingsPage getPage(int i) { if(fPages[i]==null) { if(fConnectors[i].getInitializationErrorMessage()!=null) { // create a error message final ITerminalConnector conn=fConnectors[i]; fPages[i]=new ISettingsPage(){ public void createControl(Composite parent) { Label l=new Label(parent,SWT.WRAP); String error="Connector "+conn.getName()+" not available"; l.setText(error); l.setForeground(l.getDisplay().getSystemColor(SWT.COLOR_RED)); String msg = "Cannot initialize connector "+conn.getName()+":\n"+conn.getInitializationErrorMessage(); // [168197] Replace JFace MessagDialog by SWT MessageBox //MessageDialog.openError(getShell(), error, msg); MessageBox mb = new MessageBox(getShell(), SWT.ICON_ERROR | SWT.OK); mb.setText(error); mb.setMessage(msg); mb.open(); } public void loadSettings() {} public void saveSettings() {} public boolean validateSettings() {return false;} }; } else { fPages[i]=fConnectors[i].makeSettingsPage(); } // TODO: what happens if an error occurs while // the control is partly created? 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 <code>Shell</code> 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()) { String strTitle = "Settings"; MessageBox mb = new MessageBox(getShell(), SWT.ICON_ERROR | SWT.OK); mb.setText(strTitle); mb.setMessage("The specified settings are invalid, please review or cancel."); mb.open(); return; } if(fSelectedConnector>=0) { getPage(fSelectedConnector).saveSettings(); } fTerminalTitle=fTerminalTitleText.getText(); super.okPressed(); } protected void cancelPressed() { fSelectedConnector=-1; super.cancelPressed(); } public int open() { setShellStyle(getShellStyle() | SWT.RESIZE); return super.open(); } protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(fTitle); } protected Control createDialogArea(Composite parent) { Composite ctlComposite = (Composite) super.createDialogArea(parent); //HACK PlatformUI.getWorkbench().getHelpSystem().setHelp(ctlComposite, TerminalViewPlugin.HELPPREFIX + "terminal_settings"); //$NON-NLS-1$ setupPanel(ctlComposite); setupListeners(); initFields(); return ctlComposite; } public void create() { super.create(); // initialize the OK button after creating the all dialog elements updateOKButton(); } private void initFields() { // Load controls for (int i = 0; i < fConnectors.length; i++) { fCtlConnTypeCombo.add(fConnectors[i].getName()); } int selectedConnector=getInitialConnector(); if(selectedConnector>=0) { fCtlConnTypeCombo.select(selectedConnector); selectPage(selectedConnector); } } /** * @return the connector to show when the dialog opens */ private int getInitialConnector() { // if there is a selection, use it if(fSelectedConnector>=0) return fSelectedConnector; // try the telnet connector, because it is the cheapest for (int i = 0; i < fConnectors.length; i++) { if("org.eclipse.tm.internal.terminal.telnet.TelnetConnector".equals(fConnectors[i].getId())) //$NON-NLS-1$ return i; } // if no telnet connector available, use the first one in the list if(fConnectors.length>0) return 0; return -1; } private boolean validateSettings() { if(fSelectedConnector<0) return true; return getPage(fSelectedConnector).validateSettings(); } private void setupPanel(Composite wndParent) { setupSettingsTypePanel(wndParent); if(fConnectors.length>0) { setupConnTypePanel(wndParent); setupSettingsGroup(wndParent); } } private void setupSettingsTypePanel(Composite wndParent) { Group wndGroup; GridLayout gridLayout; wndGroup = new Group(wndParent, SWT.NONE); gridLayout = new GridLayout(2, false); wndGroup.setLayout(gridLayout); wndGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); wndGroup.setText("View Settings"); Label label=new Label(wndGroup,SWT.NONE); label.setText("View Title"); label.setLayoutData(new GridData(GridData.BEGINNING)); fTerminalTitleText = new Text(wndGroup, SWT.BORDER); fTerminalTitleText.setText(fTerminalTitle); fTerminalTitleText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); } private void setupConnTypePanel(Composite wndParent) { Group wndGroup; GridLayout gridLayout; GridData gridData; wndGroup = new Group(wndParent, SWT.NONE); gridLayout = new GridLayout(1, true); gridData = new GridData(GridData.FILL_HORIZONTAL); wndGroup.setLayout(gridLayout); wndGroup.setLayoutData(gridData); wndGroup.setText("Connection Type:"); fCtlConnTypeCombo = new Combo(wndGroup, SWT.DROP_DOWN | SWT.READ_ONLY); gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.widthHint = 200; fCtlConnTypeCombo.setLayoutData(gridData); } private void setupSettingsGroup(Composite parent) { Group group = new Group(parent, SWT.NONE); group.setText("Settings:"); group.setLayout(new GridLayout()); group.setLayoutData(new GridData(GridData.FILL_BOTH)); fPageBook=new PageBook(group,SWT.NONE); fPageBook.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); } private void setupListeners() { if(fCtlConnTypeCombo==null) return; fCtlConnTypeCombo.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { selectPage(fCtlConnTypeCombo.getSelectionIndex()); } }); } public ITerminalConnector getConnector() { if(fSelectedConnector>=0) return fConnectors[fSelectedConnector]; return null; } private void selectPage(int index) { fSelectedConnector=index; getPage(index); Control[] pages=fPageBook.getChildren(); fPageBook.showPage(pages[fPageIndex[fSelectedConnector]]); updateOKButton(); } /** * enables the OK button if the user can create a connection */ private void updateOKButton() { // TODO: allow contributions to enable the OK button // enable the OK button if we have a valid connection selected if(getButton(IDialogConstants.OK_ID)!=null) { boolean enable=false; if(getConnector()!=null) enable=getConnector().getInitializationErrorMessage()==null; // enable the OK button if no connectors are available if(!enable && fConnectors.length==0) enable=true; getButton(IDialogConstants.OK_ID).setEnabled(enable); } } protected IDialogSettings getDialogBoundsSettings() { IDialogSettings ds = Activator.getInstance().getDialogSettings(); fDialogSettings = ds.getSection(getClass().getName()); if (fDialogSettings == null) { fDialogSettings = ds.addNewSection(getClass().getName()); } return fDialogSettings; } public void setTerminalTitle(String partName) { fTerminalTitle=partName; } public String getTerminalTitle() { return fTerminalTitle; } }