package de.ovgu.cide.mining.relationmanager; import java.util.Comparator; import java.util.LinkedList; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.ui.JavaUI; 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.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; 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.graphics.Image; import org.eclipse.swt.layout.FillLayout; 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.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.DrillDownAdapter; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.texteditor.ITextEditor; import de.ovgu.cide.mining.database.ApplicationController; import de.ovgu.cide.mining.database.model.AElement; import de.ovgu.cide.mining.events.AElementPreviewEvent; import de.ovgu.cide.mining.relationmanager.model.RelationTreeNode; import de.ovgu.cide.mining.relationmanager.model.RelationTreeNode.NODE_KIND; /** * This sample class demonstrates how to plug-in a new workbench view. The view * shows data obtained from the model. The sample creates a dummy model on the * fly, but a real implementation would connect to the model available either in * this or another plug-in (e.g. the workspace). The view is connected to the * model using a content provider. * <p> * The view uses a label provider to define how model objects should be * presented in the view. Each view can present the same model objects using * different labels and icons, if needed. Alternatively, a single label provider * can be shared between views in order to ensure that objects of the same type * are presented in the same way everywhere. * <p> */ public class RelationManagerView extends ViewPart { /** * The ID of the view as specified by the extension. */ public static final String ID = "de.ovgu.cide.mining.relationmanager"; public static enum MESSAGE_TYPE { WARNING, ERROR, INFO, ELEMENT, NONE } Image imgError; Image imgWarning; Image imgInfo; Image imgElment; private TreeViewer viewer; private Tree tree; private Label infoLabel; private Label infoIconLabel; public static final int HISTROY_SIZE = 10; private Button[] historyButton; private LinkedList<AElement> historyList; private DrillDownAdapter drillDownAdapter; private Action action1; private Action action2; private Action doubleClickAction; private Action selectionChangedAction; private RelationContentProvider contentProvider; private TreeColumn[] columns; private RelationSorter sorter; /** * The constructor. */ public RelationManagerView() { } /** * This is a callback that will allow us to create the viewer and initialize * it. */ public void createPartControl(Composite parent) { imgWarning = PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_OBJS_WARN_TSK); imgError = PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_OBJS_ERROR_TSK); imgInfo = PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_OBJS_INFO_TSK); imgElment = PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_OBJ_FILE); Composite workArea = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; layout.horizontalSpacing = 0; layout.verticalSpacing = 0; workArea.setLayout(layout); Composite infoArea = new Composite(workArea, SWT.NONE); layout = new GridLayout(); layout.numColumns = 2; infoArea.setLayout(layout); GridData data = new GridData(); data.horizontalAlignment = SWT.FILL; data.verticalAlignment = SWT.TOP; data.grabExcessHorizontalSpace = true; infoArea.setLayoutData(data); infoIconLabel = new Label(infoArea, SWT.LEFT); data = new GridData(); data.horizontalAlignment = SWT.LEFT; data.verticalAlignment = SWT.CENTER; infoIconLabel.setLayoutData(data); infoLabel = new Label(infoArea, SWT.LEFT); data = new GridData(); data.horizontalAlignment = SWT.FILL; data.verticalAlignment = SWT.TOP; data.grabExcessHorizontalSpace = true; infoLabel.setLayoutData(data); Composite line = new Composite(workArea, SWT.NONE); line.setBackground(parent.getShell().getDisplay().getSystemColor( SWT.COLOR_GRAY)); data = new GridData(); data.horizontalAlignment = SWT.FILL; data.verticalAlignment = SWT.TOP; data.grabExcessHorizontalSpace = true; data.heightHint = 1; line.setLayoutData(data); Composite viewerArea = new Composite(workArea, SWT.NONE); data = new GridData(); data.horizontalAlignment = SWT.FILL; data.verticalAlignment = SWT.FILL; data.grabExcessHorizontalSpace = true; data.grabExcessVerticalSpace = true; viewerArea.setLayoutData(data); viewerArea.setLayout(new FillLayout()); viewer = new TreeViewer(viewerArea, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); drillDownAdapter = new DrillDownAdapter(viewer); tree = viewer.getTree(); tree.setHeaderVisible(true); tree.setLinesVisible(true); columns = new TreeColumn[3]; columns[0] = new TreeColumn(tree, SWT.LEFT); columns[0].setText("Name"); columns[0].setWidth(250); columns[1] = new TreeColumn(tree, SWT.CENTER); columns[1].setText("Range"); columns[1].setWidth(80); columns[2] = new TreeColumn(tree, SWT.CENTER); columns[2].setText("Views"); columns[2].setWidth(50); viewer .setContentProvider(contentProvider = new RelationContentProvider( this)); viewer.setLabelProvider(new RelationLabelProvider()); createSorter(); viewer.setInput(getViewSite()); Composite historyArea = new Composite(workArea, SWT.NONE); layout = new GridLayout(); layout.numColumns = HISTROY_SIZE + 1; layout.marginWidth = 0; layout.marginHeight = 0; layout.horizontalSpacing = 0; layout.verticalSpacing = 0; historyArea.setLayout(layout); data = new GridData(); data.horizontalAlignment = SWT.FILL; data.verticalAlignment = SWT.TOP; data.grabExcessHorizontalSpace = true; historyArea.setLayoutData(data); historyList = new LinkedList<AElement>(); Button clearButton = new Button(historyArea, SWT.PUSH); clearButton.setText("Clear"); clearButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { clearHistory(); } }); historyButton = new Button[HISTROY_SIZE]; for (int i = 0; i < historyButton.length; i++) { historyButton[i] = new Button(historyArea, SWT.CENTER); data = new GridData(); data.horizontalAlignment = SWT.FILL; data.verticalAlignment = SWT.CENTER; data.grabExcessHorizontalSpace = true; historyButton[i].setLayoutData(data); historyButton[i].setData(i); final Button curButton = historyButton[i]; curButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { showHistoryItem((Integer) curButton.getData()); } }); } makeActions(); hookContextMenu(); hookDoubleClickAction(); hookSelectionChangedAction(); contributeToActionBars(); } public void addToHistory(AElement element) { if (element == null) return; if (historyList.size() >= HISTROY_SIZE) { historyList.removeFirst(); } historyList.add(element); showHistory(); } private void showHistoryItem(int i) { int size = historyList.size(); if (i < size) { contentProvider.displayItemChanged(historyList.get(i), false); for (int j = i + 1; j < size; j++) { historyList.removeLast(); historyButton[j].setImage(null); historyButton[j].setToolTipText(""); } } } private void clearHistory() { historyList.clear(); for (int i = 0; i < historyButton.length; i++) { historyButton[i].setToolTipText(""); historyButton[i].setImage(null); } } private void showHistory() { int i = 0; for (AElement tmpElement : historyList) { historyButton[i].setToolTipText(tmpElement.getFullName()); historyButton[i].setImage(imgElment); i++; } } public Tree getTree() { return tree; } public TreeViewer getTreeViewer() { return viewer; } public void setInfoMessage(final String msg, final MESSAGE_TYPE type) { Display.getDefault().syncExec(new Runnable() { public void run() { if (type == MESSAGE_TYPE.NONE) infoIconLabel.setImage(null); else if (type == MESSAGE_TYPE.ERROR) infoIconLabel.setImage(imgError); else if (type == MESSAGE_TYPE.WARNING) infoIconLabel.setImage(imgWarning); else if (type == MESSAGE_TYPE.INFO) infoIconLabel.setImage(imgInfo); else if (type == MESSAGE_TYPE.ELEMENT) infoIconLabel.setImage(imgElment); infoLabel.setToolTipText(msg); infoLabel.setText(msg); } }); } private void hookContextMenu() { MenuManager menuMgr = new MenuManager("#PopupMenu"); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { RelationManagerView.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(action1); manager.add(new Separator()); manager.add(action2); } private void fillContextMenu(IMenuManager manager) { manager.add(action1); manager.add(action2); 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(action1); manager.add(action2); manager.add(new Separator()); drillDownAdapter.addNavigationActions(manager); } private void makeActions() { // EXAMPLE 1 action1 = new Action() { public void run() { showMessage("Action 1 executed"); } }; action1.setText("Action 1"); action1.setToolTipText("Action 1 tooltip"); action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages() .getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK)); // EXAMPLE 2 action2 = new Action() { public void run() { showMessage("Action 2 executed"); } }; action2.setText("Action 2"); action2.setToolTipText("Action 2 tooltip"); action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages() .getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK)); doubleClickAction = new Action() { public void run() { ISelection selection = viewer.getSelection(); Object obj = ((IStructuredSelection) selection) .getFirstElement(); if (!(obj instanceof RelationTreeNode)) return; if (((RelationTreeNode) obj).getKind() != NODE_KIND.ELEMENT) return; AElement jayElement = (AElement) ((RelationTreeNode) obj) .getDataObject(); contentProvider.displayItemChanged(jayElement, true); } }; selectionChangedAction = new Action() { public void run() { ISelection selection = viewer.getSelection(); Object obj = ((IStructuredSelection) selection) .getFirstElement(); if (!(obj instanceof RelationTreeNode)) return; if (((RelationTreeNode) obj).getKind() != NODE_KIND.ELEMENT) return; ApplicationController jayFX = ApplicationController .getInstance(); try { AElement jayElement = (AElement) ((RelationTreeNode) obj) .getDataObject(); setInfoMessage(jayElement.getId(), MESSAGE_TYPE.ELEMENT); IEditorPart javaEditor; javaEditor = JavaUI.openInEditor(jayFX .getICompilationUnit(jayElement .getCompelationUnitHash())); if (javaEditor instanceof ITextEditor) { jayFX.fireEvent(new AElementPreviewEvent( RelationManagerView.this)); // UnifiedASTNode node = jayElement.getUnifiedASTNode(); ((ITextEditor) javaEditor).selectAndReveal(jayElement .getStartPosition(), jayElement.getLength()); // ((ITextEditor)javaEditor).etHighlightRange(node.getStartPosition(), // node.getLength(),true); } } catch (PartInitException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JavaModelException e) { // TODO Auto-generated catch block e.printStackTrace(); } // showMessage("Selection changed on "+obj.toString()); } }; } private void hookDoubleClickAction() { viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { doubleClickAction.run(); } }); } private void hookSelectionChangedAction() { viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { // TODO Auto-generated method stub selectionChangedAction.run(); } }); } private void showMessage(String message) { MessageDialog.openInformation(viewer.getControl().getShell(), "Relation Manager View", message); } private void createSorter() { Comparator<RelationTreeNode>[] comparators = new Comparator[3]; comparators[0] = new Comparator<RelationTreeNode>() { public int compare(RelationTreeNode o1, RelationTreeNode o2) { return o1.getDisplayName().compareTo(o2.getDisplayName()); } }; // range comparators[1] = new Comparator<RelationTreeNode>() { public int compare(RelationTreeNode o1, RelationTreeNode o2) { if (o1.getStartRange() < o2.getStartRange()) return -1; if (o1.getStartRange() > o2.getStartRange()) return 1; if (o1.getEndRange() < o2.getEndRange()) return -1; if (o1.getEndRange() > o2.getEndRange()) return 1; return 0; } }; // views comparators[2] = new Comparator<RelationTreeNode>() { public int compare(RelationTreeNode o1, RelationTreeNode o2) { if (o1.getViewCount() > o2.getViewCount()) return 1; if (o1.getViewCount() < o2.getViewCount()) return -1; return 0; } }; sorter = new RelationSorter(viewer, columns, comparators); viewer.setSorter(sorter); } /** * Passing the focus request to the viewer's control. */ public void setFocus() { viewer.getControl().setFocus(); } }