package de.ovgu.cide.mining.nonfeaturemanager; import java.util.Comparator; import java.util.HashMap; import java.util.Map; 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.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.ITreeSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; 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.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.ViewPart; import org.eclipse.ui.texteditor.ITextEditor; import de.ovgu.cide.features.IFeature; 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.events.AElementsNonColorChangedEvent; import de.ovgu.cide.mining.nonfeaturemanager.model.CUDummy; import de.ovgu.cide.mining.nonfeaturemanager.model.NonFeatureTreeNode; import de.ovgu.cide.mining.nonfeaturemanager.model.NonFeatureTreeNode.NODE_KIND; public class NonFeatureManagerView extends ViewPart { /** * The ID of the view as specified by the extension. */ public static final String ID = "de.ovgu.cide.mining.nonfeaturemanager"; 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 TreeColumn[] columns; private Label infoLabel; private Label infoIconLabel; private Action doubleClickAction; private Action selectionChangedAction; private Action deleteElementAction; private NonFeatureContentProvider contentProvider; private NonFeatureSorter sorter; private ApplicationController AC; /** * The constructor. */ public NonFeatureManagerView() { } /** * This is a callback that will allow us to create the viewer and initialize * it. */ public void createPartControl(Composite parent) { AC = ApplicationController.getInstance(); 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); tree = viewer.getTree(); tree.setHeaderVisible(true); tree.setLinesVisible(true); columns = new TreeColumn[6]; columns[0] = new TreeColumn(tree, SWT.LEFT); columns[0].setText("Name"); columns[0].setWidth(300); columns[1] = new TreeColumn(tree, SWT.CENTER); columns[1].setText("Range"); columns[1].setWidth(80); columns[2] = new TreeColumn(tree, SWT.CENTER); columns[2].setWidth(150); columns[2].setText("Type"); columns[3] = new TreeColumn(tree, SWT.CENTER); columns[3].setText("Add"); columns[3].setWidth(50); columns[4] = new TreeColumn(tree, SWT.CENTER); columns[4].setText("Views"); columns[4].setWidth(50); columns[5] = new TreeColumn(tree, SWT.CENTER); columns[5].setText("Ele's"); columns[5].setWidth(60); viewer .setContentProvider(contentProvider = new NonFeatureContentProvider( this)); viewer.setLabelProvider(new NonFeatureLabelProvider()); createSorter(); viewer.setInput(getViewSite()); makeActions(); hookContextMenu(); hookDoubleClickAction(); hookSelectionChangedAction(); contributeToActionBars(); } private void createSorter() { Comparator<NonFeatureTreeNode>[] comparators = new Comparator[6]; comparators[0] = new Comparator<NonFeatureTreeNode>() { public int compare(NonFeatureTreeNode o1, NonFeatureTreeNode o2) { return o1.getDisplayName().compareTo(o2.getDisplayName()); } }; // range comparators[1] = new Comparator<NonFeatureTreeNode>() { public int compare(NonFeatureTreeNode o1, NonFeatureTreeNode 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; } }; // type comparators[2] = new Comparator<NonFeatureTreeNode>() { public int compare(NonFeatureTreeNode o1, NonFeatureTreeNode o2) { return o1.getType().compareTo(o2.getType()); } }; // add count comparators[3] = new Comparator<NonFeatureTreeNode>() { public int compare(NonFeatureTreeNode o1, NonFeatureTreeNode o2) { if (o1.getAddCount() > o2.getAddCount()) return 1; if (o1.getAddCount() < o2.getAddCount()) return -1; return 0; } }; // views comparators[4] = new Comparator<NonFeatureTreeNode>() { public int compare(NonFeatureTreeNode o1, NonFeatureTreeNode o2) { if (o1.getViewCount() > o2.getViewCount()) return 1; if (o1.getViewCount() < o2.getViewCount()) return -1; return 0; } }; // recommendations comparators[5] = new Comparator<NonFeatureTreeNode>() { public int compare(NonFeatureTreeNode o1, NonFeatureTreeNode o2) { if (o1.getElementsCount() > o2.getElementsCount()) return 1; if (o1.getElementsCount() < o2.getElementsCount()) return -1; return 0; } }; sorter = new NonFeatureSorter(viewer, columns, comparators); viewer.setSorter(sorter); } 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); } }); } public Tree getTree() { return tree; } public TreeViewer getTreeViewer() { return viewer; } private void hookContextMenu() { MenuManager menuMgr = new MenuManager("#PopupMenu"); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { NonFeatureManagerView.this.fillContextMenu(manager); } }); Menu menu = menuMgr.createContextMenu(viewer.getControl()); viewer.getControl().setMenu(menu); getSite().registerContextMenu(menuMgr, viewer); } private void fillContextMenu(IMenuManager manager) { manager.add(deleteElementAction); manager.add(new Separator()); // Other plug-ins can contribute there actions here manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } private void contributeToActionBars() { IActionBars bars = getViewSite().getActionBars(); fillLocalToolBar(bars.getToolBarManager()); } private void fillLocalToolBar(IToolBarManager manager) { manager.add(deleteElementAction); } private void makeActions() { // EXAMPLE 1 deleteElementAction = new Action() { public void run() { ISelection selection = viewer.getSelection(); TreePath[] paths = ((ITreeSelection) selection).getPaths(); Map<AElement, IFeature> elementsToRemove = new HashMap<AElement, IFeature>(); for (TreePath treePath : paths) { if (treePath.getSegmentCount() < 3) continue; Object obj = treePath.getLastSegment(); if (!(obj instanceof NonFeatureTreeNode)) continue; NonFeatureTreeNode node = (NonFeatureTreeNode) obj; if (node.getKind() != NODE_KIND.ELEMENT) continue; elementsToRemove.put((AElement) node.getDataObject(), NonFeatureTreeNode.getColor(node)); } if (elementsToRemove.size() > 0) AC .fireEvent(new AElementsNonColorChangedEvent(this, new HashMap<AElement, IFeature>(), elementsToRemove)); } }; deleteElementAction.setText("Remove"); deleteElementAction .setToolTipText("Mark as - possible recommendation for features."); deleteElementAction.setImageDescriptor(PlatformUI.getWorkbench() .getSharedImages().getImageDescriptor( ISharedImages.IMG_TOOL_DELETE)); deleteElementAction.setDisabledImageDescriptor(PlatformUI .getWorkbench().getSharedImages().getImageDescriptor( ISharedImages.IMG_TOOL_DELETE_DISABLED)); deleteElementAction.setEnabled(false); selectionChangedAction = new Action() { public void run() { deleteElementAction.setEnabled(false); ISelection selection = viewer.getSelection(); Object obj = ((IStructuredSelection) selection) .getFirstElement(); if (!(obj instanceof NonFeatureTreeNode)) return; NonFeatureTreeNode node = (NonFeatureTreeNode) obj; int cuHash, start, len; if (node.getKind() == NODE_KIND.ELEMENT) { deleteElementAction.setEnabled(true); AElement jayElement = (AElement) node.getDataObject(); cuHash = jayElement.getCompelationUnitHash(); start = jayElement.getStartPosition(); len = jayElement.getLength(); } else if (node.getKind() == NODE_KIND.COMPILATION_UNIT) { CUDummy dummy = (CUDummy) node.getDataObject(); cuHash = dummy.getHashCode(); start = -1; len = -1; } else { return; } try { AC.fireEvent(new AElementPreviewEvent( NonFeatureManagerView.this)); IEditorPart javaEditor; javaEditor = JavaUI.openInEditor(AC .getICompilationUnit(cuHash)); if ((start >= 0) && (javaEditor instanceof ITextEditor)) { ((ITextEditor) javaEditor).selectAndReveal(start, len); } } catch (PartInitException e) { e.printStackTrace(); } catch (JavaModelException e) { e.printStackTrace(); } } }; } 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(); } }); } /** * Passing the focus request to the viewer's control. */ public void setFocus() { viewer.getControl().setFocus(); } }