/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.wizards.query.list;
import java.util.Properties;
import org.jboss.tools.common.model.ui.ModelUIPlugin;
import org.jboss.tools.common.model.ui.action.CommandBar;
import org.jboss.tools.common.model.ui.wizards.query.AbstractQueryWizardView;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
public abstract class AbstractTreeWizardView extends AbstractQueryWizardView {
protected CommandBar allBar = new CommandBar();
protected TreeViewer treeViewer;
protected CheckTreeProvider provider = new CheckTreeProvider();
protected TreeItemSelectionManager treeSelectionManager;
protected String[][] vs = new String[0][];
CheckObject object = new CheckObject(null, new String[]{"", "yes"}); //$NON-NLS-1$ //$NON-NLS-2$
int expandingLevel = 2;
public AbstractTreeWizardView() {
createAllBar();
}
public void dispose() {
super.dispose();
if (allBar!=null) allBar.dispose();
allBar = null;
}
protected abstract String[] getActions();
protected void createAllBar() {
allBar.getLayout().direction = SWT.VERTICAL;
allBar.setCommands(getActions());
allBar.addCommandBarListener(this);
}
public void setObject(Object data) {
super.setObject(data);
Properties p = (Properties)data;
vs = (String[][])p.get("data"); //$NON-NLS-1$
String s = p.getProperty("expandingLevel"); //$NON-NLS-1$
if(s != null && s.length() > 0) try {
expandingLevel = Integer.parseInt(s);
} catch (NumberFormatException e) {
ModelUIPlugin.getPluginLog().logError(e);
}
makeObject();
}
void makeObject() {
object = new CheckObject(null, new String[]{"", "no"}); //$NON-NLS-1$
provider.setObject(object);
for (int i = 0; i < vs.length; i++) {
String path = vs[i][0];
CheckObject c = object.getByPath(path);
if(c != null) {
c.objectData = vs[i];
} else {
c = create(vs[i]);
}
}
}
private CheckObject create(String[] data) {
String path = data[0];
int s = path.lastIndexOf('/');
String parentPath = path.substring(0, s);
CheckObject p = parentPath.length() == 0 ? object : object.getByPath(parentPath);
if(p == null) p = create(new String[]{parentPath, "no"});
CheckObject c = new CheckObject(p, data);
p.addChild(c);
return c;
}
public Control createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
layout.horizontalSpacing = 10;
layout.marginHeight = 10;
layout.verticalSpacing = 10;
layout.marginWidth = 10;
composite.setLayout(layout);
GridData gd = new GridData(GridData.FILL_BOTH);
composite.setLayoutData(gd);
treeViewer = new TreeViewer(composite, SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
treeViewer.setContentProvider(provider);
treeViewer.setLabelProvider(provider);
treeViewer.setInput(this);
Object[] os = provider.getChildren(this);
Control tc = treeViewer.getControl();
tc.setLayoutData(new GridData(GridData.FILL_BOTH));
initTree();
treeSelectionManager = new TreeItemSelectionManager(treeViewer, new Flipper());
treeViewer.expandToLevel(expandingLevel);
Control bc = allBar.createControl(composite);
bc.setLayoutData(new GridData(GridData.FILL_VERTICAL));
return composite;
}
private void initTree() {
Tree tree = treeViewer.getTree();
TreeItem[] is = tree.getItems();
for (int i = 0; i < is.length; i++) {
Object d = is[i].getData();
if(d instanceof CheckObject) {
CheckObject o = (CheckObject)d;
is[i].setChecked(!o.isDisabled());
}
}
}
public void action(String command) {
if(CANCEL.equals(command) ||
OK.equals(command) ||
HELP.equals(command)) {
super.action(command);
} else {
stopEditing();
internalAction(command);
}
}
protected abstract void internalAction(String command);
protected void enableAll() {
enableHierarchy(object);
treeSelectionManager.update();
treeViewer.refresh();
}
private void enableHierarchy(CheckObject o) {
CheckObject[] os = o.getChildren();
for (int i = 0; i < os.length; i++) {
os[i].setEnabled(true);
enableHierarchy(os[i]);
}
}
protected void disableAll() {
CheckObject[] os = object.getChildren();
for (int i = 0; i < os.length; i++) {
os[i].setEnabled(false);
}
treeSelectionManager.update();
treeViewer.refresh();
}
class Flipper implements TreeItemSelectionManager.Listener {
public void flip(TreeItem item) {
if(item == null) return;
CheckObject w = (CheckObject)item.getData();
w.flip();
treeViewer.refresh(w);
}
public boolean isSelected(Object data) {
if(data instanceof CheckObject) {
CheckObject o = (CheckObject)data;
return !o.isDisabled();
}
return false;
}
}
}
class CheckObject {
boolean checked;
String[] objectData;
CheckObject parent;
CheckObject[] children = new CheckObject[0];
public CheckObject(CheckObject parent, String[] objectData) {
this.parent = parent;
this.objectData = objectData;
}
public void addChild(CheckObject child) {
CheckObject[] cs = new CheckObject[children.length + 1];
System.arraycopy(children, 0, cs, 0, children.length);
cs[children.length] = child;
children = cs;
}
public CheckObject getParent() {
return parent;
}
public CheckObject[] getChildren() {
return children;
}
public boolean isDisabled() {
return "yes".equals(objectData[1]);
}
public boolean isNotDisabled() {
return parent == null || (!parent.isDisabled() && parent.isNotDisabled());
}
public void flip() {
objectData[1] = isDisabled() ? "no" : "yes";
}
public void setEnabled(boolean b) {
objectData[1] = b ? "no" : "yes";
}
public String getPath() {
return objectData[0];
}
public CheckObject getByPath(String path) {
if(!path.startsWith(getPath() + "/")) return null;
for (int i = 0; i < children.length; i++) {
if(children[i].getPath().equals(path)) return children[i];
CheckObject c = children[i].getByPath(path);
if(c != null) return c;
}
return null;
}
public String toString() {
String n = objectData[0];
int i = n.lastIndexOf('/');
return n.substring(i + 1);
}
}
class CheckTreeProvider extends LabelProvider implements ITreeContentProvider, ILabelProvider, IColorProvider {
public Image IMAGE_ENABLED = EclipseResourceUtil.getImage("images/common/check.gif"); //$NON-NLS-1$
public Image IMAGE_DISABLED = EclipseResourceUtil.getImage("images/common/uncheck.gif"); //$NON-NLS-1$
protected CheckObject object = null;
public CheckObject getObject() {
return object;
}
public void setObject(CheckObject object) {
this.object = object;
}
public Object[] getChildren(Object parentElement) {
return (parentElement instanceof CheckObject) ? ((CheckObject)parentElement).children : new CheckObject[0];
}
public Object getParent(Object element) {
return (element instanceof CheckObject) ? ((CheckObject)element).getParent() : null;
}
public boolean hasChildren(Object element) {
return (element instanceof CheckObject) && ((CheckObject)element).children.length > 0;
}
public Object[] getElements(Object inputElement) {
return object.getChildren();
}
public void dispose() {}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
/**
* Tree style SWT.CHECK is used instead.
public Image getImage(Object element) {
if(!(element instanceof CheckObject)) return null;
CheckObject w = (CheckObject)element;
return (!w.isDisabled()) ? IMAGE_ENABLED : IMAGE_DISABLED;
}
*/
public Color getForeground(Object element) {
if(!(element instanceof CheckObject)) return null;
CheckObject w = (CheckObject)element;
return (w.isNotDisabled()) ? null : Display.getDefault().getSystemColor(SWT.COLOR_GRAY);
}
public Color getBackground(Object element) {
return null;
}
}