/*****************************************************************************
* Copyright (c) 2012 CEA LIST.
*
* 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:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
*****************************************************************************/
package org.eclipse.papyrus.uml.profile.model;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.papyrus.uml.profile.providers.AppliedProfileContentProvider;
import org.eclipse.papyrus.uml.profile.providers.AppliedProfileLabelProvider;
import org.eclipse.papyrus.uml.tools.utils.ProfileUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.Profile;
public class RefreshProfileDialog extends SelectionDialog {
protected final Map<Package, Collection<Profile>> profilesToReapply;
protected Runnable callback;
protected Package rootPackage;
protected RefreshProfileDialog(Shell parentShell, Package rootPackage) {
super(parentShell);
setBlockOnOpen(false);
this.rootPackage = rootPackage;
profilesToReapply = new HashMap<Package, Collection<Profile>>();
setTitle("Some profiles have changed");
}
public void setCallback(Runnable callback) {
this.callback = callback;
}
@Override
public void create() {
super.create();
Label descriptionLabel = new Label(getDialogArea(), SWT.WRAP);
descriptionLabel.setText("Some local profiles have changed. Select the ones you want to re-apply");
TreeViewer viewer = new TreeViewer(getDialogArea());
viewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Tree tree = viewer.getTree();
TableLayout layout = new TableLayout();
TreeColumn propertyColumn = new TreeColumn(tree, SWT.CENTER);
propertyColumn.setText("Package");
layout.addColumnData(new ColumnWeightData(30, 300, true));
TreeColumn ownerColumn = new TreeColumn(tree, SWT.CENTER);
ownerColumn.setText("Profile");
layout.addColumnData(new ColumnWeightData(60, 150, true));
TreeColumn checkColumn = new TreeColumn(tree, SWT.CENTER);
checkColumn.setText("Reapply");
layout.addColumnData(new ColumnWeightData(10, 70, true));
tree.setLayout(layout);
tree.setHeaderVisible(true);
viewer.setContentProvider(new AppliedProfileContentProvider(rootPackage));
viewer.setLabelProvider(new AppliedProfileLabelProvider());
viewer.setInput(new Object());
installEditors(viewer);
getDialogArea().layout();
getShell().pack();
}
protected void installEditors(TreeViewer viewer) {
viewer.expandAll();
for(TreeItem item : viewer.getTree().getItems()) {
installEditors(item, rootPackage);
}
}
protected void installEditors(TreeItem treeItem, final Package parentPackage) {
Package currentPackage = (Package)treeItem.getData();
if(currentPackage instanceof Profile) {
final Profile profile = (Profile)currentPackage;
if(ProfileUtil.isDirty(parentPackage, profile)) {
Tree tree = treeItem.getParent();
final Button checkbox = new Button(tree, SWT.CHECK);
checkbox.setSelection(true);
getProfilesToReapply(parentPackage).add(profile);
checkbox.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
if(checkbox.getSelection()) {
getProfilesToReapply(parentPackage).add(profile);
} else {
getProfilesToReapply(parentPackage).remove(profile);
}
}
public void widgetDefaultSelected(SelectionEvent e) {
//Nothing
}
});
TreeEditor editor = new TreeEditor(tree);
editor.horizontalAlignment = SWT.CENTER;
editor.grabHorizontal = true;
editor.setEditor(checkbox, treeItem, 2);
}
}
for(TreeItem subitem : treeItem.getItems()) {
installEditors(subitem, currentPackage);
}
}
@Override
protected Composite getDialogArea() {
return (Composite)super.getDialogArea();
}
protected Collection<Profile> getProfilesToReapply(Package currentPackage) {
if(!profilesToReapply.containsKey(currentPackage)) {
profilesToReapply.put(currentPackage, new LinkedHashSet<Profile>());
}
return profilesToReapply.get(currentPackage);
}
@Override
protected void okPressed() {
setSelectionResult(profilesToReapply.values().toArray());
if(callback != null) {
callback.run();
}
super.okPressed();
}
public Map<Package, Collection<Profile>> getProfilesToReapply() {
return profilesToReapply;
}
}