/*
* Copyright 2011 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.codehaus.groovy.eclipse.dsl.inferencing.suggestions.preferencepage;
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.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;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
/**
*
* @author Nieraj Singh
* @created Apr 21, 2011
*/
public class SuggestionsViewer {
private ContainerCheckedTreeViewer viewer;
private ITreeViewerColumn[] columns;
private ColumnSortListener columnListener;
private ITreeViewerColumn defaultSortColumn;
public SuggestionsViewer(ITreeViewerColumn[] columns, ITreeViewerColumn defaultSortColumn) {
this.defaultSortColumn = defaultSortColumn;
this.columns = columns;
}
protected int getConfiguration() {
return SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK;
}
protected ICheckStateProvider getCheckStateProvider() {
return null;
}
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, getConfiguration());
GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, getHeightHint()).applyTo(tree);
viewer = new ContainerCheckedTreeViewer(tree);
if (columns != null && columns.length > 0) {
PixelConverter converter = new PixelConverter(treeComposite);
for (ITreeViewerColumn 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());
}
}
}
TreeColumn sortColumn = getDefaultSortColumn();
if (sortColumn != null) {
tree.setSortColumn(sortColumn);
tree.setSortDirection(SWT.UP);
}
TreeColumn[] columns = viewer.getTree().getColumns();
if (columnListener != null) {
removeListeners();
}
columnListener = new ColumnSortListener();
for (TreeColumn column : columns) {
column.addSelectionListener(columnListener);
}
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
viewer.refresh();
}
public ContainerCheckedTreeViewer getTreeViewer() {
return viewer;
}
protected int getHeightHint() {
return 200;
}
protected TreeColumn getDefaultSortColumn() {
if (defaultSortColumn == null) {
return null;
}
String sortColumnName = defaultSortColumn.getName();
if (sortColumnName != 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;
}
public void setChecked(Object child, boolean newState) {
viewer.setChecked(child, newState);
}
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 selected = (TreeColumn) e.widget;
Tree tree = viewer.getTree();
TreeColumn current = tree.getSortColumn();
int newDirection = SWT.UP;
if (current == selected) {
newDirection = tree.getSortDirection() == SWT.UP ? SWT.DOWN : SWT.UP;
} else {
tree.setSortColumn(selected);
}
tree.setSortDirection(newDirection);
viewer.refresh();
}
}
}
}