package net.sourceforge.pmd.eclipse.ui.views; import java.util.List; import net.sourceforge.pmd.RulePriority; import net.sourceforge.pmd.eclipse.plugin.UISettings; import net.sourceforge.pmd.eclipse.ui.PMDUiConstants; import net.sourceforge.pmd.eclipse.ui.model.FileRecord; import net.sourceforge.pmd.eclipse.ui.nls.StringKeys; import net.sourceforge.pmd.eclipse.ui.views.actions.DisableRuleAction; import net.sourceforge.pmd.eclipse.ui.views.actions.PriorityFilterAction; import net.sourceforge.pmd.eclipse.ui.views.actions.QuickFixAction; import net.sourceforge.pmd.eclipse.ui.views.actions.RemoveViolationAction; import net.sourceforge.pmd.eclipse.ui.views.actions.ReviewAction; import net.sourceforge.pmd.eclipse.ui.views.actions.ShowRuleAction; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.IPage; /** * A View to show a list of PMD-Violations for a file * * @author SebastianRaffel ( 08.05.2005 ) */ public class ViolationOutline extends AbstractPMDPagebookView implements ISelectionProvider { private FileRecord resourceRecord; private PriorityFilter priorityFilter; protected static final String PRIORITY_LIST = "priorityFilterList"; protected static final String COLUMN_WIDTHS = "tableColumnWidths"; protected static final String COLUMN_SORTER = "tableColumnSorter"; /* @see org.eclipse.ui.part.PageBookView#createPartControl(org.eclipse.ui.part.PageBook) */ @Override public void createPartControl(Composite parent) { addFilterControls(); super.createPartControl(parent); getSite().setSelectionProvider(this); } protected String pageMessageId() { return StringKeys.VIEW_OUTLINE_DEFAULT_TEXT; } protected String mementoFileId() { return PMDUiConstants.MEMENTO_OUTLINE_FILE; } /* @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite) */ @Override public void init(IViewSite site) throws PartInitException { super.init(site); priorityFilter = new PriorityFilter(); List<Integer> priorityList = getIntegerList(PRIORITY_LIST); if (!priorityList.isEmpty()) { // set the loaded List for the Priority Filter priorityFilter.setPriorityFilterList(priorityList); } } @Override public void dispose() { save(PRIORITY_LIST, priorityFilter.getPriorityFilterList()); super.dispose(); } /* @see org.eclipse.ui.part.PageBookView#doCreatePage(org.eclipse.ui.IWorkbenchPart) */ @Override protected PageRec doCreatePage(IWorkbenchPart part) { if (resourceRecord != null) { // creates a new ViolationOutlinePageBR, when a Resource exists ViolationOutlinePageBR page = new ViolationOutlinePageBR(resourceRecord, this); initPage(page); page.createControl(getPageBook()); loadColumnData(page); return new PageRec(part, page); } return null; } /* @see org.eclipse.ui.part.PageBookView#doDestroyPage(org.eclipse.ui.IWorkbenchPart, org.eclipse.ui.part.PageBookView.PageRec) */ @Override protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) { ViolationOutlinePageBR page = (ViolationOutlinePageBR) pageRecord.page; // get the State of the destroyed Page for loading it into the // next Page -> different Pages look like one if (page != null) { storeColumnData(page); memento.save(); page.dispose(); } pageRecord.dispose(); } /** * Creates a DropDownMenu for the view */ private void addFilterControls() { IMenuManager manager = getViewSite().getActionBars().getMenuManager(); List<Integer> filterList = priorityFilter.getPriorityFilterList(); // we add the PriorityFilter-Actions to this Menu RulePriority[] priorities = UISettings.currentPriorities(true); for (RulePriority priority : priorities) { Action filterAction = new PriorityFilterAction(priority, this); if (filterList.contains(priority.getPriority())) filterAction.setChecked(true); manager.add(filterAction); } } /** * Creates a Context Menu for the View * * @param viewer */ public Menu createContextMenu(final TableViewer viewer) { MenuManager manager = new MenuManager(); manager.setRemoveAllWhenShown(true); // here we add the Context Menus Actions manager.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { buildMenu(manager, viewer); } }); Table table = viewer.getTable(); return manager.createContextMenu(table); } private void buildMenu(IMenuManager manager, TableViewer viewer) { // show the Rule Dialog Action showRuleAction = new ShowRuleAction(viewer, getSite().getShell()); manager.add(showRuleAction); // add Review Comment ReviewAction reviewAction = new ReviewAction(viewer); manager.add(reviewAction); // Remove Violation RemoveViolationAction removeAction = new RemoveViolationAction(viewer); manager.add(removeAction); // Disable rule DisableRuleAction disableAction = new DisableRuleAction(viewer); disableAction.setEnabled(disableAction.hasActiveRules()); manager.add(disableAction); // Quick Fix (where possible) QuickFixAction quickFixAction = new QuickFixAction(viewer); quickFixAction.setEnabled(quickFixAction.hasQuickFix()); manager.add(quickFixAction); // additions Action: Clear reviews manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS + "-end")); } /* @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IPartListener) */ @Override public void partActivated(IWorkbenchPart part) { // We only care about the editor if (part instanceof IEditorPart) { resourceRecord = tryForFileRecordFrom(part); // If there is a file opened in the editor, we create a record for it } else { // We also want to get the editors when it's not active // so we pretend, that the editor has been activated IEditorPart editorPart = getSitePage().getActiveEditor(); if (editorPart != null) { partActivated(editorPart); } } IWorkbenchPage page = getSitePage(); IWorkbenchPart activePart = page.getActivePart(); if (activePart == null) page.activate(this); super.partActivated(part); refresh(); } /* @see org.eclipse.ui.part.PageBookView#showPageRec(org.eclipse.ui.part.PageBookView.PageRec) */ @Override protected void showPageRec(PageRec pageRec) { ViolationOutlinePageBR oldPage = getCurrentOutlinePage(); ViolationOutlinePageBR newPage = null; if (pageRec.page instanceof ViolationOutlinePageBR) newPage = (ViolationOutlinePageBR) pageRec.page; // here we change from one Page to another // so we get the State of the old Page, put it in a Memento // and load it into the new Page, so it looks like the old one if (oldPage != newPage) { if (oldPage != null) { storeColumnData(oldPage); } // we load the stuff into the new Page loadColumnData(newPage); } super.showPageRec(pageRec); } private void storeColumnData(ViolationOutlinePageBR page) { if (page != null) { // we care about the column widths save(COLUMN_WIDTHS, page.getColumnWidths()); // ... and what Element is sorted, and in which way save(COLUMN_SORTER, page.getSorterProperties()); } } private void loadColumnData(ViolationOutlinePageBR page) { if (page != null) { page.setColumnWidths(getIntegerList(COLUMN_WIDTHS)); page.setSorterProperties(getIntegerList(COLUMN_SORTER)); } } /** * @return the currently displayed Page */ private ViolationOutlinePageBR getCurrentOutlinePage() { IPage page = super.getCurrentPage(); if (!(page instanceof ViolationOutlinePageBR)) return null; return (ViolationOutlinePageBR) page; } /** * @return a List of the current ViewerFilters */ public ViewerFilter[] getFilters() { return new ViewerFilter[] { priorityFilter }; } /** * Refreshes, reloads the View */ public void refresh() { ViolationOutlinePageBR page = getCurrentOutlinePage(); if (page != null) page.refresh(); } /* @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) */ public void addSelectionChangedListener(ISelectionChangedListener listener) { ViolationOutlinePageBR page = getCurrentOutlinePage(); if (page != null) page.getTableViewer().addSelectionChangedListener(listener); } /* @see org.eclipse.jface.viewers.ISelectionProvider#getSelection() */ public ISelection getSelection() { ViolationOutlinePageBR page = getCurrentOutlinePage(); if (page != null) return page.getTableViewer().getSelection(); return null; } /* @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) */ public void removeSelectionChangedListener(ISelectionChangedListener listener) { ViolationOutlinePageBR page = getCurrentOutlinePage(); if (page != null) page.getTableViewer().removeSelectionChangedListener(listener); } /* @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection) */ public void setSelection(ISelection selection) { ViolationOutlinePageBR page = getCurrentOutlinePage(); if (page != null) page.getTableViewer().setSelection(selection); } }