package net.sourceforge.pmd.eclipse.ui.views; import java.util.Collections; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.IPage; import org.eclipse.ui.part.MessagePage; import org.eclipse.ui.part.PageBook; import org.eclipse.ui.part.PageBookView; import net.sourceforge.pmd.eclipse.plugin.PMDPlugin; import net.sourceforge.pmd.eclipse.ui.model.FileRecord; /** * * @author Brian Remedios */ public abstract class AbstractPMDPagebookView extends PageBookView { protected ViewMemento memento; protected AbstractPMDPagebookView() { } public static FileRecord tryForFileRecordFrom(IWorkbenchPart part) { if (part instanceof IEditorPart) { // If there is a file opened in the editor, we create a record for it IEditorInput input = ((IEditorPart) part).getEditorInput(); if (input != null && input instanceof IFileEditorInput) { IFile file = ((IFileEditorInput) input).getFile(); return new FileRecord(file); } } return null; } protected abstract String pageMessageId(); protected abstract String mementoFileId(); protected boolean hasMemento() { return memento != null; } protected IWorkbenchPage getSitePage() { return getSite().getPage(); } /** * Gets the fileRecord from the currently active editor. * @param part IWorkbenchPart * @return a new FileRecord */ protected FileRecord getFileRecordFromWorkbenchPart(IWorkbenchPart part) { if (part instanceof IEditorPart) { // If there is a file opened in the editor, we create a record for it IEditorInput input = ((IEditorPart) part).getEditorInput(); if (input != null && input instanceof IFileEditorInput) { IFile file = ((IFileEditorInput) input).getFile(); return new FileRecord(file); } } else { // We also want to get the editors when it's not active // so we pretend, that the editor has been activated IEditorPart editorPart = getSite().getPage().getActiveEditor(); if (editorPart != null) { return getFileRecordFromWorkbenchPart(editorPart); } } return null; } /* @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite) */ @Override public void init(IViewSite site) throws PartInitException { super.init(site); memento = new ViewMemento(mementoFileId()); // load Memento from a File, if existing } protected void save(String mementoId, List<Integer> integerList) { memento.putList(mementoId, integerList); } protected List<Integer> getIntegerList(String mementoId) { return memento == null ? Collections.<Integer>emptyList() : memento.getIntegerList(mementoId); } /* @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IPartListener) */ @Override public void partBroughtToTop(IWorkbenchPart part) { partActivated(part); } /* @see org.eclipse.ui.part.PageBookView#getBootstrapPart() */ @Override protected IWorkbenchPart getBootstrapPart() { IWorkbenchPage page = getSite().getPage(); return page == null ? null : page.getActiveEditor(); } /* @see org.eclipse.ui.part.PageBookView#isImportant(org.eclipse.ui.IWorkbenchPart) */ @Override protected boolean isImportant(IWorkbenchPart part) { // We only care about the editor return part instanceof IEditorPart; } /* @see org.eclipse.ui.part.PageBookView#createDefaultPage(org.eclipse.ui.part.PageBook) */ protected IPage createDefaultPage(PageBook book) { // builds a message page showing a text MessagePage page = new MessagePage(); initPage(page); page.createControl(book); page.setMessage(getString(pageMessageId())); return page; } protected static String getString(String textId) { return PMDPlugin.getDefault().getStringTable().getString(textId); } @Override public void dispose() { memento.save(); super.dispose(); } }