blob: 5163289fa9efb2359ecec69c50e622f8411005b3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 BSI Business Systems Integration AG.
* 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:
* BSI Business Systems Integration AG - initial API and implementation
******************************************************************************/
package org.eclipse.scout.sdk.ui.wizard;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.scout.sdk.ui.fields.bundletree.CheckableTree;
import org.eclipse.scout.sdk.ui.fields.bundletree.DndEvent;
import org.eclipse.scout.sdk.ui.fields.bundletree.ICheckStateListener;
import org.eclipse.scout.sdk.ui.fields.bundletree.ITreeDndListener;
import org.eclipse.scout.sdk.ui.fields.bundletree.ITreeNode;
import org.eclipse.scout.sdk.ui.fields.bundletree.ITreeNodeFilter;
import org.eclipse.scout.sdk.ui.fields.bundletree.NodeFilters;
import org.eclipse.scout.sdk.ui.fields.bundletree.TreeUtility;
import org.eclipse.scout.sdk.workspace.IScoutBundle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
/**
* <h3>BundleTreeWizardPage</h3> ...
*
* @author Andreas Hoegger
* @since 1.0.8 12.02.2010
*/
public class BundleTreeWizardPage extends AbstractWorkspaceWizardPage {
private CheckableTree m_tree;
private boolean m_treeListenersAttached;
private final ITreeNode m_rootNode;
private final List<ITreeDndListener> m_tempDndListeners;
private final List<ICheckStateListener> m_tempCheckListeners;
private final ITreeNodeFilter m_initialCheckedFilter;
public BundleTreeWizardPage(String pageTitle, String message, ITreeNode rootNode, ITreeNodeFilter initialCheckedFilter) {
super(BundleTreeWizardPage.class.getName());
m_treeListenersAttached = false;
m_rootNode = rootNode;
m_tempDndListeners = new ArrayList<ITreeDndListener>();
m_tempCheckListeners = new ArrayList<ICheckStateListener>();
setDescription(message);
setTitle(pageTitle);
if (initialCheckedFilter == null) {
initialCheckedFilter = NodeFilters.getAcceptNone();
}
m_initialCheckedFilter = initialCheckedFilter;
}
public synchronized void addCheckSelectionListener(ICheckStateListener listener) {
if (m_treeListenersAttached) {
m_tree.addCheckSelectionListener(listener);
}
else {
m_tempCheckListeners.add(listener);
}
}
public synchronized void removeCheckSelectionListener(ICheckStateListener listener) {
if (m_treeListenersAttached) {
m_tree.removeCheckSelectionListener(listener);
}
else {
m_tempCheckListeners.remove(listener);
}
}
public synchronized void addDndListener(ITreeDndListener listener) {
if (m_treeListenersAttached) {
m_tree.addDndListener(listener);
}
else {
m_tempDndListeners.add(listener);
}
}
public synchronized void removeDndListener(ITreeDndListener listener) {
if (m_treeListenersAttached) {
m_tree.removeDndListener(listener);
}
else {
m_tempDndListeners.remove(listener);
}
}
@Override
protected void createContent(Composite parent) {
m_tree = new CheckableTree(parent, getRootNode());
m_tree.setChecked(TreeUtility.findNodes(getRootNode(), m_initialCheckedFilter));
synchronized (this) {
for (ITreeDndListener l : m_tempDndListeners) {
m_tree.addDndListener(l);
}
m_tempDndListeners.clear();
m_tree.addDndListener(new ITreeDndListener() {
@Override
public void validateTarget(DndEvent dndEvent) {
}
@Override
public boolean isDragableNode(ITreeNode node) {
return true;
}
@Override
public void dndPerformed(DndEvent dndEvent) {
pingStateChanging();
}
});
for (ICheckStateListener l : m_tempCheckListeners) {
m_tree.addCheckSelectionListener(l);
}
m_tempCheckListeners.clear();
m_tree.addCheckSelectionListener(new ICheckStateListener() {
@Override
public void fireNodeCheckStateChanged(ITreeNode node, boolean checkState) {
pingStateChanging();
}
});
m_treeListenersAttached = true;
}
// layout
parent.setLayout(new GridLayout(1, true));
GridData interfaceLocationData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_VERTICAL);
interfaceLocationData.heightHint = 200;
m_tree.setLayoutData(interfaceLocationData);
}
/**
* @return the rootNode
*/
public ITreeNode getRootNode() {
return m_rootNode;
}
private CheckableTree getTree() {
return m_tree;
}
public void refreshTree() {
if (isControlCreated()) {
m_tree.getTreeViewer().refresh();
}
}
public IScoutBundle[] getLocationBundles(String type, boolean visibleOnly, boolean checkedOnly) {
ITreeNode[] nodes = getTreeNodes(type, visibleOnly, checkedOnly);
ArrayList<IScoutBundle> result = new ArrayList<IScoutBundle>();
for (ITreeNode node : nodes) {
if (node != null && node.getParent() != null && node.getParent().getData() instanceof IScoutBundle) {
result.add((IScoutBundle) node.getParent().getData());
}
}
return result.toArray(new IScoutBundle[result.size()]);
}
public ITreeNode[] getTreeNodes(String type, boolean visibleOnly, boolean checkedOnly) {
ArrayList<ITreeNode> result = new ArrayList<ITreeNode>();
if (isControlCreated()) {
ITreeNode[] nodes = TreeUtility.findNodes(m_rootNode, NodeFilters.getByType(type));
for (ITreeNode node : nodes) {
if (node != null && checkedOnly && node.isCheckable()) {
if (!getTree().isChecked(node)) {
continue;
}
}
if (node != null && visibleOnly) {
if (!node.isVisible()) {
continue;
}
}
result.add(node);
}
}
return result.toArray(new ITreeNode[result.size()]);
}
public static IScoutBundle getLocationBundle(ITreeNode node) {
ITreeNode searchNode = node;
IScoutBundle bundle = null;
while (bundle == null && searchNode != null) {
Object o = searchNode.getData();
if (o instanceof IScoutBundle) {
return (IScoutBundle) o;
}
searchNode = searchNode.getParent();
}
return null;
}
public IScoutBundle getLocationBundle(String type, boolean visibleOnly, boolean checkedOnly) {
ITreeNode node = getTreeNode(type, visibleOnly, checkedOnly);
return getLocationBundle(node);
}
public ITreeNode getTreeNode(String type, boolean visibleOnly, boolean checkedOnly) {
ITreeNode node = null;
if (isControlCreated()) {
node = TreeUtility.findNode(m_rootNode, NodeFilters.getByType(type));
if (node != null) {
if (node.isCheckable() && checkedOnly && !getTree().isChecked(node)) {
return null;
}
if (visibleOnly && !node.isVisible()) {
return null;
}
}
}
return node;
}
/**
* @param nodeType
* @return
*/
public String getTextOfNode(String nodeType) {
return getTextOfNode(nodeType, true, true);
}
public String getTextOfNode(String type, boolean visibleOnly, boolean checkedOnly) {
ITreeNode treeNode = getTreeNode(type, visibleOnly, checkedOnly);
String text = null;
if (treeNode != null) {
text = treeNode.getText();
}
return text;
}
public boolean isNodeChecked(ITreeNode node) {
return m_tree.isChecked(node);
}
public void setNodeChecked(ITreeNode node, boolean checked) {
m_tree.setChecked(node, checked);
}
}