package fr.opensagres.nosql.ide.ui.internal.views;
import java.util.List;
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.nosql.ide.core.IServerLifecycleListener;
import fr.opensagres.nosql.ide.core.IServerListener;
import fr.opensagres.nosql.ide.core.Platform;
import fr.opensagres.nosql.ide.core.ServerEvent;
import fr.opensagres.nosql.ide.core.extensions.IServerType;
import fr.opensagres.nosql.ide.core.model.IDatabase;
import fr.opensagres.nosql.ide.core.model.IServer;
public class ServerTreeViewer extends TreeViewer {
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(IServer server) {
addServer(server);
server.addServerListener(serverListener);
}
public void serverChanged(IServer server) {
refreshServer(server);
}
public void serverRemoved(IServer 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();
IServer 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<IServer> servers = Platform.getServerManager().getServers();
for (IServer server : servers) {
server.addServerListener(serverListener);
}
}
protected void addServer(final IServer server) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
IServerType serverType = server.getServerType();
add(serverType, server);
ServerTreeViewer.this.expandToLevel(serverType, 1);
}
});
}
protected void removeServer(final IServer server) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
remove(server);
}
});
}
protected void refreshServer(final IServer 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(IServer server) {
ServerTreeViewer.this.refresh(server);
if (server.isConnected()) {
ServerTreeViewer.this.expandToLevel(server, 1);
}
}
});
}
private void addDatabase(final IDatabase database) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
try {
// Add the created database in the treeviewer
ServerTreeViewer.this.add(database.getServer(), 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 IDatabase 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
.getServer());
ServerTreeViewer.this.setSelection(sel);
} catch (Exception e) {
// ignore
}
}
});
}
@Override
protected void handleDispose(DisposeEvent event) {
// remove listeners from server
List<IServer> servers = Platform.getServerManager().getServers();
for (IServer server : servers) {
if (serverListener != null)
server.removeServerListener(serverListener);
}
Platform.getServerManager().removeServerLifecycleListener(
serverResourceListener);
super.handleDispose(event);
}
}