/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.xviewer.util.internal.dialog;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.nebula.widgets.xviewer.XViewerText;
import org.eclipse.nebula.widgets.xviewer.util.internal.PatternFilter;
import org.eclipse.nebula.widgets.xviewer.util.internal.Result;
import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
public class XCheckFilteredTreeDialog extends MessageDialog {
protected Label statusLabel;
private Button okButton;
private XCheckedFilteredTree treeViewer;
private final PatternFilter patternFilter;
private Object input;
private final IContentProvider contentProvider;
private final IBaseLabelProvider labelProvider;
private Collection<? extends Object> initialSelections;
private final ViewerSorter viewerSorter;
public XCheckFilteredTreeDialog(String dialogTitle, String dialogMessage, PatternFilter patternFilter, IContentProvider contentProvider, IBaseLabelProvider labelProvider, ViewerSorter viewerSorter) {
super(Display.getCurrent().getActiveShell(), dialogTitle, null, dialogMessage, MessageDialog.NONE, new String[] {
XViewerText.get("button.ok"), XViewerText.get("button.cancel")}, 0); //$NON-NLS-1$ //$NON-NLS-2$
this.contentProvider = contentProvider;
this.labelProvider = labelProvider;
this.patternFilter = patternFilter;
this.viewerSorter = viewerSorter;
setShellStyle(getShellStyle() | SWT.RESIZE);
}
protected void createPreCustomArea(Composite parent) {
// provided for subclass implementation
}
public Set<Object> getChecked() {
if (getTreeViewer() == null) {
return Collections.emptySet();
}
return getTreeViewer().getChecked();
}
/**
* Sets the input. Convenience method.
*/
public final void setInput(Object input) {
this.input = input;
if (treeViewer != null) {
treeViewer.getViewer().setInput(input);
}
}
/**
* Sets the initial selection. Convenience method.
*/
public void setInitialSelections(Collection<? extends Object> initialSelections) {
this.initialSelections = initialSelections;
if (treeViewer != null) {
treeViewer.setInitalChecked(initialSelections);
}
}
public Object[] getResult() {
if (treeViewer == null) {
return new Object[] {};
}
return treeViewer.getResult();
}
@Override
protected Control createCustomArea(Composite parent) {
statusLabel = new Label(parent, SWT.NONE);
statusLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
updateStatusLabel();
createPreCustomArea(parent);
Composite aiComp = new Composite(parent, SWT.NONE);
aiComp.setLayout(XViewerLib.getZeroMarginLayout());
aiComp.setLayoutData(new GridData(GridData.FILL_BOTH));
treeViewer =
new XCheckedFilteredTree(aiComp,
SWT.MULTI | SWT.CHECK | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, patternFilter);
treeViewer.getViewer().getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
treeViewer.getViewer().setContentProvider(contentProvider);
treeViewer.getViewer().setLabelProvider(labelProvider);
treeViewer.getViewer().setSorter(viewerSorter);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = 400;
treeViewer.getViewer().getTree().setLayoutData(gd);
treeViewer.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
updateStatusLabel();
}
});
if (input != null) {
treeViewer.getViewer().setInput(input);
}
if (initialSelections != null) {
treeViewer.setInitalChecked(initialSelections);
}
return parent;
}
protected void updateStatusLabel() {
Result result = isComplete();
if (result.isFalse()) {
statusLabel.setText(result.getText());
} else {
statusLabel.setText(""); //$NON-NLS-1$
}
statusLabel.getParent().layout();
updateButtons();
}
@Override
protected Control createButtonBar(Composite parent) {
Control c = super.createButtonBar(parent);
okButton = getButton(0);
okButton.setEnabled(false);
return c;
}
protected Result isComplete() {
return Result.TrueResult;
}
private void updateButtons() {
if (okButton != null) {
okButton.setEnabled(isComplete().isTrue());
}
}
public XCheckedFilteredTree getTreeViewer() {
return treeViewer;
}
}