/* * Copyright 2008-2012 Amazon Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://aws.amazon.com/apache2.0 * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES * OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and * limitations under the License. */ package com.amazonaws.eclipse.ec2.preferences; import org.eclipse.jface.preference.FileFieldEditor; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.preference.StringFieldEditor; 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.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Link; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import com.amazonaws.eclipse.core.ui.WebLinkListener; import com.amazonaws.eclipse.ec2.Ec2Plugin; import com.amazonaws.eclipse.ec2.PlatformUtils; /** * Preference page for configuring how external tools (ex: ssh clients) are invoked. */ public class ExternalToolsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private FileFieldEditor terminalExecutable; private FileFieldEditor sshClient; private StringFieldEditor sshOptions; private FileFieldEditor puttyExecutable; private StringFieldEditor sshUser; private static final int MAX_FIELD_EDITOR_COLUMNS = 3; public ExternalToolsPreferencePage() { super("External Tool Configuration"); setPreferenceStore(Ec2Plugin.getDefault().getPreferenceStore()); setDescription("External Tool Configuration"); } public void init(IWorkbench workbench) {} /* (non-Javadoc) * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite) */ @Override protected Control createContents(Composite parent) { Composite top = new Composite(parent, SWT.LEFT); // Sets the layout data for the top composite's // place in its parent's layout. top.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); top.setLayout(new GridLayout()); Group sshClientGroup = new Group(top, SWT.LEFT); sshClientGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); sshClientGroup.setText("SSH Client:"); PlatformUtils platformUtils = new PlatformUtils(); if (platformUtils.isWindows()) { String puttyUrl = "http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html"; WebLinkListener webLinkListener = new WebLinkListener(); Link l = new Link(sshClientGroup, SWT.NONE); l.setText("PuTTY is required for remote shell connections " + "to EC2 instances from Windows. \nYou can download it for free " + "from <a href=\"" + puttyUrl + "\">" + puttyUrl + "</a>."); l.addListener(SWT.Selection, webLinkListener); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = MAX_FIELD_EDITOR_COLUMNS; l.setLayoutData(data); puttyExecutable = newFileFieldEditor(PreferenceConstants.P_PUTTY_EXECUTABLE, "PuTTY Executable:", sshClientGroup); } else { // For the Mac, we use a custom AppleScript script that we ship with the // plugin so we don't need a seperate terminal exectuable. if (!platformUtils.isMac()) { terminalExecutable = newFileFieldEditor(PreferenceConstants.P_TERMINAL_EXECUTABLE, "Terminal:", sshClientGroup); } sshClient = newFileFieldEditor(PreferenceConstants.P_SSH_CLIENT, "SSH Client:", sshClientGroup); sshOptions = new StringFieldEditor(PreferenceConstants.P_SSH_OPTIONS, "SSH Options: ", sshClientGroup); sshOptions.setPage(this); sshOptions.setPreferenceStore(this.getPreferenceStore()); sshOptions.load(); sshOptions.fillIntoGrid(sshClientGroup, MAX_FIELD_EDITOR_COLUMNS); } sshUser = new StringFieldEditor(PreferenceConstants.P_SSH_USER, "SSH User: ", sshClientGroup); sshUser.setPage(this); sshUser.setPreferenceStore(this.getPreferenceStore()); sshUser.load(); sshUser.fillIntoGrid(sshClientGroup, MAX_FIELD_EDITOR_COLUMNS); // Reset the layout to three columns after the FieldEditors have mucked with it GridLayout layout = (GridLayout)(sshClientGroup.getLayout()); layout.numColumns = MAX_FIELD_EDITOR_COLUMNS; layout.marginWidth = 10; layout.marginHeight = 8; return top; } /* (non-Javadoc) * @see org.eclipse.jface.preference.PreferencePage#performDefaults() */ @Override protected void performDefaults() { if (terminalExecutable != null) terminalExecutable.loadDefault(); if (sshClient != null) sshClient.loadDefault(); if (sshOptions != null) sshOptions.loadDefault(); if (sshUser != null) sshUser.loadDefault(); if (puttyExecutable != null) puttyExecutable.loadDefault(); super.performDefaults(); } /* (non-Javadoc) * @see org.eclipse.jface.preference.PreferencePage#performOk() */ @Override public boolean performOk() { if (terminalExecutable != null) terminalExecutable.store(); if (sshClient != null) sshClient.store(); if (sshOptions != null) sshOptions.store(); if (sshUser != null) sshUser.store(); if (puttyExecutable != null) puttyExecutable.store(); return super.performOk(); } /* * Private Interface */ /** * Convenience method for creating a FileFieldEditor. * * @param preferenceName * The preference managed by this FileFieldEditor. * @param label * The label for this FieldEditor. * @param parent * The parent for this new FieldEditor widget. * * @return The new FileFieldEditor. */ private FileFieldEditor newFileFieldEditor(String preferenceName, String label, Composite parent) { FileFieldEditor editor = new FileFieldEditor(preferenceName, label, parent); editor.setPage(this); editor.setPreferenceStore(this.getPreferenceStore()); editor.load(); editor.fillIntoGrid(parent, MAX_FIELD_EDITOR_COLUMNS); return editor; } }