blob: 5c7f51c5c90e85aa3be3eacde2972c8eb7e320ba [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2011 Chair for Applied Software Engineering,
* Technische Universitaet Muenchen.
* 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:
* deser,karakoc
******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.ui.dialogs.admin.acimport.wizard;
import java.util.ArrayList;
import org.eclipse.emf.emfstore.internal.client.ui.dialogs.admin.acimport.ImportItemWrapper;
import org.eclipse.emf.emfstore.internal.client.ui.dialogs.admin.acimport.ImportLabelProvider;
import org.eclipse.emf.emfstore.internal.client.ui.dialogs.admin.acimport.ImportSource;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
/**
* @author deser, karakoc
*/
public class AcUserImportPageTwo extends WizardPage {
private TreeViewer tv;
private ArrayList<ImportItemWrapper> wrappedOrgUnits;
/**
* Page for displaying the OrgUnits that can be imported.
*/
public AcUserImportPageTwo() {
super(Messages.AcUserImportPageTwo_PageTwo);
}
/**
* @param parent composite, that will be filled.
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
final Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(2, false));
final Button selectAll = new Button(composite, SWT.CHECK);
selectAll.setText(Messages.AcUserImportPageTwo_Select_Deselect_All);
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 2;
selectAll.setLayoutData(gridData);
selectAll.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
final boolean selection = ((Button) event.widget).getSelection();
traverseCheck(tv.getTree(), selection);
setPageComplete(selection);
}
});
// How to add a filter to a treeviewer:
// http://jmesnil.net/weblog/2007/02/26/add-a-filter-to-a-treeviewer/
// Due to compatibility to ganymede
final PatternFilter patternFilter = new PatternFilter();
@SuppressWarnings("deprecation")
final FilteredTree filter = new FilteredTree(composite, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL, patternFilter);
gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL);
gridData.horizontalSpan = 2;
gridData.heightHint = convertHorizontalDLUsToPixels(280);
filter.setLayoutData(gridData);
tv = filter.getViewer();
tv.getTree().addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if (event.detail == SWT.CHECK) {
final TreeItem item = (TreeItem) event.item;
final boolean checked = item.getChecked();
traverseCheck(item, checked);
// TODO not perfect:
setPageComplete(true);
// walk through the whole tree and look, if sth. is
// selected now, if this is the case, then we can
// finish otherwise not.
}
}
});
final Button expandAllButton = new Button(composite, SWT.PUSH);
expandAllButton.setText(Messages.AcUserImportPageTwo_ExpandAll);
expandAllButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
tv.expandAll();
}
});
final Button collapseAllButton = new Button(composite, SWT.PUSH);
collapseAllButton.setText(Messages.AcUserImportPageTwo_CollapseAll);
collapseAllButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
tv.collapseAll();
}
});
setControl(composite);
setPageComplete(false);
}
/**
* @return Returns all items, that are checked in the tree.
*/
public ArrayList<ImportItemWrapper> getCheckedItems() {
// first clear old checked items
wrappedOrgUnits = new ArrayList<ImportItemWrapper>();
this.traverse(tv.getTree());
return wrappedOrgUnits;
}
private void traverseCheck(TreeItem item, boolean check) {
if (check) {
tv.expandToLevel(item, AbstractTreeViewer.ALL_LEVELS);
} else {
tv.collapseToLevel(item, AbstractTreeViewer.ALL_LEVELS);
}
final TreeItem[] items = item.getItems();
for (int i = 0; i < items.length; i++) {
items[i].setChecked(check);
traverseCheck(items[i], check);
}
}
private void traverseCheck(Tree tree, boolean check) {
final TreeItem[] items = tree.getItems();
for (int i = 0; i < items.length; i++) {
items[i].setChecked(check);
traverseCheck(items[i], check);
}
}
private void traverse(TreeItem item) {
final TreeItem[] items = item.getItems();
for (int i = 0; i < items.length; i++) {
if (items[i].getChecked()) {
wrappedOrgUnits.add((ImportItemWrapper) items[i].getData());
}
traverse(items[i]);
}
}
private void traverse(Tree tree) {
final TreeItem[] items = tree.getItems();
for (int i = 0; i < items.length; i++) {
if (items[i].getChecked()) {
wrappedOrgUnits.add((ImportItemWrapper) items[i].getData());
}
traverse(items[i]);
}
}
/**
* Initializes the page, i.e. this method is not called at the time this class gets instantiated but later, when the
* page is going to get displayed.
*
* @param src the selected ImportSource
*/
public void init(ImportSource src) {
final AcUserImportWizard wizard = (AcUserImportWizard) getWizard();
tv.setContentProvider(src);
tv.setLabelProvider(new ImportLabelProvider(wizard.getController()));
tv.setInput(src.getElements(null)); // argument is a non-null that will
// be ignored
setTitle(wizard.getController().getTitle());
this.setMessage(wizard.getController().getMessage());
}
}