/******************************************************************************* | |
* Copyright (C) 2018 Fondazione Bruno Kessler. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v2.0 | |
* which accompanies this distribution, and is available at | |
* http://www.eclipse.org/legal/epl-v20.html | |
* | |
* Contributors: | |
* Alberto Debiasi - initial API and implementation | |
******************************************************************************/ | |
package org.polarsys.chess.paramArchConfigurator.ui.wizard; | |
import java.util.Collections; | |
import java.util.HashSet; | |
import java.util.List; | |
import java.util.Set; | |
import org.apache.log4j.Logger; | |
import org.eclipse.jface.viewers.DoubleClickEvent; | |
import org.eclipse.jface.viewers.IDoubleClickListener; | |
import org.eclipse.jface.viewers.ILabelProvider; | |
import org.eclipse.jface.viewers.ISelection; | |
import org.eclipse.jface.viewers.ISelectionChangedListener; | |
import org.eclipse.jface.viewers.IStructuredSelection; | |
import org.eclipse.jface.viewers.ITreeContentProvider; | |
import org.eclipse.jface.viewers.SelectionChangedEvent; | |
import org.eclipse.jface.viewers.TreeViewer; | |
import org.eclipse.papyrus.infra.widgets.editors.ICommitListener; | |
import org.eclipse.papyrus.infra.widgets.providers.IAdaptableContentProvider; | |
import org.eclipse.papyrus.infra.widgets.providers.IGraphicalContentProvider; | |
import org.eclipse.papyrus.infra.widgets.providers.IHierarchicContentProvider; | |
import org.eclipse.swt.SWT; | |
import org.eclipse.swt.layout.FillLayout; | |
import org.eclipse.swt.layout.GridData; | |
import org.eclipse.swt.widgets.Composite; | |
import org.polarsys.chess.paramArchConfigurator.ui.wizard.page.LastPage; | |
public class TreeSelector { | |
private static final Logger logger = Logger.getLogger(TreeSelector.class); | |
private ILabelProvider labelProvider; | |
private ITreeContentProvider contentProvider; | |
private TreeViewer treeViewer; | |
private Composite composite; | |
private Object input = null; | |
// the final collection of selected elements, or null if this dialog was | |
// canceled | |
private Object[] result; | |
LastPage lastPage; | |
private final Set<ICommitListener> commitListeners = new HashSet<ICommitListener>(); | |
/** | |
* | |
* Constructor. | |
* | |
* @param lastPage | |
* | |
* @param parentShell | |
* The parent shell in which this dialog will be opened | |
*/ | |
public TreeSelector(Composite composite, LastPage lastPage) { | |
this.composite = composite; | |
this.lastPage = lastPage; | |
} | |
/** | |
* Sets the label provider for this dialog | |
* | |
* @param provider | |
*/ | |
public void setLabelProvider(ILabelProvider provider) { | |
labelProvider = provider; | |
if (treeViewer != null) { | |
treeViewer.setLabelProvider(labelProvider); | |
} | |
} | |
/** | |
* Sets the ContentProvider for this dialog The ContentProvider may be a | |
* {@link IHierarchicContentProvider} | |
* | |
* @param provider | |
* The content provider for this dialog. May be a | |
* {@link IHierarchicContentProvider} | |
*/ | |
public void setContentProvider(ITreeContentProvider provider) { | |
contentProvider = provider; | |
if (treeViewer != null) { | |
initViewerAndProvider(); | |
} | |
if (contentProvider instanceof ICommitListener) { | |
commitListeners.add((ICommitListener) contentProvider); | |
} | |
} | |
protected void initViewerAndProvider() { | |
treeViewer.setContentProvider(contentProvider); | |
if (treeViewer.getInput() == null) { | |
doSetInput(); | |
} | |
} | |
protected Composite getDialogArea() { | |
return (Composite) composite; | |
} | |
public void create() { | |
treeViewer = new TreeViewer(getDialogArea(), SWT.BORDER); | |
// treeViewer.setFilters(new ViewerFilter[]{ new PatternFilter() }); | |
if (labelProvider != null) { | |
treeViewer.setLabelProvider(labelProvider); | |
} | |
if (contentProvider != null) { | |
initViewerAndProvider(); | |
} | |
treeViewer.addFilter(new PackageViewFilter()); | |
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { | |
@Override | |
public void selectionChanged(SelectionChangedEvent event) { | |
ISelection selection = event.getSelection(); | |
Object selectedElement = null; | |
if (selection instanceof IStructuredSelection && !selection.isEmpty()) { | |
IStructuredSelection sSelection = (IStructuredSelection) selection; | |
selectedElement = sSelection.getFirstElement(); | |
} | |
if (contentProvider instanceof IHierarchicContentProvider) { | |
boolean isValidValue = ((IHierarchicContentProvider) contentProvider).isValidValue(selectedElement); | |
if (contentProvider instanceof IAdaptableContentProvider) { | |
selectedElement = ((IAdaptableContentProvider) contentProvider) | |
.getAdaptedValue(selectedElement); | |
} | |
if(lastPage.importArchitecture()){ | |
if (isValidValue) { | |
setResult(Collections.singletonList(selectedElement)); | |
} else { | |
setResult(Collections.emptyList()); | |
} | |
lastPage.setPageComplete(isValidValue); | |
} | |
// getOkButton().setEnabled(isValidValue);*/ | |
} | |
} | |
}); | |
treeViewer.addDoubleClickListener(new IDoubleClickListener() { | |
@Override | |
public void doubleClick(DoubleClickEvent event) { | |
/* | |
* if (getOkButton().isEnabled()) { okPressed(); } | |
*/ | |
} | |
}); | |
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); | |
data.minimumHeight = 300; | |
data.minimumWidth = 300; | |
treeViewer.getTree().setLayoutData(data); | |
if (contentProvider instanceof IGraphicalContentProvider) { | |
IGraphicalContentProvider graphicalContentProvider = (IGraphicalContentProvider) contentProvider; | |
Composite beforeTreeComposite = new Composite(getDialogArea(), SWT.NONE); | |
beforeTreeComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); | |
beforeTreeComposite.setLayout(new FillLayout()); | |
graphicalContentProvider.createBefore(beforeTreeComposite); | |
beforeTreeComposite.moveAbove(treeViewer.getTree()); | |
// Composite afterTreeComposite = new Composite(getDialogArea(), | |
// SWT.NONE); | |
// afterTreeComposite.setLayout(new FillLayout()); | |
// afterTreeComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, | |
// true, false)); | |
// graphicalContentProvider.createAfter(afterTreeComposite); | |
} | |
/* | |
* List<?> initialSelection = new ArrayList<String>(); if | |
* (contentProvider instanceof IRevealSemanticElement) { | |
* ((IRevealSemanticElement) | |
* contentProvider).revealSemanticElement(initialSelection); } else if | |
* (!initialSelection.isEmpty()) { // even if the encapsulated provider | |
* is not a IRevealSemanticElement treeViewer.setSelection(new | |
* StructuredSelection(initialSelection.get(0)), true); } | |
*/ | |
} | |
/** | |
* Get the TreeViewer used by this dialog | |
* | |
* @return The TreeViewer associated to this dialog | |
*/ | |
protected TreeViewer getViewer() { | |
return treeViewer; | |
} | |
/** | |
* Sets the input object for this dialog's TreeViewer | |
* | |
* @param input | |
*/ | |
public void setInput(Object input) { | |
this.input = input; | |
} | |
private void doSetInput() { | |
if (input == null) { | |
// Default non-null input for IStaticContentProvider | |
// (input-independent) | |
treeViewer.setInput(""); //$NON-NLS-1$ | |
} else { | |
treeViewer.setInput(input); | |
} | |
} | |
protected void setResult(List<Object> newResult) { | |
if (newResult == null) { | |
result = null; | |
} else { | |
result = new Object[newResult.size()]; | |
newResult.toArray(result); | |
} | |
} | |
public Object[] getResult() { | |
return result; | |
} | |
} |