package org.projectusus.ui.dependencygraph.sourcefolder;
import static java.util.Collections.emptySet;
import static org.eclipse.jface.action.ActionContributionItem.MODE_FORCE_TEXT;
import static org.projectusus.core.statistics.UsusModelProvider.ususModel;
import static org.projectusus.ui.dependencygraph.sourcefolder.SourceFolderChangeDetector.detectSourceFolderChange;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.ElementChangedEvent;
import org.eclipse.jdt.core.IElementChangedListener;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.ViewerFilter;
import org.projectusus.core.IUsusModelListener;
import org.projectusus.core.project.FindUsusProjects;
import org.projectusus.ui.dependencygraph.common.IRefreshable;
import org.projectusus.ui.internal.UsusUIPlugin;
public class SourceFolderFilterExtension {
private final IRefreshable refreshable;
private final SourceFolderFilter filter = new SourceFolderFilter();
private final SourceFolderFilterAction action;
private final IUsusModelListener ususModelListener = new IUsusModelListener() {
public void ususModelChanged() {
recomputeSourceFolders();
}
};
private final IElementChangedListener elementChangedListener = new IElementChangedListener() {
public void elementChanged( ElementChangedEvent event ) {
if( detectSourceFolderChange( event.getDelta() ) ) {
recomputeSourceFolders();
}
}
};
public SourceFolderFilterExtension( IRefreshable refreshable ) {
this.refreshable = refreshable;
action = new SourceFolderFilterAction( filter, refreshable );
}
public void initialize() {
ususModel().addUsusModelListener( ususModelListener );
JavaCore.addElementChangedListener( elementChangedListener );
recomputeSourceFolders();
}
public ViewerFilter getFilter() {
return filter;
}
public void contributeTo( ToolBarManager toolBarManager ) {
ActionContributionItem actionContribution = new ActionContributionItem( action );
actionContribution.setMode( MODE_FORCE_TEXT );
toolBarManager.add( actionContribution );
}
public void dispose() {
JavaCore.removeElementChangedListener( elementChangedListener );
ususModel().removeUsusModelListener( ususModelListener );
}
private void recomputeSourceFolders() {
IProject[] allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
List<IProject> ususProjects = new FindUsusProjects( allProjects ).compute();
IJavaProject[] ususJavaProjects = convertToJavaProjects( ususProjects );
Set<IPath> allSourceFolders = scanForSourceFolders( ususJavaProjects );
boolean changed = filter.updateSourceFolders( new ArrayList<IPath>( allSourceFolders ) );
if( changed ) {
action.updateState();
refreshable.refresh();
}
}
private Set<IPath> scanForSourceFolders( IJavaProject[] ususJavaProjects ) {
try {
return new SourceFolderScanner().scan( ususJavaProjects );
} catch( JavaModelException e ) {
UsusUIPlugin.getDefault().log( e );
return emptySet();
}
}
private IJavaProject[] convertToJavaProjects( List<IProject> ususProjects ) {
List<IJavaProject> result = new LinkedList<IJavaProject>();
for( IProject project : ususProjects ) {
if( canScanProject( project ) ) {
IJavaProject javaProject = JavaCore.create( project );
result.add( javaProject );
}
}
return result.toArray( new IJavaProject[result.size()] );
}
private boolean canScanProject( IProject project ) {
try {
return project.isOpen() && project.getProject().hasNature( JavaCore.NATURE_ID );
} catch( CoreException e ) {
return false;
}
}
}