From 49592b0d05e5b2525d8ab5e6aef8a0cc6e96b6fc Mon Sep 17 00:00:00 2001 From: Uwe Stieber Date: Wed, 18 Feb 2015 14:08:16 +0100 Subject: [PATCH] Terminals: Allow the use of Eclipse variables to specify the initial local terminal working directory within the Terminals View preferences --- .../feature.xml | 1 + .../META-INF/MANIFEST.MF | 2 + .../LocalWizardConfigurationPanel.java | 4 +- .../local/launcher/LocalLauncherDelegate.java | 25 ++++- .../te/ui/terminals/local/nls/Messages.java | 1 + .../terminals/local/nls/Messages.properties | 5 +- .../showin/ExternalExecutablesDialog.java | 4 +- .../showin/preferences/PreferencePage.java | 106 ++++++++++++++++-- .../process/ProcessSettingsPage.java | 2 +- .../AbstractExtendedConfigurationPanel.java | 2 +- .../te/ui/terminals/view/TerminalsView.java | 2 +- 11 files changed, 128 insertions(+), 26 deletions(-) diff --git a/features/org.eclipse.tcf.te.terminals.feature/feature.xml b/features/org.eclipse.tcf.te.terminals.feature/feature.xml index 3da816208d3..50fdbd81eec 100644 --- a/features/org.eclipse.tcf.te.terminals.feature/feature.xml +++ b/features/org.eclipse.tcf.te.terminals.feature/feature.xml @@ -41,6 +41,7 @@ + > executables = new ArrayList>(); /* default */ final Map images = new HashMap(); @@ -87,6 +95,10 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage */ @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) @@ -108,23 +120,51 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage Group group = new Group(panel, SWT.NONE); group.setText(Messages.PreferencePage_workingDir_label); - group.setLayout(new GridLayout(2, false)); + 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.RESOLVED || bundle.getState() == Bundle.ACTIVE)) { + 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(); + } 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(), 10); + layoutData.widthHint = Dialog.convertWidthInCharsToPixels(gc.getFontMetrics(), 14); browseButton.setLayoutData(layoutData); browseButton.addSelectionListener(new SelectionAdapter() { @Override @@ -149,7 +189,7 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage // ECLIPSE_WORKSPACE Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && (bundle.getState() == Bundle.RESOLVED || bundle.getState() == Bundle.ACTIVE)) { + 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) { @@ -168,7 +208,16 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage } else if (Messages.PreferencePage_workingDir_eclipsews_label.equals(text)) { dialog.setFilterPath(ew.toOSString()); } else if (text != null && !"".equals(text.trim())) { //$NON-NLS-1$ - dialog.setFilterPath(text.trim()); + 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(); @@ -188,12 +237,37 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage } }); + 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)) { + } 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)) { + } 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()); @@ -438,9 +512,9 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage 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)) { + } 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)) { + } 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()); @@ -467,8 +541,18 @@ public class PreferencePage extends org.eclipse.jface.preference.PreferencePage } 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 { - IPath p = new Path(text.trim()); - UIPlugin.getScopedPreferences().putString(IPreferenceKeys.PREF_LOCAL_TERMINAL_INITIAL_CWD, p.toFile().canRead() && p.toFile().isDirectory() ? p.toString() : null); + 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); diff --git a/plugins/org.eclipse.tcf.te.ui.terminals.process/src/org/eclipse/tcf/te/ui/terminals/process/ProcessSettingsPage.java b/plugins/org.eclipse.tcf.te.ui.terminals.process/src/org/eclipse/tcf/te/ui/terminals/process/ProcessSettingsPage.java index 150f6c6cbde..ab4d292ee4e 100644 --- a/plugins/org.eclipse.tcf.te.ui.terminals.process/src/org/eclipse/tcf/te/ui/terminals/process/ProcessSettingsPage.java +++ b/plugins/org.eclipse.tcf.te.ui.terminals.process/src/org/eclipse/tcf/te/ui/terminals/process/ProcessSettingsPage.java @@ -149,7 +149,7 @@ public class ProcessSettingsPage extends AbstractSettingsPage { } } else { Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && (bundle.getState() == Bundle.RESOLVED || bundle.getState() == Bundle.ACTIVE)) { + if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { dialog.setFilterPath(org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString()); } } diff --git a/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/panels/AbstractExtendedConfigurationPanel.java b/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/panels/AbstractExtendedConfigurationPanel.java index 63cd093112d..6277dc6c3d8 100644 --- a/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/panels/AbstractExtendedConfigurationPanel.java +++ b/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/panels/AbstractExtendedConfigurationPanel.java @@ -562,7 +562,7 @@ public abstract class AbstractExtendedConfigurationPanel extends AbstractConfigu private String getResourceEncoding() { String preference = null; Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && (bundle.getState() == Bundle.RESOLVED || bundle.getState() == Bundle.ACTIVE)) { + 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); } diff --git a/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/view/TerminalsView.java b/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/view/TerminalsView.java index 4120959fd91..86e750a8263 100644 --- a/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/view/TerminalsView.java +++ b/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/view/TerminalsView.java @@ -662,7 +662,7 @@ public class TerminalsView extends ViewPart implements ITerminalsView, IShowInTa Object adapted = null; Bundle bundle = Platform.getBundle("org.eclipse.core.resources"); //$NON-NLS-1$ - if (bundle != null && (bundle.getState() == Bundle.RESOLVED || bundle.getState() == Bundle.ACTIVE)) { + if (bundle != null && bundle.getState() != Bundle.UNINSTALLED && bundle.getState() != Bundle.STOPPING) { if (element instanceof org.eclipse.core.resources.IResource) continue; adapted = element instanceof IAdaptable ? ((IAdaptable)element).getAdapter(org.eclipse.core.resources.IResource.class) : null;