/******************************************************************************* * Copyright (c) 2012 Pivotal Software, Inc. * 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: * Pivotal Software, Inc. - initial API and implementation *******************************************************************************/ package org.springsource.ide.eclipse.commons.frameworks.ui.internal.plugins; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.layout.PixelConverter; import org.eclipse.jface.viewers.ICheckStateProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; /** * Basic tree viewer that creates N number of columns based on the columns * specified by the caller as well as initialises the columns * @author Nieraj Singh */ public class TreeViewerComposite { private TreeViewer viewer; private IPluginListColumn[] columns; private ColumnSortListener columnListener; private IPluginListColumn defaultSortColumn; public TreeViewerComposite(IPluginListColumn[] columns, IPluginListColumn defaultSortColumn) { this.defaultSortColumn = defaultSortColumn; this.columns = columns; } protected int getViewerConfiguration() { return SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL; } protected ICheckStateProvider getCheckStateProvider() { return null; } public TreeViewer getTreeViewer() { return viewer; } protected int getViewerHeightHint() { return 200; } public void createControls(Composite parent) { Composite treeComposite = new Composite(parent, SWT.NONE); GridDataFactory.fillDefaults().grab(true, true).applyTo(treeComposite); GridLayoutFactory.fillDefaults().applyTo(treeComposite); Tree tree = new Tree(treeComposite, getViewerConfiguration()); GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, getViewerHeightHint()).applyTo(tree); viewer = new TreeViewer(tree); if (columns != null && columns.length > 0) { PixelConverter converter = new PixelConverter(treeComposite); for (IPluginListColumn column : columns) { if (column != null) { TreeColumn treeColumn = new TreeColumn(tree, SWT.NONE); treeColumn.setResizable(true); treeColumn.setWidth(converter .convertWidthInCharsToPixels(column.getWidth())); treeColumn.setText(column.getName()); } } tree.setHeaderVisible(true); } initSorting(); initListeners(); viewer.refresh(); } protected void initSorting() { TreeColumn sortColumn = getDefaultSortColumn(); Tree tree = viewer.getTree(); if (sortColumn != null) { tree.setSortColumn(sortColumn); tree.setSortDirection(SWT.UP); } } protected TreeColumn getDefaultSortColumn() { if (defaultSortColumn == null) { return null; } String sortColumnName = defaultSortColumn.getName(); if (sortColumnName == null) { return null; } Tree tree = viewer.getTree(); TreeColumn[] columns = tree.getColumns(); if (columns != null) { for (TreeColumn column : columns) { if (sortColumnName.equals(column.getText())) { return column; } } } return null; } protected void initListeners() { TreeColumn[] columns = viewer.getTree().getColumns(); if (columnListener != null) { removeListeners(); } columnListener = new ColumnSortListener(); for (TreeColumn column : columns) { column.addSelectionListener(columnListener); } } public void dispose() { removeListeners(); } protected void removeListeners() { if (columnListener != null) { TreeColumn[] columns = viewer.getTree().getColumns(); for (TreeColumn column : columns) { column.removeSelectionListener(columnListener); } } } protected class ColumnSortListener extends SelectionAdapter { public void widgetSelected(SelectionEvent e) { if (e.widget instanceof TreeColumn) { TreeColumn selectedColumn = (TreeColumn) e.widget; Tree tree = viewer.getTree(); TreeColumn currentSortColumn = tree.getSortColumn(); // If it is the same column as the sort, change direction int newDirection = SWT.UP; if (currentSortColumn != selectedColumn) { tree.setSortColumn(selectedColumn); } else { newDirection = tree.getSortDirection() == SWT.UP ? SWT.DOWN : SWT.UP; } tree.setSortDirection(newDirection); viewer.refresh(); } } } }