package de.hub.emffrag.ui.views;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.util.URI;
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.resource.impl.ResourceSetImpl;
import org.eclipse.gmt.modisco.infra.browser.uicore.CustomizableModelContentProvider;
import org.eclipse.gmt.modisco.infra.browser.uicore.CustomizableModelLabelProvider;
import org.eclipse.gmt.modisco.infra.browser.uicore.CustomizationManager;
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.dialogs.MessageDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.part.ViewPart;
import de.hub.emffrag.EmfFragActivator;
/** This view uses the MoDisco content and label providers. */
public class EmfFragView extends ViewPart {
/**
* The ID of the view as specified by the extension.
*/
public static final String ID = "de.hub.emffrag.ui.views.EmfFragView";
private TreeViewer viewer;
private DrillDownAdapter drillDownAdapter;
private Action addModelAction;
private Action doubleClickAction;
private ResourceSet rs = null;
public EmfFragView() {
}
/**
* This is a callback that will allow us
* to create the viewer and initialize it.
*/
public void createPartControl(Composite parent) {
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
drillDownAdapter = new DrillDownAdapter(viewer);
CustomizationManager customizationManager = new CustomizationManager();
customizationManager.setShowAttributes(true);
CustomizableModelContentProvider contentProvider = new CustomizableModelContentProvider(customizationManager) {
@Override
public Object[] getRootElements(Object inputElement) {
List<EObject> result = new ArrayList<EObject>();
if (inputElement instanceof ResourceSet) {
for(Resource resource: ((ResourceSet)inputElement).getResources()) {
synchronized (resource) {
result.addAll(resource.getContents());
}
}
return result.toArray();
} else {
return super.getRootElements(inputElement);
}
}
};
CustomizableModelLabelProvider labelProvider = new CustomizableModelLabelProvider(customizationManager);
viewer.setLabelProvider(labelProvider);
viewer.setContentProvider(contentProvider);
rs = new ResourceSetImpl();
viewer.setInput(rs);
// Create the help context id for the viewer's control
PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "de.hub.emffrag.ui.viewer");
makeActions();
hookContextMenu();
hookDoubleClickAction();
contributeToActionBars();
}
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
EmfFragView.this.fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
fillLocalToolBar(bars.getToolBarManager());
}
private void fillLocalPullDown(IMenuManager manager) {
manager.add(addModelAction);
manager.add(new Separator());
}
private void fillContextMenu(IMenuManager manager) {
manager.add(addModelAction);
manager.add(new Separator());
drillDownAdapter.addNavigationActions(manager);
// Other plug-ins can contribute there actions here
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void fillLocalToolBar(IToolBarManager manager) {
manager.add(addModelAction);
manager.add(new Separator());
drillDownAdapter.addNavigationActions(manager);
}
private void makeActions() {
addModelAction = new Action() {
public void run() {
addModel();
}
};
addModelAction.setText("Add model");
addModelAction.setToolTipText("Add a model");
addModelAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
getImageDescriptor(ISharedImages.IMG_OBJ_ADD));
doubleClickAction = new Action() {
public void run() {
ISelection selection = viewer.getSelection();
Object obj = ((IStructuredSelection)selection).getFirstElement();
showMessage("Double-click detected on "+obj.toString());
}
};
}
private void hookDoubleClickAction() {
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
doubleClickAction.run();
}
});
}
private void showMessage(String message) {
MessageDialog.openInformation(
viewer.getControl().getShell(),
"EMF-Fragments View",
message);
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
viewer.getControl().setFocus();
}
private void addModel(String uriString) {
Resource resource = null;
try {
URI uri = URI.createURI(uriString);
EmfFragActivator.instance.useBinaryFragments = uriString.endsWith(".bin");
resource = rs.getResource(uri, true);
viewer.setInput(rs);
} catch (Exception e) {
showMessage("Could not open the model at " + uriString + ": " + e.getMessage());
e.printStackTrace();
if (resource != null) {
try {
resource.delete(null);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
private void addModel() {
final Shell dialog = new Shell (viewer.getControl().getShell(), SWT.DIALOG_TRIM | SWT.SHEET);
dialog.setText("Add a model");
FormLayout formLayout = new FormLayout ();
formLayout.marginWidth = 10;
formLayout.marginHeight = 10;
formLayout.spacing = 10;
dialog.setLayout (formLayout);
Label label = new Label (dialog, SWT.NONE);
label.setText ("Model URI:");
FormData data = new FormData ();
label.setLayoutData (data);
Button cancel = new Button (dialog, SWT.PUSH);
cancel.setText ("Cancel");
data = new FormData ();
data.width = 60;
data.right = new FormAttachment (100, 0);
data.bottom = new FormAttachment (100, 0);
cancel.setLayoutData (data);
cancel.addSelectionListener (new SelectionAdapter () {
@Override
public void widgetSelected (SelectionEvent e) {
dialog.close ();
}
});
final Text text = new Text (dialog, SWT.BORDER);
text.setText("mongodb://jupiter.informatik.hu-berlin.de/org.eclipse.emf.java.bin");
data = new FormData ();
data.width = 200;
data.left = new FormAttachment (label, 0, SWT.DEFAULT);
data.right = new FormAttachment (100, 0);
data.top = new FormAttachment (label, 0, SWT.CENTER);
data.bottom = new FormAttachment (cancel, 0, SWT.DEFAULT);
text.setLayoutData (data);
Button ok = new Button (dialog, SWT.PUSH);
ok.setText ("OK");
data = new FormData ();
data.width = 60;
data.right = new FormAttachment (cancel, 0, SWT.DEFAULT);
data.bottom = new FormAttachment (100, 0);
ok.setLayoutData (data);
ok.addSelectionListener (new SelectionAdapter () {
@Override
public void widgetSelected (SelectionEvent e) {
addModel(text.getText());
dialog.close ();
}
});
dialog.setDefaultButton (ok);
dialog.pack ();
dialog.open ();
}
}