package fr.opensagres.mongodb.ide.ui.views;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import fr.opensagres.mongodb.ide.core.IServerLifecycleListener;
import fr.opensagres.mongodb.ide.core.IServerListener;
import fr.opensagres.mongodb.ide.core.Platform;
import fr.opensagres.mongodb.ide.core.ServerEvent;
import fr.opensagres.mongodb.ide.core.model.Database;
import fr.opensagres.mongodb.ide.core.model.Server;
/**
* Tree view showing servers and their associations.
*/
public class ServerTreeViewer extends TreeViewer {
protected static final String ROOT = "root";
protected static Set<String> starting = new HashSet<String>(4);
protected IServerLifecycleListener serverResourceListener;
protected IServerListener serverListener;
public ServerTreeViewer(Composite parent, int style) {
super(parent, style);
}
protected void initialize() {
addListeners();
}
protected void addListeners() {
serverResourceListener = new IServerLifecycleListener() {
public void serverAdded(Server server) {
addServer(server);
server.addServerListener(serverListener);
}
public void serverChanged(Server server) {
refreshServer(server);
}
public void serverRemoved(Server server) {
removeServer(server);
server.removeServerListener(serverListener);
}
};
Platform.getServerManager().addServerLifecycleListener(
serverResourceListener);
serverListener = new IServerListener() {
public void serverChanged(ServerEvent event) {
if (event == null)
return;
int eventKind = event.getKind();
Server server = event.getServer();
if ((eventKind & ServerEvent.DATABASE_DROPPED) == ServerEvent.DATABASE_DROPPED) {
// remove database
removeDatabase(event.getDatabase());
} else if ((eventKind & ServerEvent.DATABASE_CREATED) == ServerEvent.DATABASE_CREATED) {
// add database
addDatabase(event.getDatabase());
} else if ((eventKind & ServerEvent.SERVER_CHANGE) != 0) {
// refresh server state
refreshServer(server);
}
}
};
// add listeners to servers
List<Server> servers = Platform.getServerManager().getServers();
for (Server server : servers) {
server.addServerListener(serverListener);
}
}
protected void addServer(final Server server) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
add(Platform.getServerManager(), server);
}
});
}
protected void removeServer(final Server server) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
remove(server);
}
});
}
protected void refreshServer(final Server server) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
try {
refresh(server);
ISelection sel = ServerTreeViewer.this.getSelection();
ServerTreeViewer.this.setSelection(sel);
} catch (Exception e) {
// ignore
}
}
private void refresh(Server server) {
ServerTreeViewer.this.refresh(server);
if (server.isConnected()) {
ServerTreeViewer.this.expandToLevel(server, 1);
}
}
});
}
private void addDatabase(final Database database) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
try {
// Add the created database in the treeviewer
ServerTreeViewer.this.add(database.getParent(), database);
// Select the database
ISelection sel = new StructuredSelection(database);
ServerTreeViewer.this.setSelection(sel);
// Expand the database tree item
ServerTreeViewer.this.expandToLevel(database, 1);
} catch (Exception e) {
// ignore
}
}
});
}
private void removeDatabase(final Database database) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
try {
// Add the created database in the treeviewer
ServerTreeViewer.this.remove(database);
// Select the server
ISelection sel = new StructuredSelection(database
.getParent());
ServerTreeViewer.this.setSelection(sel);
} catch (Exception e) {
// ignore
}
}
});
}
@Override
protected void handleDispose(DisposeEvent event) {
// remove listeners from server
List<Server> servers = Platform.getServerManager().getServers();
for (Server server : servers) {
if (serverListener != null)
server.removeServerListener(serverListener);
}
Platform.getServerManager().removeServerLifecycleListener(
serverResourceListener);
super.handleDispose(event);
}
}