/*******************************************************************************
* Copyright (c) 2006-2012
* Software Technology Group, Dresden University of Technology
* DevBoost GmbH, Berlin, Amtsgericht Charlottenburg, HRB 140026
*
* 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:
* Software Technology Group - TU Dresden, Germany;
* DevBoost GmbH - Berlin, Germany
* - initial API and implementation
******************************************************************************/
package org.reuseware.coconut.description.facetview.simple.views;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jface.viewers.ContentViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.reuseware.coconut.description.Facet;
import org.reuseware.coconut.description.FacetValue;
import org.reuseware.coconut.description.FacetValueDecorator;
import org.reuseware.coconut.description.browse.util.FacetDropListener;
import org.reuseware.coconut.description.classify.DecorationManager;
import org.reuseware.coconut.description.classify.views.facet.JFaceFacetView;
import org.reuseware.coconut.description.facetview.simple.util.SimpleContentProvider;
import org.reuseware.coconut.description.facetview.simple.util.SimpleLabelProvider;
/**
* This class implements a simple view to present all FacetTypeDecorator which
* decorate: TreeFacet, ListFacet, DateFacet, RangeFacet and FreeTextFacet. It
* simply uses a jFace TreeViewer to present the values.
*
* @author Matthias Schmidt
*
*/
public class SimpleFacetView extends JFaceFacetView {
/**
* The viewer which presents the tree of FacetValueDecorator.
*/
private TreeViewer treeViewer;
/**
* If <code>true</code>, the view will also show FacetValueDecorator which
* have a valueCount < 1. These values will be presented in another way and
* won't have any zoom effect when clicked.
*
* @see FacetValueDecorator
* @see SimpleContentProvider
*/
private final static boolean SHOW_EMPTY_FACET_VALUES = true;
/*
* (non-Javadoc)
* @see org.reuseware.coconut.description.classify.views.JFaceFacetView#buildViewer(boolean)
*/
@Override
protected ContentViewer buildViewer(boolean isMultiValue) {
if (treeViewer != null) {
treeViewer.getControl().dispose();
treeViewer = null;
}
if (isMultiValue || this.browserMode)
treeViewer = new TreeViewer(compViewer, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
else
treeViewer = new TreeViewer(compViewer, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
Tree tree = treeViewer.getTree();
tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
tree.setLinesVisible(false);
tree.setHeaderVisible(false);
for (int i = 0; i < tree.getColumnCount(); i++)
tree.getColumn(i).pack();
treeViewer.setContentProvider(new SimpleContentProvider(this, SHOW_EMPTY_FACET_VALUES));
treeViewer.setLabelProvider(new SimpleLabelProvider(this));
// treeViewer.setContentProvider(new
// AdapterFactoryContentProvider(rsItemPAdapterFac));
// ILabelDecorator decorator =
// PlatformUI.getWorkbench().getDecoratorManager()
// .getLabelDecorator();
// treeViewer.setLabelProvider(new DecoratingLabelProvider(new
// AdapterFactoryLabelProvider(
// rsItemPAdapterFac) {
// @SuppressWarnings("unused")
// public Image getImage(FacetType object) {
// Image image = super.getImage(object);
// if (image != null)
// return image;
//
// return PlatformUI.getWorkbench().getSharedImages().getImage(
// ISharedImages.IMG_OBJ_ELEMENT);
// }
// }, decorator));
treeViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
handleSetButton();
}
});
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
// make sure all selected values have a valueCount > 0!
Object[] elements = selection.toArray();
boolean zoom = true;
for (Object obj : elements) {
zoom &= !(((FacetValueDecorator) obj).getValueCount() < 1);
if (!zoom)
return;
}
performZoom();
}
});
int ops = DND.DROP_COPY | DND.DROP_MOVE;
Transfer[] transfers = new Transfer[] { TextTransfer.getInstance() };
treeViewer.addDropSupport(ops, transfers, new FacetDropListener(this));
treeViewer.setInput(null);
return treeViewer;
}
/*
* (non-Javadoc)
* @see org.reuseware.coconut.description.classify.views.FacetView#fillSelection()
*/
@Override
protected EList<FacetValueDecorator> fillSelection() {
EList<FacetValueDecorator> values = new BasicEList<FacetValueDecorator>();
for (TreeItem item : treeViewer.getTree().getSelection()) {
if (item.getData() instanceof FacetValueDecorator)
values.add((FacetValueDecorator) item.getData());
}
return values;
}
/*
* (non-Javadoc)
* @see org.reuseware.coconut.description.classify.views.FacetView#supportEdit(org.reuseware.coconut.description.Facet)
*/
@Override
public void supportEdit(Facet facet) {
List<TreeItem> selectedItems = new LinkedList<TreeItem>();
FacetValueDecorator vDecor;
FacetValueDecorator itemDecor;
for (FacetValue value : facet.getValues()) {
for (TreeItem item : treeViewer.getTree().getItems()) {
vDecor = DecorationManager.buildFacetValueDecorator(value);
itemDecor = (FacetValueDecorator) item.getData();
if (itemDecor.getDecoratee().equals(vDecor.getDecoratee())) {
selectedItems.add(item);
break;
}
}
}
treeViewer.getTree().setSelection(selectedItems.toArray(new TreeItem[] {}));
super.supportEdit(facet);
}
/*
* (non-Javadoc)
* @see org.reuseware.coconut.description.classify.views.FacetView#supportReset()
*/
@Override
public void supportReset() {
treeViewer.setSelection(null);
}
/*
* (non-Javadoc)
* @see org.reuseware.coconut.description.classify.views.FacetView#print()
*/
@Override
public void print() {
System.out.println("Hello FacetTreeView: " + VIEW_ID);
}
/*
* (non-Javadoc)
* @see org.reuseware.coconut.description.classify.views.JFaceFacetView#setContentProvider(boolean)
*/
@Override
protected void setContentProvider(boolean isMultiValue) {
if (treeViewer == null || treeViewer.getTree().isDisposed())
buildViewer(isMultiValue);
treeViewer.setContentProvider(new SimpleContentProvider(this, SHOW_EMPTY_FACET_VALUES));
}
/*
* (non-Javadoc)
* @see org.reuseware.coconut.description.classify.views.JFaceFacetView#getViewer()
*/
@Override
protected ContentViewer getViewer() {
return treeViewer;
}
}