From 5349d8823d9e1d98d4529da1a1a0f12e14061864 Mon Sep 17 00:00:00 2001 From: Jonah Graham Date: Wed, 3 Jun 2020 23:11:29 -0400 Subject: [PATCH] Bug 522289: Handle case of no terminal connectors available The existing code had the assumption that >= 1 connector was installed in the IDE. It is difficult to configure the IDE with no connectors as the base terminal feature includes connectors, but it is technically possible. So in that case display a simple error message and avoid a hidden error (and stack trace to log). Change-Id: Id17a1e5bff9aec251aa6f7fe6ff4e96cd2a01564 --- .../internal/dialogs/ErrorSettingsPanel.java | 56 +++++++++++++++++++ .../dialogs/LaunchTerminalSettingsDialog.java | 41 ++++++++++++++ .../tm/terminal/view/ui/nls/Messages.java | 1 + .../terminal/view/ui/nls/Messages.properties | 1 + 4 files changed, 99 insertions(+) create mode 100644 terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/ErrorSettingsPanel.java diff --git a/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/ErrorSettingsPanel.java b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/ErrorSettingsPanel.java new file mode 100644 index 00000000000..4b09e67c9eb --- /dev/null +++ b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/ErrorSettingsPanel.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2020 Kichwa Coders Canada Inc. and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License 2.0 which accompanies this distribution, and is + * available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.tm.terminal.view.ui.internal.dialogs; + +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.Label; +import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; +import org.eclipse.tm.terminal.view.ui.panels.AbstractConfigurationPanel; + +/** + * An empty configuration panel implementation. + */ +public class ErrorSettingsPanel extends AbstractConfigurationPanel { + + private String errorMessage; + + /** + * Constructor. + * + * @param container The configuration panel container or null. + */ + public ErrorSettingsPanel(IConfigurationPanelContainer container, String errorMessage) { + super(container); + this.errorMessage = errorMessage; + } + + @Override + public void setupPanel(Composite parent) { + Composite panel = new Composite(parent, SWT.NONE); + panel.setLayout(new GridLayout()); + panel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + panel.setBackground(parent.getBackground()); + + if (errorMessage != null) { + Label label = new Label(panel, SWT.NONE); + label.setText(errorMessage); + } + + setControl(panel); + } + + @Override + public boolean isValid() { + return false; + } +} diff --git a/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/LaunchTerminalSettingsDialog.java b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/LaunchTerminalSettingsDialog.java index b4ef3437951..98ce9cc86c5 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/LaunchTerminalSettingsDialog.java +++ b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/internal/dialogs/LaunchTerminalSettingsDialog.java @@ -39,14 +39,18 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; +import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector; +import org.eclipse.tm.terminal.view.core.interfaces.ITerminalService.Done; import org.eclipse.tm.terminal.view.core.interfaces.constants.ITerminalsConnectorConstants; import org.eclipse.tm.terminal.view.ui.activator.UIPlugin; import org.eclipse.tm.terminal.view.ui.controls.ConfigurationPanelControl; import org.eclipse.tm.terminal.view.ui.help.IContextHelpIds; import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanel; +import org.eclipse.tm.terminal.view.ui.interfaces.IConfigurationPanelContainer; import org.eclipse.tm.terminal.view.ui.interfaces.IExternalExecutablesProperties; import org.eclipse.tm.terminal.view.ui.interfaces.ILauncherDelegate; import org.eclipse.tm.terminal.view.ui.interfaces.tracing.ITraceIds; +import org.eclipse.tm.terminal.view.ui.launcher.AbstractLauncherDelegate; import org.eclipse.tm.terminal.view.ui.launcher.LauncherDelegateManager; import org.eclipse.tm.terminal.view.ui.local.showin.ExternalExecutablesManager; import org.eclipse.tm.terminal.view.ui.nls.Messages; @@ -57,6 +61,12 @@ import org.eclipse.ui.PlatformUI; * Launch terminal settings dialog implementation. */ public class LaunchTerminalSettingsDialog extends TrayDialog { + /** + * Special label for terminal (not shown to user) when there are no terminal + * connectors installed. + */ + private static final String NO_CONNECTORS_LABEL = "none"; //$NON-NLS-1$ + private String contextHelpId = null; // The parent selection @@ -496,6 +506,37 @@ public class LaunchTerminalSettingsDialog extends TrayDialog { } + if (items.isEmpty()) { + // No connectors at all installed - display warning to user. + ILauncherDelegate noDelegate = new AbstractLauncherDelegate() { + + @Override + public boolean needsUserConfiguration() { + return false; + } + + @Override + public IConfigurationPanel getPanel(IConfigurationPanelContainer container) { + return new ErrorSettingsPanel(container, + Messages.LaunchTerminalSettingsDialog_error_no_terminal_connectors); + } + + @Override + public void execute(Map properties, Done done) { + throw new UnsupportedOperationException(); + } + + @Override + public ITerminalConnector createTerminalConnector(Map properties) { + throw new UnsupportedOperationException(); + } + + }; + + label2delegate.put(NO_CONNECTORS_LABEL, noDelegate); + items.add(NO_CONNECTORS_LABEL); + } + return items; } diff --git a/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.java b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.java index f0f7dc2638e..84bbfc1e720 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.java +++ b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.java @@ -106,6 +106,7 @@ public class Messages extends NLS { public static String LaunchTerminalSettingsDialog_error_title; public static String LaunchTerminalSettingsDialog_error_invalidSettings; + public static String LaunchTerminalSettingsDialog_error_no_terminal_connectors; public static String LaunchTerminalSettingsDialog_error_unknownReason; public static String EncodingSelectionDialog_title; diff --git a/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.properties b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.properties index 1c3fa7bf79b..e0ecf2bf134 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.properties +++ b/terminal/plugins/org.eclipse.tm.terminal.view.ui/src/org/eclipse/tm/terminal/view/ui/nls/Messages.properties @@ -64,6 +64,7 @@ LaunchTerminalSettingsDialog_error_title=Terminal Settings LaunchTerminalSettingsDialog_error_invalidSettings=The specified settings are invalid\n\n\ {0}\n\n\ Please review and specify valid settings. Or cancel the settings dialog to abort. +LaunchTerminalSettingsDialog_error_no_terminal_connectors=There are no types of terminals installed. Please install a terminal connector LaunchTerminalSettingsDialog_error_unknownReason=Cannot determine specifically which setting is invalid. EncodingSelectionDialog_title=Encoding