package net.sourceforge.pmd.eclipse.ui.views;
import net.sourceforge.pmd.eclipse.plugin.PMDPlugin;
import net.sourceforge.pmd.eclipse.ui.model.FileRecord;
import net.sourceforge.pmd.eclipse.ui.nls.StringKeys;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchPart;
/**
*
* @author Brian Remedios
*/
public abstract class AbstractResourceView extends AbstractPMDPagebookView implements IResourceChangeListener {
protected AbstractResourceView() {
}
protected static boolean getBoolUIPref(String prefId) { return pStore().getBoolean(prefId); }
protected static IPreferenceStore pStore() { return PMDPlugin.getDefault().getPreferenceStore(); }
protected abstract AbstractStructureInspectorPage getCurrentViewPage();
/* @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IPartListener) */
@Override
public void partActivated(IWorkbenchPart part) {
IWorkbenchPart activePart = getSitePage().getActivePart();
if (activePart == null) getSitePage().activate(this);
super.partActivated(part);
}
protected IPath getResourcePath() {
AbstractStructureInspectorPage page = getCurrentViewPage();
FileRecord record = page.getFileRecord();
IResource resource = record.getResource();
return resource.getFullPath();
}
protected void setUIPref(String prefId, boolean flag) {
pStore().setValue(prefId, flag);
}
protected void setupListener(FileRecord resourceRecord) {
resourceRecord.getResource().getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
}
@Override
protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
FileRecord resourceRecord = getFileRecordFromWorkbenchPart(part);
if (resourceRecord != null) {
resourceRecord.getResource().getWorkspace().removeResourceChangeListener(this);
}
AbstractStructureInspectorPage page = (AbstractStructureInspectorPage) pageRecord.page;
if (page != null) {
page.dispose();
}
pageRecord.dispose();
}
/* @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) */
public void resourceChanged(IResourceChangeEvent event) {
try {
event.getDelta().accept(new IResourceDeltaVisitor() {
public boolean visit(final IResourceDelta delta) throws CoreException {
// find the resource for the path of the current page
IPath path = getResourcePath();
if (delta.getFullPath().equals(path)) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
refresh(delta.getResource());
}
});
return false;
}
return true;
}
});
} catch (CoreException e) {
PMDPlugin.getDefault().logError(StringKeys.ERROR_CORE_EXCEPTION, e);
}
}
/**
* Refresh, reloads the View with a given new resource.
* @param newResource new resource for the current active page.
*/
protected void refresh(IResource newResource) {
AbstractStructureInspectorPage page = getCurrentViewPage();
if (page != null) page.refresh(newResource);
}
}