blob: 2a4e16bec1d95a18681b06ca076f391b6db5cfed [file] [log] [blame]
package org.eclipse.emf.refactor.smells.runtime.ui;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.ui.viewer.IViewerProvider;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.refactor.smells.interfaces.IHighlighting;
import org.eclipse.emf.refactor.smells.runtime.core.EObjectGroup;
import org.eclipse.emf.refactor.smells.runtime.core.ResultModel;
import org.eclipse.emf.refactor.smells.runtime.managers.RuntimeManager;
import org.eclipse.emf.refactor.smells.runtime.ui.actions.ClearAction;
import org.eclipse.emf.refactor.smells.runtime.ui.actions.SaveAction;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.ViewPart;
/**
* View for displaying the <i>ResultModel</i> of a smell identification process.
*
* @author Matthias Burhenne
*
*/
public class ResultModelTreeView extends ViewPart {
// public static final String MENU_ID = "de.unimarburg.swt.emf.modelsmell.resultview.contextmenu";
public static final String MENU_ID = "org.eclipse.emf.refactor.smells.view";
private ResultModelTreeViewer viewer;
private Composite parent;
private SaveAction saveAction;
private ClearAction clearAction;
private List<Action> additionalActions = new ArrayList<Action>();
private List<IHighlighting> additionalHighlightings = new ArrayList<IHighlighting>();
private static IMenuManager barMM;
private static IToolBarManager toolbarMM;
@Override
public void createPartControl(Composite parent) {
this.parent = parent;
this.viewer = new ResultModelTreeViewer(parent); //TODO: add link between viewer and EMFModelSmells
viewer.setContentProvider(new ResultModelTreeViewerContentProvider());
viewer.setLabelProvider(new ResultModelTreeViewerLabelProvider());
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
if(event.getSelection().isEmpty()) {
return;
}
// if (event.getSelection() instanceof StructuredSelection) {
// StructuredSelection ss = (StructuredSelection) event.getSelection();
// System.out.println("StructuredSelection: " + ss);
// Object selection = ss.getFirstElement();
// System.out.println("Selection: " + selection);
// ArrayList<EObject> eObjectList = new ArrayList<EObject>();
// System.out.println("eObjectList: " + eObjectList);
// if (selection instanceof EObject) {
// String path = ((EObject) selection).eResource().getURI().toPlatformString(false);
// System.out.println("Path: " + path);
// eObjectList.add((EObject) selection);
// }
// if (selection instanceof EObjectGroup) {
// eObjectList.addAll(((EObjectGroup) selection).getEObjects());
// }
// System.out.println("eObjectList: " + eObjectList);
// Object[] objects = eObjectList.toArray();
// RuntimeManager.selectModelObjects(objects);
// }
IEditorPart editorPart = null;
if(event.getSelection() instanceof IStructuredSelection) {
editorPart = openEditor((IStructuredSelection)event.getSelection());
StructuredSelection ss = (StructuredSelection) event.getSelection();
Object selection = ss.getFirstElement();
// if (selection instanceof EObject || selection instanceof EObjectGroup) {
doAdditionalHighlightings(selection);
// }
}
if(editorPart != null && editorPart instanceof IViewerProvider){
setSelectionInModel((IViewerProvider)editorPart, (IStructuredSelection)event.getSelection());
// ((IViewerProvider)editorPart).getViewer().setSelection(event.getSelection(), true);
}
}
private void setSelectionInModel(IViewerProvider provider, IStructuredSelection selection){
ArrayList<EObject> eObjectList = new ArrayList<EObject>();
for(Object selectedObject : selection.toList()){
if(selectedObject instanceof EObjectGroup){
for(EObject currentEObject : ((EObjectGroup)selectedObject).getEObjects()){
EObject modelInstanceObject = getModelObjectInstance(provider, currentEObject);
eObjectList.add(modelInstanceObject);
}
((EObjectGroup)selectedObject).setEObjects(eObjectList);
}else if(selectedObject instanceof EObject){
eObjectList.add(getModelObjectInstance(provider, (EObject)selectedObject));
}
}
provider.getViewer().setSelection(new StructuredSelection(eObjectList));
// Object o = selection.getFirstElement();
// if(o instanceof EObject){
// Object input = provider.getViewer().getInput();
// provider.getViewer().setSelection(selection);
// }else if(o instanceof EObjectGroup){
// StructuredSelection s = new StructuredSelection(((EObjectGroup)o).getEObjects());
// provider.getViewer().setSelection(s);
// }
}
private EObject getModelObjectInstance(IViewerProvider provider, EObject eObject) {
Viewer viewer = provider.getViewer();
TreeViewer treeViewer = (TreeViewer)viewer;
Tree tree = treeViewer.getTree();
TreeItem treeItem = tree.getItem(0);
Resource o = (Resource)treeItem.getData();
ResourceSet set = o.getResourceSet();
EObject ob = set.getEObject(EcoreUtil.getURI(eObject), true);
// String uri = o.getURIFragment(eObject);
return ob;
// return o.getEObject(uri);
// EObject equalObject = o.getEObject(eObject.eResource().getURIFragment(eObject));
// return equalObject;
// if(provider instanceof IEditingDomainProvider){
// IEditingDomainProvider prov = (IEditingDomainProvider)provider;
// TreeIterator iterator = prov.getEditingDomain().treeIterator(viewer.getCurrentRoot());
// while(iterator.hasNext()){
// Object itObj = iterator.next();
// if(itObj.equals(eObject)){
// return (EObject) itObj;
// }
// }
// }
// return eObject;
}
@SuppressWarnings("unchecked")
private IEditorPart openEditor(IStructuredSelection selection){
Object o = selection.getFirstElement();
EObject obj = null;
if(o instanceof EObject){
obj = (EObject)o;
}else if(o instanceof EObjectGroup){
EObjectGroup group = (EObjectGroup)o;
if(!group.getEObjects().isEmpty()){
obj = group.getEObjects().getFirst();
}
}
if(obj != null){
// URI uri = obj.eResource().getURI();
// String fileString = URI.decode(uri.path());
// fileString = fileString.replaceFirst("/resource", "");
// IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fileString));
// IWorkbench workbench = PlatformUI.getWorkbench();
IFile file = ((LinkedList<ResultModel>)viewer.getInput()).get(0).getIFile();
IWorkbenchWindow workbenchWindow= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IWorkbenchPage page = workbenchWindow.getActivePage();
try {
if(file.exists()){
return IDE.openEditor(page, file);
}
}catch (PartInitException exception) {
return null;
}
}
return null;
}
});
RuntimeManager.setResultModelTreeViewer(viewer);
LinkedList<ResultModel> result = RuntimeManager.getResultModels();
if(result != null){
viewer.setInput(result);
}
makeActions();
hookContextMenu();
contributeToActionBars();
}
protected void doAdditionalHighlightings(Object selection) {
for (IHighlighting highlighting : additionalHighlightings) {
highlighting.highlight(selection);
}
}
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
ResultModelTreeView.this.fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
// private void createContextMenu() {
// MenuManager menuMgr = new MenuManager();
// menuMgr.setRemoveAllWhenShown(true);
// menuMgr.addMenuListener(new IMenuListener() {
//
//
// @Override
// public void menuAboutToShow(IMenuManager manager) {
// fillContextMenu(manager);
// }
//
// private void fillContextMenu(IMenuManager manager){
// manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
// }
// });
//
// // Create menu.
// Menu menu = menuMgr.createContextMenu(viewer.getControl());
// viewer.getControl().setMenu(menu);
//
// // Register menu for extension.
// getSite().registerContextMenu(MENU_ID, menuMgr, viewer);
// }
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
fillLocalToolBar(bars.getToolBarManager());
}
private void fillLocalPullDown(IMenuManager manager) {
barMM = manager;
manager.add(saveAction);
manager.add(clearAction);
manager.add(new Separator());
}
private void fillContextMenu(IMenuManager manager) {
manager.add(saveAction);
manager.add(clearAction);
// Other plug-ins can contribute there actions here
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void fillLocalToolBar(IToolBarManager manager) {
toolbarMM = manager;
manager.add(saveAction);
manager.add(clearAction);
}
private void makeActions() {
saveAction = new SaveAction(parent.getShell(), viewer);
clearAction = new ClearAction();
}
@SuppressWarnings("unchecked")
public IEditorPart openEditor(IStructuredSelection selection){
Object o = selection.getFirstElement();
EObject obj = null;
if(o instanceof EObject){
obj = (EObject)o;
}
if(o instanceof EObjectGroup){
EObjectGroup group = (EObjectGroup)o;
if(!group.getEObjects().isEmpty()){
obj = group.getEObjects().getFirst();
}
}
if(obj != null){
// URI uri = obj.eResource().getURI();
// String fileString = URI.decode(uri.path());
// fileString = fileString.replaceFirst("/resource", "");
// IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fileString));
// IWorkbench workbench = PlatformUI.getWorkbench();
IFile file = ((LinkedList<ResultModel>)viewer.getInput()).get(0).getIFile();
IWorkbenchWindow workbenchWindow= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IWorkbenchPage page = workbenchWindow.getActivePage();
try {
if(file.exists()){
return IDE.openEditor(page, file);
}
}catch (PartInitException exception) {
return null;
}
}
return null;
}
@Override
public void setFocus() {
viewer.getControl().setFocus();
}
public void addAction(Action action) {
additionalActions.add(action);
}
public void addActionsToMenu() {
for (Action action : additionalActions) {
if (toolbarMM.getItems().length != additionalActions.size()+2) {
barMM.add(action);
barMM.update(true);
toolbarMM.add(action);
toolbarMM.update(true);
}
}
additionalActions.clear();
}
public void addHighlighting(IHighlighting highlighting) {
additionalHighlightings.add(highlighting);
}
}