1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-28 19:35:36 +02:00

Merge "Bug 467350 - Public API to open consoles"

This commit is contained in:
Doug Schaefer 2015-05-21 16:49:20 -04:00 committed by Gerrit Code Review @ Eclipse.org
commit ce6a031731
3 changed files with 121 additions and 37 deletions

View file

@ -0,0 +1,49 @@
/*******************************************************************************
* Copyright (c) 2015 Red Hat 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
*
* Contributors:
* Red Hat Inc. - Initial API and implementation
*******************************************************************************/
package org.eclipse.remote.console;
import java.util.List;
import org.eclipse.remote.core.IRemoteConnection;
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
*/
public class TerminalConsoleUtility {
/**
* Opens a dialog to allow selection of an IRemoteConnection,
* encoding, etc. and then open a console to it.
*/
public void openConsole() {
new TerminalConsoleFactory().openConsole();
}
/**
* Open a specific IRemoteConnection and encoding combination.
* @param connection
* @param encoding
*/
public static void openConsole(final IRemoteConnection connection, final String encoding) {
new TerminalConsoleFactory().openConsole(connection, encoding);
}
/**
* Find an existing console for the given IRemoteConnection
* @param connection
* @return
*/
public static List<IConsole> findConsole(IRemoteConnection connection) {
return new TerminalConsoleFactory().findConsole(connection);
}
}

View file

@ -10,6 +10,9 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.remote.internal.console; package org.eclipse.remote.internal.console;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Status;
@ -36,48 +39,80 @@ public class TerminalConsoleFactory implements IConsoleFactory {
} }
public static void openConsole(final IRemoteConnection connection, final String encoding) { public static void openConsole(final IRemoteConnection connection, final String encoding) {
new Job(ConsoleMessages.OPENNING_TERMINAL) { Job j = new Job(ConsoleMessages.OPENNING_TERMINAL) {
@Override @Override
public IStatus run(IProgressMonitor monitor) { public IStatus run(IProgressMonitor monitor) {
IRemoteCommandShellService commandShellService = connection.getService(IRemoteCommandShellService.class); return openConsoleImplementation(connection, encoding, monitor);
if (commandShellService == null) { }
return Status.CANCEL_STATUS; };
} j.schedule();
}
try { private static IStatus openConsoleImplementation( final IRemoteConnection connection,
if (!connection.isOpen()) { final String encoding, IProgressMonitor monitor) {
connection.open(monitor); IRemoteCommandShellService commandShellService = connection.getService(IRemoteCommandShellService.class);
} if (commandShellService == null) {
return Status.CANCEL_STATUS;
}
try {
IConsole ret = createConsole(connection, encoding, commandShellService, monitor);
return Status.OK_STATUS;
} catch(RemoteConnectionException rce) {
return rce.getStatus();
}
// TODO, how to handle command shells that are singletons, like serial ports }
// Find the index; private static IConsole createConsole( final IRemoteConnection connection,
IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager(); final String encoding, IRemoteCommandShellService service,
IConsole[] consoles = consoleManager.getConsoles(); IProgressMonitor monitor) throws RemoteConnectionException {
boolean[] indices = new boolean[consoles.length]; if (!connection.isOpen()) {
for (IConsole console : consoles) { connection.open(monitor);
if (console instanceof TerminalConsole) { }
TerminalConsole terminalConsole = (TerminalConsole) console;
if (terminalConsole.getConnection().equals(connection)) {
indices[terminalConsole.getIndex()] = true;
}
}
}
int index = 0;
while (index < indices.length && indices[index]) {
index++;
}
TerminalConsole terminalConsole = new TerminalConsole(connection, index, encoding); // TODO, how to handle command shells that are singletons, like serial ports
consoleManager.addConsoles(new IConsole[] { terminalConsole });
consoleManager.showConsoleView(terminalConsole);
return Status.OK_STATUS; IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
} catch (RemoteConnectionException e) { // Find the next index;
return e.getStatus(); int index = findNextIndex(consoleManager, connection);
TerminalConsole terminalConsole = new TerminalConsole(connection, index, encoding);
consoleManager.addConsoles(new IConsole[] { terminalConsole });
consoleManager.showConsoleView(terminalConsole);
return terminalConsole;
}
private static int findNextIndex(IConsoleManager consoleManager, IRemoteConnection connection) {
IConsole[] consoles = consoleManager.getConsoles();
boolean[] indices = new boolean[consoles.length];
for (IConsole console : consoles) {
if (console instanceof TerminalConsole) {
TerminalConsole terminalConsole = (TerminalConsole) console;
if (terminalConsole.getConnection().equals(connection)) {
indices[terminalConsole.getIndex()] = true;
} }
} }
}.schedule(); }
int index = 0;
while (index < indices.length && indices[index]) {
index++;
}
return index;
}
public static List<IConsole> findConsole(IRemoteConnection connection) {
ArrayList<IConsole> ret = new ArrayList<IConsole>();
IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
IConsole[] consoles = consoleManager.getConsoles();
for (IConsole console : consoles) {
if (console instanceof TerminalConsole) {
TerminalConsole terminalConsole = (TerminalConsole) console;
if (terminalConsole.getConnection().equals(connection)) {
ret.add(terminalConsole);
}
}
}
return ret;
} }
} }

View file

@ -148,7 +148,7 @@ public class TerminalConsolePage extends Page {
public void disconnectTerminal() { public void disconnectTerminal() {
if (tViewCtrl.getState() != TerminalState.CLOSED) { if (tViewCtrl.getState() != TerminalState.CLOSED) {
tViewCtrl.getTerminalConnector().disconnect(); tViewCtrl.disconnectTerminal();
} }
} }