/*****************************************************************************
* Copyright (c) 2011 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.properties.widgets;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
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.papyrus.infra.widgets.editors.MultipleReferenceEditor;
import org.eclipse.papyrus.uml.profile.ui.dialogs.ProfileTreeSelectionDialog;
import org.eclipse.papyrus.uml.properties.Activator;
import org.eclipse.papyrus.uml.properties.messages.Messages;
import org.eclipse.papyrus.uml.properties.profile.ui.dialogs.FileSelectionFilter;
import org.eclipse.papyrus.uml.properties.profile.ui.dialogs.Message;
import org.eclipse.papyrus.uml.properties.profile.ui.dialogs.RegisteredProfileSelectionDialog;
import org.eclipse.papyrus.uml.tools.utils.ProfileUtil;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.Profile;
/**
* An editor for Profile application
*
* @author Camille Letavernier
*/
public class ProfileApplicationEditor extends MultipleReferenceEditor {
/**
* The button to add profiles from the list of registered ones
*/
protected Button addRegisteredProfile;
/**
* The button to reapply a profile
*/
protected Button reapplyProfile;
/**
* The umlPackage being edited
*/
protected Package umlPackage;
/**
*
* Constructor.
*
* @param parent
* @param style
*/
public ProfileApplicationEditor(Composite parent, int style) {
super(parent, style);
}
@Override
protected void createListControls() {
super.createListControls();
up.dispose();
down.dispose();
edit.dispose();
up = down = edit = null;
add.setToolTipText(Messages.ProfileApplicationEditor_ApplyProfile);
addRegisteredProfile = createButton(Activator.getDefault().getImage("/icons/AddReg.gif"), Messages.ProfileApplicationEditor_ApplyRegisteredProfile); //$NON-NLS-1$
reapplyProfile = createButton(org.eclipse.papyrus.infra.widgets.Activator.getDefault().getImage("/icons/refresh.gif"), "Reapply profile");
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
updateControls();
}
});
}
/**
* Applies a profile from workspace
*
* @see org.eclipse.papyrus.infra.widgets.editors.MultipleValueEditor#addAction()
*
*/
@Override
protected void addAction() {
//Code from org.eclipse.papyrus.uml.profile.ui.compositesformodel.AppliedProfileCompositeOnModel#applyProfileButtonPressed()
// Create and open the dialog box
// ResourceSelectionDialog dialog =
// new ResourceSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(), "Apply Profiles");
ILabelProvider lp = new WorkbenchLabelProvider();
ITreeContentProvider cp = new WorkbenchContentProvider();
ArrayList<String> filetypes = new ArrayList<String>();
filetypes.add("uml"); //$NON-NLS-1$
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), lp, cp);
dialog.setTitle(Messages.ProfileApplicationEditor_ApplyProfilesDialogTitle);
dialog.setMessage(Messages.ProfileApplicationEditor_ApplyProfilesDialogDescription);
dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
dialog.addFilter(new FileSelectionFilter(filetypes));
dialog.setValidator(new org.eclipse.papyrus.uml.properties.profile.ui.dialogs.FileSelectionValidator());
dialog.setDoubleClickSelects(true);
dialog.setHelpAvailable(false);
dialog.setAllowMultiple(true);
dialog.open();
// If nothing is selected : abort
if((dialog.getResult() == null) || (dialog.getResult().length < 1)) {
return;
}
ArrayList<Package> importedModels = new ArrayList<Package>();
for(int i = 0; i < dialog.getResult().length; i++) {
IFile selectedFile = (IFile)dialog.getResult()[i];
URI profileUri = URI.createURI("platform:/resource" + selectedFile.getFullPath().toString()); //$NON-NLS-1$
ResourceSet resourceSet = umlPackage.eResource().getResourceSet();
Resource profileResource = resourceSet.getResource(profileUri, true);
if(profileResource.getContents().get(0) instanceof Package) {
Package importedModel = (Package)profileResource.getContents().get(0);
importedModels.add(importedModel);
}
}
if(importedModels.size() > 0) {
ProfileTreeSelectionDialog profileDialog = new ProfileTreeSelectionDialog(getShell(), importedModels, true);
profileDialog.open();
ArrayList<Profile> profilesToApply = profileDialog.getResult();
Message message = new Message(Messages.ProfileApplicationEditor_WaitMessageTitle, Messages.ProfileApplicationEditor_WaitMessage);
message.open();
for(Profile profile : profilesToApply) {
modelProperty.add(profile);
}
message.close();
commit();
}
}
/**
* Applies a profile from the registry
*/
protected void addRegisteredAction() {
RegisteredProfileSelectionDialog profileSelectionDialog = new RegisteredProfileSelectionDialog(getShell(), umlPackage);
List<Profile> profilesToApply = profileSelectionDialog.run();
for(Profile profile : profilesToApply) {
modelProperty.add(profile);
}
commit();
}
protected void reapplyProfileAction() {
ISelection selectedElements = treeViewer.getSelection();
if(!selectedElements.isEmpty() && selectedElements instanceof IStructuredSelection) {
IStructuredSelection selection = (IStructuredSelection)selectedElements;
Iterator<?> iterator = selection.iterator();
while(iterator.hasNext()) {
Object element = iterator.next();
if(element instanceof Profile) {
modelProperty.add(element);
}
}
}
commit();
}
@Override
public void widgetSelected(SelectionEvent e) {
super.widgetSelected(e);
if(e.widget == addRegisteredProfile) {
addRegisteredAction();
}
if(e.widget == reapplyProfile) {
reapplyProfileAction();
}
}
/**
* Sets the package on which the profiles will be applied
*
* @param umlPackage
*/
public void setPackage(Package umlPackage) {
this.umlPackage = umlPackage;
updateControls();
}
@Override
protected void updateControls() {
boolean enabled = modelProperty != null && umlPackage != null;
add.setEnabled(enabled);
addRegisteredProfile.setEnabled(enabled);
remove.setEnabled(enabled);
// check whether the selection can be reapplied
IStructuredSelection selection = (IStructuredSelection)treeViewer.getSelection();
enabled = false;
Iterator<?> iterator = selection.iterator();
while(iterator.hasNext()) {
Object element = iterator.next();
if(element instanceof Profile) {
if(ProfileUtil.isDirty(umlPackage, (Profile)element)) {
enabled = true; //At least one dirty profile is selected
break;
}
}
}
reapplyProfile.setEnabled(enabled);
}
}