package org.nightlabs.jfire.issuetracking.ui.issuelink.create; import java.util.Collection; import java.util.List; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.IWorkbenchPartSite; import org.nightlabs.base.ui.tree.AbstractTreeComposite; import org.nightlabs.base.ui.tree.TreeContentProvider; import org.nightlabs.eclipse.extension.EPProcessorException; import org.nightlabs.jdo.ObjectID; import org.nightlabs.jfire.issuetracking.ui.issuelink.IssueLinkHandlerCategory; import org.nightlabs.jfire.issuetracking.ui.issuelink.IssueLinkHandlerFactory; import org.nightlabs.jfire.issuetracking.ui.issuelink.IssueLinkHandlerFactoryRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Chairat Kongarayawetchakun - chairat[at]nightlabs[dot]de * */ public class SelectIssueLinkHandlerFactoryTreeComposite extends AbstractTreeComposite implements ISelectionProvider { private static final Logger logger = LoggerFactory.getLogger(SelectIssueLinkHandlerFactoryTreeComposite.class); private IWorkbenchPartSite site; private IssueLinkHandlerCategory issueLinkHandlerCategory; public IssueLinkHandlerCategory getIssueLinkHandlerCategory() { return issueLinkHandlerCategory; } /** * The currently selected factory or <code>null</code>. * @see #issueLinkHandlerCategory */ private IssueLinkHandlerFactory<ObjectID, Object> issueLinkHandlerFactory; public IssueLinkHandlerFactory<ObjectID, Object> getIssueLinkHandlerFactory() { return issueLinkHandlerFactory; } private List<IssueLinkHandlerCategory> categories; public List<IssueLinkHandlerCategory> getIssueLinkHandlerCategories() { return categories; } public SelectIssueLinkHandlerFactoryTreeComposite(Composite parent, int style, IWorkbenchPartSite site) { super(parent, style, true, true, false); this.site = site; try { IssueLinkHandlerFactoryRegistry registry = IssueLinkHandlerFactoryRegistry.sharedInstance(); categories = registry.getTopLevelCategories(); } catch (EPProcessorException e) { throw new RuntimeException(e); } getTreeViewer().setInput(categories); getTreeViewer().addSelectionChangedListener(new ISelectionChangedListener(){ public void selectionChanged(SelectionChangedEvent e) { Object firstElement = ((TreeSelection)e.getSelection()).getFirstElement(); issueLinkHandlerCategory = null; issueLinkHandlerFactory = null; if (firstElement == null) //In case of the check tree, when we click on the arrow, the selection will be null!!!! return; if (firstElement instanceof IssueLinkHandlerCategory) issueLinkHandlerCategory = (IssueLinkHandlerCategory) firstElement; else if (firstElement instanceof IssueLinkHandlerFactory) issueLinkHandlerFactory = (IssueLinkHandlerFactory<ObjectID, Object>) firstElement; ISelection selection = getSelection(); SelectionChangedEvent selectionChangedEvent = new SelectionChangedEvent(SelectIssueLinkHandlerFactoryTreeComposite.this, selection); for (Object listener : selectionChangedListeners.getListeners()) ((ISelectionChangedListener)listener).selectionChanged(selectionChangedEvent); } }); } @Override public void createTreeColumns(Tree tree) { } @Override public void setTreeProvider(TreeViewer treeViewer) { treeViewer.setContentProvider(new IssueLinkCategoryContentProvider()); treeViewer.setLabelProvider(new IssueLinkCategoryLabelProvider()); } class IssueLinkCategoryContentProvider extends TreeContentProvider { @Override public Object getParent(Object childElement) { return null; } @Override public boolean hasChildren(Object element) { if(element instanceof IssueLinkHandlerCategory) { IssueLinkHandlerCategory issueLinkHandlerCategory = (IssueLinkHandlerCategory)element; return issueLinkHandlerCategory.getChildFactories().size() > 0 || issueLinkHandlerCategory.getChildCategories().size() > 0; } return false; } public Object[] getElements(final Object inputElement) { if (inputElement instanceof Collection) { return ((Collection)inputElement).toArray(); } return new Object[] { inputElement }; } @Override public Object[] getChildren(Object parentElement) { if(parentElement instanceof IssueLinkHandlerCategory) { IssueLinkHandlerCategory issueLinkHandlerCategory = (IssueLinkHandlerCategory)parentElement; return issueLinkHandlerCategory.getChildObjects().toArray(new Object[0]); } return null; } } class IssueLinkCategoryLabelProvider extends LabelProvider { @Override public Image getImage(Object element) { if(element instanceof IssueLinkHandlerCategory) { IssueLinkHandlerCategory issueLinkHandlerCategory = (IssueLinkHandlerCategory)element; return issueLinkHandlerCategory.getImage(); } if(element instanceof IssueLinkHandlerFactory) { IssueLinkHandlerFactory issueLinkHandlerFactory = (IssueLinkHandlerFactory)element; return issueLinkHandlerFactory.getImage(); } return null; } @Override public String getText(Object element) { if(element instanceof IssueLinkHandlerCategory) { IssueLinkHandlerCategory issueLinkHandlerCategory = (IssueLinkHandlerCategory)element; return issueLinkHandlerCategory.getName(); } if(element instanceof IssueLinkHandlerFactory) { IssueLinkHandlerFactory issueLinkHandlerFactory = (IssueLinkHandlerFactory)element; return issueLinkHandlerFactory.getName(); } return String.valueOf(element); } } private ListenerList selectionChangedListeners = new ListenerList(); @Override public void addSelectionChangedListener(ISelectionChangedListener listener) { selectionChangedListeners.add(listener); } @Override public void removeSelectionChangedListener(ISelectionChangedListener listener) { selectionChangedListeners.remove(listener); } @Override public ISelection getSelection() { if (issueLinkHandlerFactory != null) return new StructuredSelection(issueLinkHandlerFactory); return new StructuredSelection(issueLinkHandlerCategory); } @Override public void setSelection(ISelection selection) { getTreeViewer().setSelection(selection); } }