package org.eclipse.swt.nebula.nebface.viewers; import java.util.List; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.AbstractViewerEditor; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.ViewerRow; import org.eclipse.jface.viewers.CellEditor.LayoutData; import org.eclipse.swt.SWT; import org.eclipse.swt.events.TreeListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.nebula.widgets.ctree.AbstractColumn; import org.eclipse.swt.nebula.widgets.ctree.CTree; import org.eclipse.swt.nebula.widgets.ctree.CTreeColumn; import org.eclipse.swt.nebula.widgets.ctree.CTreeEditor; import org.eclipse.swt.nebula.widgets.ctree.CTreeItem; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Widget; public class CTreeViewer extends AbstractTreeViewer { private CTree ctree; private CTreeEditor ctreeEditor; /** * Creates a tree viewer on a newly-created tree control under the given * parent. The tree control is created using the SWT style bits * <code>MULTI, H_SCROLL, V_SCROLL,</code> and <code>BORDER</code>. The * viewer has no input, no content provider, a default label provider, no * sorter, and no filters. * * @param parent * the parent control */ public CTreeViewer(Composite parent) { this(parent, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); } /** * Creates a tree viewer on a newly-created tree control under the given * parent. The tree control is created using the given SWT style bits. The * viewer has no input, no content provider, a default label provider, no * sorter, and no filters. * * @param parent * the parent control * @param style * the SWT style bits used to create the tree. */ public CTreeViewer(Composite parent, int style) { this(new CTree(parent, style)); } /** * Creates a tree viewer on the given tree control. The viewer has no input, * no content provider, a default label provider, no sorter, and no filters. * * @param tree * the tree control */ public CTreeViewer(CTree ctree) { super(); this.ctree = ctree; ctreeEditor = new CTreeEditor(ctree); hookControl(ctree); } protected void addTreeListener(Control control, TreeListener listener) { ((CTree)control).addTreeListener(listener); } protected Item[] getChildren(Widget o) { if (o instanceof CTreeItem) { return ((CTreeItem) o).getItems(); } if (o instanceof CTree) { return ((CTree) o).getItems(); } return null; } protected boolean getExpanded(Item item) { return ((CTreeItem) item).getExpanded(); } protected int getItemCount(Control control) { return ctree.getItemCount(); } protected int getItemCount(Item item) { return ((CTreeItem)item).getItems().length; } protected Item[] getItems(Item item) { return ((CTreeItem)item).getItems(); } protected Item getParentItem(Item item) { return ((CTreeItem)item).getParentItem(); } protected Item[] getSelection(Control control) { return ctree.getSelection(); } protected Item newItem(Widget parent, int flags, int ix) { CTreeItem item; if (parent instanceof CTreeItem) { item = (CTreeItem) createNewRowPart(getViewerRowFromItem(parent), flags, ix).getItem(); } else { item = (CTreeItem) createNewRowPart(null, flags, ix).getItem(); } return item; } /** * Create a new ViewerRow at rowIndex * * @param parent * @param style * @param rowIndex * @return ViewerRow */ private ViewerRow createNewRowPart(ViewerRow parent, int style, int rowIndex) { if (parent == null) { if (rowIndex >= 0) { return getViewerRowFromItem(new CTreeItem(ctree, style, rowIndex)); } return getViewerRowFromItem(new CTreeItem(ctree, style)); } if (rowIndex >= 0) { return getViewerRowFromItem(new CTreeItem((CTreeItem) parent.getItem(), SWT.NONE, rowIndex)); } return getViewerRowFromItem(new CTreeItem((CTreeItem) parent.getItem(), SWT.NONE)); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.ColumnViewer#getRowPartFromItem(org.eclipse.swt.widgets.Widget) */ protected ViewerRow getViewerRowFromItem(Widget item) { ViewerRow part = (ViewerRow) item.getData(ViewerRow.ROWPART_KEY); if (part == null) { part = new CTreeViewerRow(((CTreeItem) item)); } return part; } protected void removeAll(Control control) { ctree.removeAll(); } protected void setExpanded(Item item, boolean expand) { ((CTreeItem)item).setExpanded(expand); } protected void setSelection(List items) { Item[] current = getSelection(ctree); // Don't bother resetting the same selection if (isSameSelection(items, current)) { return; } CTreeItem[] newItems = new CTreeItem[items.size()]; items.toArray(newItems); ctree.setSelection(newItems); } protected void showItem(Item item) { ctree.showItem((CTreeItem) item); } public Control getControl() { return ctree; } protected int doGetColumnCount() { return ctree.getColumnCount(); } protected Item getChild(Widget widget, int index) { if (widget instanceof CTreeItem) { return ((CTreeItem) widget).getItem(index); } if (widget instanceof CTree) { return ctree.getItem(index); } return null; } protected Item getItemAt(Point p) { return ctree.getItem(p); } protected AbstractViewerEditor createViewerEditor() { return new AbstractViewerEditor(this) { protected StructuredSelection createSelection(Object element) { if (element instanceof TreePath) { return new TreeSelection((TreePath) element, getComparer()); } return new StructuredSelection(element); } protected Item[] getSelection() { return ctree.getSelection(); } protected void setEditor(Control w, Item item, int fColumnNumber) { ctreeEditor.setEditor(w, (CTreeItem) item, fColumnNumber); } protected void setLayoutData(LayoutData layoutData) { ctreeEditor.grabHorizontal = layoutData.grabHorizontal; ctreeEditor.horizontalAlignment = layoutData.horizontalAlignment; ctreeEditor.minimumWidth = layoutData.minimumWidth; } protected void showSelection() { ctree.showSelection(); } }; } public void remove(final Object parentOrTreePath, final int index) { preservingSelection(new Runnable() { public void run() { if (internalIsInputOrEmptyPath(parentOrTreePath)) { if (index < ctree.getItemCount()) { CTreeItem item = ctree.getItem(index); if (item.getData() != null) { disassociate(item); } item.dispose(); } } else { Widget[] parentItems = internalFindItems(parentOrTreePath); for (int i = 0; i < parentItems.length; i++) { CTreeItem parentItem = (CTreeItem) parentItems[i]; if (index < parentItem.getItems().length) { CTreeItem item = parentItem.getItem(index); if (item.getData() != null) { disassociate(item); } item.dispose(); } } } } }); } public CTree getCTree() { return ctree; } protected Widget getColumnViewerOwner(int columnIndex) { if (columnIndex < 0 || ( columnIndex > 0 && columnIndex >= ctree.getColumnCount() ) ) { return null; } AbstractColumn column = ctree.getColumn(columnIndex); if(column == null) return ctree; // Hang it off the table if necessary return column; } }