diff --git a/bundles/org.eclipse.remote.console/.project b/bundles/org.eclipse.remote.console/.project index 0d4f3afa834..da0bcc42ec2 100644 --- a/bundles/org.eclipse.remote.console/.project +++ b/bundles/org.eclipse.remote.console/.project @@ -20,9 +20,15 @@ + + org.eclipse.pde.api.tools.apiAnalysisBuilder + + + org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature + org.eclipse.pde.api.tools.apiAnalysisNature diff --git a/bundles/org.eclipse.remote.console/META-INF/MANIFEST.MF b/bundles/org.eclipse.remote.console/META-INF/MANIFEST.MF index 07fd923b4ba..581674f3964 100644 --- a/bundles/org.eclipse.remote.console/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.remote.console/META-INF/MANIFEST.MF @@ -2,13 +2,14 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.remote.console;singleton:=true -Bundle-Version: 1.0.0.qualifier +Bundle-Version: 1.1.0.qualifier Bundle-Activator: org.eclipse.remote.internal.console.Activator Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Bundle-ActivationPolicy: lazy Bundle-Vendor: %pluginProvider -Export-Package: org.eclipse.remote.console +Export-Package: org.eclipse.remote.console, + org.eclipse.remote.console.actions Import-Package: org.eclipse.core.commands, org.eclipse.core.runtime, org.eclipse.core.runtime.jobs, diff --git a/bundles/org.eclipse.remote.console/plugin.xml b/bundles/org.eclipse.remote.console/plugin.xml index 592289c59f4..c016588a867 100644 --- a/bundles/org.eclipse.remote.console/plugin.xml +++ b/bundles/org.eclipse.remote.console/plugin.xml @@ -1,6 +1,7 @@ + org.eclipse.remote.console - 1.0.0-SNAPSHOT + 1.1.0-SNAPSHOT eclipse-plugin diff --git a/bundles/org.eclipse.remote.console/schema/consoleToolbar.exsd b/bundles/org.eclipse.remote.console/schema/consoleToolbar.exsd new file mode 100644 index 00000000000..0b1adee0416 --- /dev/null +++ b/bundles/org.eclipse.remote.console/schema/consoleToolbar.exsd @@ -0,0 +1,116 @@ + + + + + + + + + [Enter description of this extension point.] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Identifier for this action + + + + + + + The connection type this Action applies to + + + + + + + A class implementing IConsoleActionFactory to be called to create the Action + + + + + + + + + + + + + + + [Enter the first release in which this extension point appears.] + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + diff --git a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/console/TerminalConsoleUtility.java b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/console/TerminalConsoleUtility.java index a9af9f255e6..ff532694f83 100644 --- a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/console/TerminalConsoleUtility.java +++ b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/console/TerminalConsoleUtility.java @@ -17,13 +17,15 @@ import org.eclipse.remote.internal.console.TerminalConsoleFactory; import org.eclipse.ui.console.IConsole; /** - * A collection of public API utility methods to open - * consoles to IRemoteConnection objects + * A collection of public API utility methods to open consoles to + * IRemoteConnection objects + * + * @since 1.1 */ public class TerminalConsoleUtility { /** - * Opens a dialog to allow selection of an IRemoteConnection, - * encoding, etc. and then open a console to it. + * Opens a dialog to allow selection of an IRemoteConnection, encoding, etc. + * and then open a console to it. */ public void openConsole() { new TerminalConsoleFactory().openConsole(); diff --git a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleAction.java b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/ConsoleAction.java similarity index 67% rename from bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleAction.java rename to bundles/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/ConsoleAction.java index 9df1416479b..0b5d60c97d6 100644 --- a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleAction.java +++ b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/ConsoleAction.java @@ -8,13 +8,16 @@ * Contributors: * QNX Software Systems - Initial API and implementation *******************************************************************************/ -package org.eclipse.remote.internal.console.actions; +package org.eclipse.remote.console.actions; import org.eclipse.jface.action.Action; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.remote.internal.console.Activator; +/** + * @since 1.1 + */ public abstract class ConsoleAction extends Action { public ConsoleAction(String id) { this(id, 0); @@ -25,27 +28,20 @@ public abstract class ConsoleAction extends Action { setId(id); } - protected void setupAction(String text, String tooltip, - String image, String enabledImage, String disabledImage, + protected void setupAction(String text, String tooltip, String image, String enabledImage, String disabledImage, boolean enabled) { ImageRegistry imageRegistry = Activator.getDefault().getImageRegistry(); setupAction(text, tooltip, image, enabledImage, disabledImage, enabled, imageRegistry); } - protected void setupAction(String text, String tooltip, - String hoverImage, String enabledImage, String disabledImage, - boolean enabled, ImageRegistry imageRegistry) { - setupAction(text, - tooltip, - imageRegistry.getDescriptor(hoverImage), - imageRegistry.getDescriptor(enabledImage), - imageRegistry.getDescriptor(disabledImage), - enabled); + protected void setupAction(String text, String tooltip, String hoverImage, String enabledImage, + String disabledImage, boolean enabled, ImageRegistry imageRegistry) { + setupAction(text, tooltip, imageRegistry.getDescriptor(hoverImage), imageRegistry.getDescriptor(enabledImage), + imageRegistry.getDescriptor(disabledImage), enabled); } - protected void setupAction(String text, String tooltip, - ImageDescriptor hoverImage, ImageDescriptor enabledImage, ImageDescriptor disabledImage, - boolean enabled) { + protected void setupAction(String text, String tooltip, ImageDescriptor hoverImage, ImageDescriptor enabledImage, + ImageDescriptor disabledImage, boolean enabled) { setText(text); setToolTipText(tooltip); setEnabled(enabled); diff --git a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/IConsoleActionFactory.java b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/IConsoleActionFactory.java new file mode 100644 index 00000000000..fff843a7a30 --- /dev/null +++ b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/console/actions/IConsoleActionFactory.java @@ -0,0 +1,20 @@ +/******************************************************************************* + * Copyright (c) 2016 QNX Software Systems 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: + * QNX Software Systems - Initial API and implementation + *******************************************************************************/ +package org.eclipse.remote.console.actions; + +import org.eclipse.core.runtime.IAdaptable; + +/** + * @since 1.1 + */ +public interface IConsoleActionFactory { + public ConsoleAction createAction(String actionId, String connectionType, IAdaptable adapter); +} diff --git a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsole.java b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsole.java index 8fdfc7b3d7a..011ad72b278 100644 --- a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsole.java +++ b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsole.java @@ -20,7 +20,6 @@ import org.eclipse.ui.console.IConsoleView; import org.eclipse.ui.part.IPageBookViewPage; import org.eclipse.ui.progress.UIJob; -@SuppressWarnings("restriction") public class TerminalConsole extends AbstractConsole { private final String encoding; private final TerminalConsoleConnector terminalConnector; diff --git a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleExtensionManager.java b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleExtensionManager.java new file mode 100644 index 00000000000..f9cbdb6e9f9 --- /dev/null +++ b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsoleExtensionManager.java @@ -0,0 +1,89 @@ +/******************************************************************************* + * Copyright (c) 2016 QNX Software Systems 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: + * QNX Software Systems - Initial API and implementation + *******************************************************************************/ +package org.eclipse.remote.internal.console; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtension; +import org.eclipse.core.runtime.IExtensionPoint; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.Platform; +import org.eclipse.remote.console.actions.IConsoleActionFactory; + +public class TerminalConsoleExtensionManager { + private static TerminalConsoleExtensionManager instance; + private Map> actions; + private Map factories; + private Map elements; + + private TerminalConsoleExtensionManager() { + } + + public static TerminalConsoleExtensionManager getInstance() { + if (instance == null) { + instance = new TerminalConsoleExtensionManager(); + } + return instance; + } + + public List getActionsForType(String id) { + initialize(); + List list = actions.get(id); + return list == null ? new ArrayList() : list; + } + + public IConsoleActionFactory getFactory(String id) { + return factories.get(id); + } + + private void initialize() { + if (actions == null) { + actions = new LinkedHashMap<>(); + elements = new LinkedHashMap<>(); + factories = new HashMap<>(); + IExtensionRegistry registry = Platform.getExtensionRegistry(); + IExtensionPoint point = registry + .getExtensionPoint(Activator.getDefault().getBundle().getSymbolicName() + ".toolbar"); + for (IExtension extension : point.getExtensions()) { + for (IConfigurationElement element : extension.getConfigurationElements()) { + String id = element.getAttribute("id"); //$NON-NLS-1$ + if (id != null) { + elements.put(id, element); + IConsoleActionFactory factory = null; + try { + factory = (IConsoleActionFactory) element.createExecutableExtension("actionFactory"); + } catch (CoreException e) { + Activator.log(e); + } + if (factory != null) { + String connectionType = element.getAttribute("connectionType"); + if (connectionType != null) { + List actionList = actions.get(connectionType); + if (actionList == null) { + actionList = new ArrayList<>(); + } + actionList.add(id); + actions.put(connectionType, actionList); + factories.put(id, factory); + } + } + } + } + } + } + } +} diff --git a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsolePage.java b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsolePage.java index c426ecf77c5..4e10ee677cd 100644 --- a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsolePage.java +++ b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/TerminalConsolePage.java @@ -11,7 +11,9 @@ package org.eclipse.remote.internal.console; import java.io.UnsupportedEncodingException; +import java.util.List; +import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; @@ -20,6 +22,9 @@ import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.osgi.util.NLS; +import org.eclipse.remote.console.actions.ConsoleAction; +import org.eclipse.remote.console.actions.IConsoleActionFactory; +import org.eclipse.remote.core.IRemoteConnection; import org.eclipse.remote.internal.console.actions.ConsoleActionConnect; import org.eclipse.remote.internal.console.actions.ConsoleActionDisconnect; import org.eclipse.remote.internal.console.actions.ConsoleActionScrollLock; @@ -40,9 +45,9 @@ import org.eclipse.ui.part.IPageSite; import org.eclipse.ui.part.Page; import org.eclipse.ui.progress.UIJob; -@SuppressWarnings("restriction") -public class TerminalConsolePage extends Page { +public class TerminalConsolePage extends Page implements IAdaptable { public static final String TOOLBAR_GROUP_ID = "org.eclipse.remote.internal.terminal.console.Toolbar"; //$NON-NLS-1$ + public static final String CONTRIBUTIONS_GROUP_ID = "org.eclipse.remote.internal.terminal.console.Toolbar.contributions"; //$NON-NLS-1$ private final ConsoleActionConnect connectAction; private final ConsoleActionDisconnect disconnectAction; @@ -89,10 +94,29 @@ public class TerminalConsolePage extends Page { super.init(pageSite); IToolBarManager toolBarManager = pageSite.getActionBars().getToolBarManager(); toolBarManager.insertBefore(IConsoleConstants.OUTPUT_GROUP, new GroupMarker(TOOLBAR_GROUP_ID)); + toolBarManager.appendToGroup(TOOLBAR_GROUP_ID, connectAction); toolBarManager.appendToGroup(TOOLBAR_GROUP_ID, disconnectAction); toolBarManager.appendToGroup(TOOLBAR_GROUP_ID, new ConsoleActionScrollLock(this)); toolBarManager.appendToGroup(TOOLBAR_GROUP_ID, new CloseConsoleAction(terminalConsole)); + + toolBarManager.insertAfter(TOOLBAR_GROUP_ID, new GroupMarker(CONTRIBUTIONS_GROUP_ID)); + + addToolbarContributions(toolBarManager); + } + + private void addToolbarContributions(IToolBarManager toolBarManager) { + String connectionType = terminalConsole.getConnection().getConnectionType().getId(); + List actions = TerminalConsoleExtensionManager.getInstance().getActionsForType(connectionType); + for (String id : actions) { + IConsoleActionFactory factory = TerminalConsoleExtensionManager.getInstance().getFactory(id); + if (factory != null) { + ConsoleAction action = factory.createAction(id, connectionType, this); + if (action != null) { + toolBarManager.appendToGroup(CONTRIBUTIONS_GROUP_ID, action); + } + } + } } @Override @@ -175,4 +199,22 @@ public class TerminalConsolePage extends Page { return Status.OK_STATUS; } } + + /* (non-Javadoc) + * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) + */ + @SuppressWarnings("unchecked") + @Override + public T getAdapter(Class adapter) { + if (adapter.equals(IRemoteConnection.class)) { + return (T) terminalConsole.getConnection(); + } + if (adapter.equals(TerminalConsole.class)) { + return (T) terminalConsole; + } + if (adapter.equals(TerminalConsolePage.class)) { + return (T) this; + } + return null; + } } diff --git a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionConnect.java b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionConnect.java index e3c97bf1f26..a830e8099e7 100644 --- a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionConnect.java +++ b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionConnect.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.remote.internal.console.actions; +import org.eclipse.remote.console.actions.ConsoleAction; import org.eclipse.remote.internal.console.ImageConsts; import org.eclipse.remote.internal.console.TerminalConsole; diff --git a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionDisconnect.java b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionDisconnect.java index b567063320b..3bece3b02ee 100644 --- a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionDisconnect.java +++ b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionDisconnect.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.remote.internal.console.actions; +import org.eclipse.remote.console.actions.ConsoleAction; import org.eclipse.remote.internal.console.ImageConsts; import org.eclipse.remote.internal.console.TerminalConsole; diff --git a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionScrollLock.java b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionScrollLock.java index 28c7e4a3fb2..19c4596d787 100644 --- a/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionScrollLock.java +++ b/bundles/org.eclipse.remote.console/src/org/eclipse/remote/internal/console/actions/ConsoleActionScrollLock.java @@ -11,6 +11,7 @@ package org.eclipse.remote.internal.console.actions; import org.eclipse.jface.action.IAction; +import org.eclipse.remote.console.actions.ConsoleAction; import org.eclipse.remote.internal.console.ImageConsts; import org.eclipse.remote.internal.console.TerminalConsolePage; diff --git a/features/org.eclipse.remote.console-feature/feature.xml b/features/org.eclipse.remote.console-feature/feature.xml index 14ed3912518..49d35e74d2d 100644 --- a/features/org.eclipse.remote.console-feature/feature.xml +++ b/features/org.eclipse.remote.console-feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/features/org.eclipse.remote.console-feature/pom.xml b/features/org.eclipse.remote.console-feature/pom.xml index df3490c9d6b..b472f1db86a 100644 --- a/features/org.eclipse.remote.console-feature/pom.xml +++ b/features/org.eclipse.remote.console-feature/pom.xml @@ -12,7 +12,7 @@ org.eclipse.remote.features org.eclipse.remote.console - 2.0.2-SNAPSHOT + 2.1.0-SNAPSHOT eclipse-feature