/**
* Copyright 2009 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.safehaus.penrose.studio.server;
import org.apache.log4j.Logger;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.part.*;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbench;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.action.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.dnd.*;
import org.safehaus.penrose.studio.PenroseStudio;
import org.safehaus.penrose.studio.PenroseImage;
import org.safehaus.penrose.studio.server.tree.ServerNode;
import org.safehaus.penrose.studio.dialog.ErrorDialog;
import org.safehaus.penrose.studio.tree.Node;
import java.util.ArrayList;
import java.util.Collection;
public class ServersView extends ViewPart implements ISelectionChangedListener {
Logger log = Logger.getLogger(getClass());
public final static int LINUX = 0;
public final static int WINDOWS = 1;
public final static String PARTITION = "Partition";
public final static String DIRECTORY = "Directory";
public final static String ENTRY = "Entry";
public final static String DATA_SOURCES = "Data Sources";
public final static String CONNECTIONS = "Connections";
public final static String CONNECTION = "Connection";
public final static String MAPPINGS = "Mappings";
public final static String MAPPING = "Mapping";
public final static String SOURCES = "Sources";
public final static String SOURCE = "Source";
public final static String CACHES = "Caches";
public final static String ENTRY_CACHE = "Entry Cache";
public final static String SOURCE_CACHE = "Source Cache";
public final static String HANDLER = "Handler";
public final static String ENGINES = "Engines";
public final static String ENGINE = "Engine";
public final static String ENGINE_CACHE = "Engine Cache";
public final static String CONNECTORS = "Connectors";
public final static String CONNECTOR_CACHE = "Connector Cache";
public final static String MODULES = "Modules";
public final static String MODULE = "Module";
public final static String SCHEMA = "Schema";
public final static String BUILTIN_SCHEMA = "Built-In Schema";
public final static String CUSTOM_SCHEMA = "Custom Schema";
public final static String OBJECT_CLASSES = "Object Classes";
public final static String OBJECT_CLASS = "Object Class";
public final static String ATTRIBUTE_TYPES = "Attribute Types";
public final static String ATTRIBUTE_TYPE = "Attribute Type";
public final static String SERVICE = "Service";
public final static String PLUGIN = "Plugin";
public final static String ROOT_DSE = "Root DSE";
public final static String APPENDERS = "Appenders";
public final static String APPENDER = "Appender";
public final static String LOGGERS = "Loggers";
public final static String LOGGER = "Logger";
Tree tree;
MenuManager menuManager;
Collection<Node> serverNodes = new ArrayList<Node>();
//ServersContentProvider contentProvider;
//TreeViewer treeViewer;
Clipboard swtClipboard;
Object clipboard;
int type;
public ServersView() {
String osName = System.getProperty("os.name");
if (osName.startsWith("Linux")) {
type = LINUX;
} else if (osName.startsWith("Windows")) {
type = WINDOWS;
}
}
/**
* This is a callback that will allow us to create the viewer and initialize
* it.
*/
public void createPartControl(Composite parent) {
try {
swtClipboard = new Clipboard(getSite().getShell().getDisplay());
tree = new Tree(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
tree.setLayoutData(new GridData(GridData.FILL_BOTH));
menuManager = new MenuManager("#PopupMenu");
Menu menu = menuManager.createContextMenu(tree);
tree.setMenu(menu);
tree.addSelectionListener(new SelectionAdapter() {
public void widgetDefaultSelected(SelectionEvent event) {
// disable expanding tree when double-clicked
}
});
tree.addTreeListener(new TreeAdapter() {
public void treeExpanded(TreeEvent event) {
try {
if (event.item == null) return;
TreeItem item = (TreeItem)event.item;
expand(item);
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
}
public void treeCollapsed(TreeEvent event) {
try {
if (event.item == null) return;
TreeItem item = (TreeItem)event.item;
collapse(item);
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
}
});
tree.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent event) {
try {
TreeItem item = tree.getItem(new Point(event.x, event.y));
if (item == null) return;
doubleClick(item);
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
}
public void mouseDown(MouseEvent event) {
try {
//log.debug("Button #"+event.button+" down at ("+event.x+","+event.y+").");
if (event.button != 3) return;
menuManager.removeAll();
if (type != LINUX) return;
TreeItem item = tree.getItem(new Point(event.x, event.y));
if (item == null) return;
rightClick(item);
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
}
public void mouseUp(MouseEvent event) {
try {
//log.debug("Button #"+event.button+" up at ("+event.x+","+event.y+").");
if (event.button != 3) return;
menuManager.removeAll();
if (type != WINDOWS) return;
TreeItem item = tree.getItem(new Point(event.x, event.y));
if (item == null) return;
rightClick(item);
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
}
});
refresh();
/*
contentProvider = new ServersContentProvider(this);
treeViewer = new TreeViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
treeViewer.setContentProvider(contentProvider);
treeViewer.setLabelProvider(new ServersLabelProvider(this));
treeViewer.setInput(getViewSite());
treeViewer.addSelectionChangedListener(this);
Helper.hookContextMenu(treeViewer.getControl(), new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
try {
if (treeViewer.getTree().getSelectionCount() == 0) return;
TreeItem item = treeViewer.getTree().getSelection()[0];
Object object = item.getData();
Node node = (Node)object;
node.showMenu(manager);
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
}
});
treeViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
try {
IStructuredSelection selection = (IStructuredSelection)event.getSelection();
Object object = selection.getFirstElement();
Node node = (Node)object;
node.open();
PenroseStudio penroseStudio = PenroseStudio.getInstance();
penroseStudio.notifyChangeListeners();
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
}
});
treeViewer.addTreeListener(new ITreeViewerListener() {
public void treeExpanded(TreeExpansionEvent event) {
try {
Object object = event.getElement();
Node node = (Node)object;
log.debug("Expanding "+node.getName()+".");
node.expand();
boolean hasChildren = node.hasChildren();
log.debug("Has children: "+hasChildren);
Collection<Node> children = node.getChildren();
log.debug("Children: "+children);
if (children.isEmpty()) {
log.debug("Searching node "+node.getName()+":");
Tree tree = treeViewer.getTree();
TreeItem item = findTreeItem(tree.getItems(), node);
if (item != null) {
log.debug("Removing children of "+node.getName()+".");
for (TreeItem ti : item.getItems()) ti.dispose();
treeViewer.refresh();
}
} else {
log.debug("Expanding node "+node.getName()+".");
treeViewer.setExpandedState(object, true);
}
//PenroseStudio penroseStudio = PenroseStudio.getInstance();
//penroseStudio.notifyChangeListeners();
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
}
public void treeCollapsed(TreeExpansionEvent event) {
try {
Object object = event.getElement();
Node node = (Node)object;
node.collapse();
treeViewer.setExpandedState(object, false);
PenroseStudio penroseStudio = PenroseStudio.getInstance();
penroseStudio.notifyChangeListeners();
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
}
});
treeViewer.addDragSupport(
DND.DROP_COPY | DND.DROP_MOVE,
new Transfer[] {
SourceTransfer.getInstance()
},
new DragSourceAdapter() {
public void dragStart(DragSourceEvent event) {
log.debug("Drag start.");
}
public void dragFinished(DragSourceEvent event) {
log.debug("Drag finished.");
}
public void dragSetData(DragSourceEvent event) {
log.debug("Drag set data:");
IStructuredSelection selection = (IStructuredSelection)treeViewer.getSelection();
Node[] nodes = (Node[])selection.toList().toArray(new Node[selection.size()]);
for (Node node : nodes) {
log.debug(" - "+node.getName());
}
}
}
);
PenroseStudio penroseStudio = PenroseStudio.getInstance();
penroseStudio.addChangeListener(this);
*/
} catch (Exception ex) {
log.debug(ex.toString(), ex);
}
}
public void doubleClick(TreeItem item) throws Exception {
Node node = (Node)item.getData();
if (node == null) return;
log.debug("Double-click node "+node.getName()+".");
node.open();
}
public void rightClick(TreeItem item) throws Exception {
Node node = (Node)item.getData();
if (node == null) return;
//log.debug("Right-click node "+node.getName()+".");
node.showMenu(menuManager);
menuManager.setVisible(true);
}
public void expand(TreeItem item) throws Exception {
for (TreeItem ti : item.getItems()) ti.dispose();
Node node = (Node)item.getData();
//log.debug("Expanding "+node.getName()+".");
node.expand();
boolean hasChildren = node.hasChildren();
//log.debug("Has children: "+hasChildren);
if (!hasChildren) return;
Collection<Node> children = node.getChildren();
//log.debug("Children: "+children);
if (children.isEmpty()) return;
for (Node child : children) {
TreeItem ti = new TreeItem(item, SWT.NONE);
ti.setImage(child.getImage());
ti.setText(child.getName());
ti.setData(child);
if (child.hasChildren()) new TreeItem(ti, SWT.NONE);
}
item.setExpanded(true);
}
public void collapse(TreeItem item) throws Exception {
item.setExpanded(false);
for (TreeItem ti : item.getItems()) ti.dispose();
Node node = (Node)item.getData();
//log.debug("Collapsing "+node.getName()+".");
node.collapse();
if (node.hasChildren()) new TreeItem(item, SWT.NONE);
}
public TreeItem findTreeItem(TreeItem[] items, Node node) {
for (TreeItem item : items) {
Node n = (Node)item.getData();
if (n == null) continue;
log.debug(" - "+n.getName());
if (n == node) return item;
TreeItem result = findTreeItem(item.getItems(), node);
if (result != null) return result;
}
return null;
}
public void dispose() {
swtClipboard.dispose();
}
public Clipboard getSWTClipboard() {
return swtClipboard;
}
public void setClipboard(Object object) throws Exception {
this.clipboard = object;
}
public Object getClipboard() {
return clipboard;
}
public void setFocus() {
tree.forceFocus();
//treeViewer.getControl().setFocus();
}
public void selectionChanged(SelectionChangedEvent event) {
}
public boolean isExpanded(Object object) {
TreeItem item = findTreeItem(tree.getItems(), (Node)object);
if (item == null) return false;
return item.getExpanded();
//return treeViewer.getExpandedState(object);
}
public void open(Node node) throws Exception {
TreeItem item = findTreeItem(tree.getItems(), node);
if (item == null) return;
expand(item);
//treeViewer.setExpandedState(object, true);
//treeViewer.refresh();
}
public void close(Node node) throws Exception {
TreeItem item = findTreeItem(tree.getItems(), node);
if (item == null) return;
collapse(item);
//treeViewer.setExpandedState(object, false);
//treeViewer.refresh();
}
public void addServerConfig(ServerConfig serverConfig) throws Exception {
//contentProvider.addServerConfig(serverConfig);
}
public void removeServerConfig(String name) {
//contentProvider.removeProjectConfig(name);
}
public void setSelection(Node node) {
TreeItem item = findTreeItem(tree.getItems(), node);
if (item == null) return;
tree.setSelection(item);
//treeViewer.setSelection(new StructuredSelection(node), true);
}
public ServerNode getSelectedServerNode() {
if (tree.getSelectionCount() == 0) return null;
TreeItem item = tree.getSelection()[0];
Node node = (Node)item.getData();
/*
IStructuredSelection selection = (IStructuredSelection)treeViewer.getSelection();
if (selection == null) return null;
Node node = (Node)selection.getFirstElement();
*/
while (node != null) {
if (node instanceof ServerNode) return (ServerNode)node;
node = node.getParent();
}
return null;
}
public Collection<Node> getSelectedNodes() {
Collection<Node> list = new ArrayList<Node>();
if (tree.getSelectionCount() == 0) return list;
for (TreeItem item : tree.getSelection()) {
Node node = (Node)item.getData();
list.add(node);
}
/*
IStructuredSelection selection = (IStructuredSelection)treeViewer.getSelection();
for (Iterator i=selection.iterator(); i.hasNext(); ) {
Node node = (Node)i.next();
list.add(node);
}
*/
return list;
}
public static ServersView getInstance() throws Exception {
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
if (page == null) return null;
return (ServersView)page.showView(ServersView.class.getName());
}
public void refresh() throws Exception {
for (TreeItem item : tree.getItems()) item.dispose();
PenroseStudio penroseStudio = PenroseStudio.getInstance();
for (ServerConfig serverConfig : penroseStudio.getApplicationConfig().getServerConfigs()) {
ServerNode node = new ServerNode(
this,
serverConfig.getName(),
PenroseStudio.getImage(PenroseImage.LOGO),
serverConfig
);
TreeItem item = new TreeItem(tree, SWT.NONE);
item.setImage(node.getImage());
item.setText(node.getName());
item.setData(node);
new TreeItem(item, SWT.NONE);
}
}
public void refresh(Node node) throws Exception {
TreeItem item = findTreeItem(tree.getItems(), node);
if (item == null) return;
node.refresh();
for (TreeItem ti : item.getItems()) ti.dispose();
boolean hasChildren = node.hasChildren();
//log.debug("Has children: "+hasChildren);
if (!hasChildren) return;
Collection<Node> children = node.getChildren();
//log.debug("Children: "+children);
if (children.isEmpty()) return;
for (Node child : children) {
TreeItem ti = new TreeItem(item, SWT.NONE);
ti.setImage(child.getImage());
ti.setText(child.getName());
ti.setData(child);
if (child.hasChildren()) new TreeItem(ti, SWT.NONE);
}
}
}