/*******************************************************************************
* Copyright (c) 2009, 2012 SpringSource, a divison of VMware, Inc.
* Copyright (c) IBM Corporation (code cribbed from pde and navigator.)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SpringSource, a division of VMware, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.virgo.ide.runtime.ui.views;
import java.util.Collection;
import java.util.HashSet;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
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.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.virgo.ide.runtime.internal.ui.projects.ServerProject;
import org.eclipse.virgo.ide.runtime.internal.ui.projects.ServerProjectManager;
import org.eclipse.virgo.ide.runtime.internal.ui.providers.ServerFileSelection;
import org.eclipse.wst.server.core.IServer;
/**
*
* @see org.eclipse.pde.internal.ui.views.dependencies.DependenciesView
* @author Miles Parker
*
*/
@SuppressWarnings("restriction")
public abstract class ServerFileCommonView extends CommonView implements ISelectionListener {
private Collection<IFile> currentFiles;
protected IResourceChangeListener resourceListener;
private final class DeltaVisitor implements IResourceDeltaVisitor {
boolean change;
public boolean visit(IResourceDelta delta) {
if (this.change) {
return false;
}
// only interested in changed resources (not added or removed)
if (delta.getKind() != IResourceDelta.CHANGED) {
return true;
}
// only interested in content changes
if ((delta.getFlags() & IResourceDelta.CONTENT) == 0) {
return true;
}
IResource resource = delta.getResource();
if (ServerFileCommonView.this.currentFiles.contains(resource)) {
this.change = true;
}
return true;
}
}
/**
* @see org.eclipse.ui.navigator.CommonNavigator#createPartControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createPartControl(Composite aParent) {
super.createPartControl(aParent);
this.resourceListener = new IResourceChangeListener() {
public void resourceChanged(IResourceChangeEvent event) {
// we are only interested in POST_CHANGE events
if (getServers().size() > 0) {
if (event.getType() != IResourceChangeEvent.POST_CHANGE) {
return;
}
IResourceDelta rootDelta = event.getDelta();
boolean refresh = false;
// get the delta, if any, for the documentation directory
for (IServer server : getServers()) {
ServerProject project = ServerProjectManager.getInstance().getProject(server);
if (project != null) {
for (String dir : getManagedDirs()) {
if (project.getWorkspaceProject() != null) {
IFolder folder = project.getWorkspaceProject().getFolder(dir);
IResourceDelta docDelta = rootDelta.findMember(folder.getFullPath());
if (docDelta == null) {
return;
}
DeltaVisitor visitor = new DeltaVisitor();
try {
docDelta.accept(visitor);
} catch (CoreException e) {
}
if (visitor.change) {
refresh = true;
break;
}
}
}
}
}
if (refresh) {
refreshView();
}
}
}
};
ResourcesPlugin.getWorkspace().addResourceChangeListener(this.resourceListener);
this.currentFiles = new HashSet<IFile>();
}
/**
* @see org.eclipse.virgo.ide.runtime.ui.views.CommonView#update()
*/
@Override
protected void update() {
this.currentFiles = new HashSet<IFile>();
for (IServer server : getServers()) {
Object[] elements = ((ITreeContentProvider) getCommonViewer().getContentProvider()).getElements(server);
for (Object object : elements) {
if (object instanceof ServerFileSelection) {
this.currentFiles.add(((ServerFileSelection) object).getFile());
}
if (object instanceof IFile) {
this.currentFiles.add((IFile) object);
}
}
}
super.update();
}
/**
* @see org.eclipse.virgo.ide.runtime.ui.views.CommonView#dispose()
*/
@Override
public void dispose() {
super.dispose();
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this.resourceListener);
}
public abstract String[] getManagedDirs();
}