/*******************************************************************************
* Copyright (c) 2008 Wind River Systems, 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:
* Michael Scharf (Wind River) - initial API and implementation
*******************************************************************************/
package com.netifera.platform.host.terminal.ui.view;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsStore;
import com.netifera.platform.host.terminal.ui.view.internal.SettingStorePrefixDecorator;
public class TerminalViewConnectionManager implements ITerminalViewConnectionManager {
private static final String STORE_CONNECTION_PREFIX = "connection"; //$NON-NLS-1$
private static final String STORE_SIZE = "size"; //$NON-NLS-1$
private static final String STORE_ACTIVE_CONNECTION = "active"; //$NON-NLS-1$
/**
* The list of {@link ITerminalViewConnection} in the order they were cerated.
* Ordered by creation time
*/
private final List fConnections=new ArrayList();
/**
* The currently displayed connection
*/
private ITerminalViewConnection fActiveConnection;
/**
* The list of {@link ITerminalViewConnection} in the order they
* were made the active connection. The most recently accessed
* connection is at the beginning of the list.
*/
private final List fConnectionHistory=new ArrayList();
/**
* The {@link ITerminalViewConnectionListener}
*/
private final List fListeners=new ArrayList();
public ITerminalViewConnection[] getConnections() {
return (ITerminalViewConnection[]) fConnections.toArray(new ITerminalViewConnection[fConnections.size()]);
}
public int size() { // TODO Auto-generated method stub
return fConnections.size();
}
public ITerminalViewConnection getActiveConnection() {
return fActiveConnection;
}
public void setActiveConnection(ITerminalViewConnection conn) {
fActiveConnection=conn;
// put the connection at the end of the history list
fConnectionHistory.remove(conn);
fConnectionHistory.add(0,conn);
fireListeners();
}
public void swapConnection() {
ITerminalViewConnection conn=getPreviousConnection();
if(conn!=null)
setActiveConnection(conn);
}
/**
* @return the connection that was most recently the active connection or null if there is
* no previous connection
*/
private ITerminalViewConnection getPreviousConnection() {
// find the first connection that is not the active connection in
// the list
for (Iterator iterator = fConnectionHistory.iterator(); iterator.hasNext();) {
ITerminalViewConnection conn = (ITerminalViewConnection) iterator.next();
if(conn!=fActiveConnection) {
return conn;
}
}
return null;
}
public void addConnection(ITerminalViewConnection conn) {
fConnections.add(conn);
fireListeners();
}
public void removeConnection(ITerminalViewConnection conn) {
fConnections.remove(conn);
fConnectionHistory.remove(conn);
fireListeners();
}
public void addListener(ITerminalViewConnectionListener listener) {
fListeners.add(listener);
}
public void removeListener(ITerminalViewConnectionListener listener) {
fListeners.remove(listener);
}
protected void fireListeners() {
ITerminalViewConnectionListener[] listeners=(ITerminalViewConnectionListener[]) fListeners.toArray(new ITerminalViewConnectionListener[fListeners.size()]);
for (int i = 0; i < listeners.length; i++) {
listeners[i].connectionsChanged();
}
}
public void saveState(ISettingsStore store) {
store.put(STORE_SIZE,""+fConnections.size()); //$NON-NLS-1$
// save all connections
int n=0;
for (Iterator iterator = fConnections.iterator(); iterator.hasNext();) {
ITerminalViewConnection connection = (ITerminalViewConnection) iterator.next();
// the name under which we store the connection
String prefix=STORE_CONNECTION_PREFIX+n;
n++;
// remember the active connection by its prefix
if(connection.equals(fActiveConnection))
store.put(STORE_ACTIVE_CONNECTION,prefix);
connection.saveState(new SettingStorePrefixDecorator(store,prefix));
}
}
public void loadState(ISettingsStore store,ITerminalViewConnectionFactory factory) {
int size=0;
try {
size=Integer.parseInt(store.get(STORE_SIZE));
} catch(Exception e) {
// ignore
}
if(size>0) {
// a slot for the connections
String active=store.get(STORE_ACTIVE_CONNECTION);
int n=0;
for (int i=0;i<size;i++) {
// the name under which we stored the connection
String prefix=STORE_CONNECTION_PREFIX+n;
n++;
try {
ITerminalViewConnection connection = factory.create();
fConnections.add(connection);
fConnectionHistory.add(connection);
if(prefix.equals(active))
fActiveConnection=connection;
connection.loadState(new SettingStorePrefixDecorator(store,prefix));
} catch(RuntimeException e) {
// in case something goes wrong, make sure we can read the other
// connections....
e.printStackTrace();
/*HACK TerminalViewPlugin.getDefault().getLog().log(
new Status(
IStatus.WARNING,
TerminalViewPlugin.getDefault().getBundle().getSymbolicName(),
0,
e.getLocalizedMessage(),
e
));
*/ }
}
}
}
public void removeActive() {
// don't remove the last connection -- we need at least one!
if(fConnections.size()>1) {
fConnections.remove(fActiveConnection);
fConnectionHistory.remove(fActiveConnection);
// make sure connection is not null....
fActiveConnection=getPreviousConnection();
// if there is no previous connection then make
// the first connection the list the active connection
if(fActiveConnection==null)
fActiveConnection=(ITerminalViewConnection) fConnections.get(0);
fireListeners();
}
}
}