/******************************************************************************* * Copyright (c) 2010 Andrey Loskutov. * 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 * Contributor: Andrey Loskutov - initial API and implementation *******************************************************************************/ package de.loskutov.anyedit.actions; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.IHandler; import org.eclipse.core.commands.IHandlerListener; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceVisitor; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.handlers.HandlerUtil; import de.loskutov.anyedit.AnyEditToolsPlugin; import de.loskutov.anyedit.Messages; import de.loskutov.anyedit.util.EclipseUtils; public class CountAllInFolderAction extends ConvertAllInFolderAction implements IHandler { @Override protected IResource getResource(Object selection) { if(selection instanceof IContainer) { return (IResource)selection; } if(selection != null) { IResource adapter = EclipseUtils.getResource(selection); if(adapter instanceof IContainer){ return adapter; } adapter = EclipseUtils.getAdapter(selection, IProject.class); return adapter; } return null; } @Override protected boolean getEnablement() { return true; } @Override public void run(final IAction action) { Job job = new Job("Counting resources") { @Override protected IStatus run(IProgressMonitor monitor) { monitor.beginTask(Messages.CollectAllInFolder_task, IProgressMonitor.UNKNOWN); final CountingVisitor v = new CountingVisitor(); for (int i = 0; i < selectedResources.size() && !monitor.isCanceled(); i++) { Object o = selectedResources.get(i); if (o instanceof IContainer) { IContainer container = (IContainer) o; if(!container.isAccessible()){ continue; } try { container.accept(v, IResource.DEPTH_INFINITE, IContainer.INCLUDE_HIDDEN | IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS); } catch (CoreException e) { AnyEditToolsPlugin.logError("Failed counting resources", e); } } } if(selectedResources.isEmpty()){ try { ResourcesPlugin.getWorkspace().getRoot().accept(v, IResource.DEPTH_INFINITE, IContainer.INCLUDE_HIDDEN | IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS); } catch (CoreException e) { AnyEditToolsPlugin.logError("Failed counting resources", e); } } PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { @Override public void run() { printSummary(v); } }); monitor.done(); return Status.OK_STATUS; } }; job.setUser(true); job.schedule(); } private void printSummary(final CountingVisitor v) { long filesPerFolder = v.folders == 0 ? 0 : v.files / v.folders; long resPerProject = v.projects == 0 ? 0 : (v.files + v.folders) / v.projects; String message = selectedResources.isEmpty() ? "Workspace" : "Selection"; message += " contains " + (v.files + v.folders + v.projects) + " resources:\n" + v.files + " files in " + v.folders + " folders and " + v.projects + " projects."; message += "\n\nIn average each folder contains " + filesPerFolder + " files, and each project " + resPerProject + " resources.\n"; boolean hasDerived = v.derivedFiles > 0 || v.derivedFolders > 0; if (hasDerived) { message += "\nThere are " + v.derivedFiles + " derived files" + " and " + v.derivedFolders + " derived folders."; } boolean hasTeam = v.teamFiles > 0 || v.teamFolders > 0; if (hasTeam) { message += "\nThere are " + v.teamFiles + " hidden team files" + " and " + v.teamFolders + " hidden team folders."; } if (hasDerived || hasTeam) { filesPerFolder = v.folders + v.teamFolders + v.derivedFolders == 0 ? 0 : (v.files + v.teamFiles + v.derivedFiles) / (v.folders + v.teamFolders + v.derivedFolders); resPerProject = v.projects == 0 ? 0 : (v.files + v.folders + v.derivedFolders + v.derivedFiles + v.teamFiles + v.teamFolders) / v.projects; message += "\n\nWith derived and team files "; message += selectedResources.isEmpty() ? "workspace" : "selection"; message += " would contain " + (v.files + v.folders + v.projects + v.derivedFolders + v.derivedFiles + v.teamFiles + v.teamFolders) + " resources:\n" + (v.files + v.teamFiles + v.derivedFiles) + " files in " + (v.folders + v.teamFolders + v.derivedFolders) + " folders and " + v.projects + " projects."; message += "\n\nIn average each folder would contain " + filesPerFolder + " files, and each project " + resPerProject + " resources."; } AnyEditToolsPlugin.logInfo(message); MessageDialog.openInformation(null, "Count all resources", message); } static class CountingVisitor implements IResourceVisitor { long files; long folders; long projects; long teamFolders; long teamFiles; long derivedFolders; long derivedFiles; @Override public boolean visit(IResource resource) throws CoreException { if(!resource.isAccessible()){ return false; } if(resource instanceof IFile){ if(resource.isTeamPrivateMember(IResource.CHECK_ANCESTORS)){ teamFiles ++; } else { if(resource.isDerived(IResource.CHECK_ANCESTORS)) { derivedFiles ++; } else { files ++; } } return false; } if(resource instanceof IFolder){ if(resource.isTeamPrivateMember(IResource.CHECK_ANCESTORS)){ teamFolders ++; } else { if(resource.isDerived(IResource.CHECK_ANCESTORS)) { derivedFolders ++; } else { folders ++; } } return true; } projects ++; return true; } } @Override public void addHandlerListener(IHandlerListener handlerListener) { // noop } @Override public Object execute(ExecutionEvent event) throws ExecutionException { selectionChanged(null, HandlerUtil.getCurrentSelection(event)); run(null); return null; } @Override public void removeHandlerListener(IHandlerListener handlerListener) { // noop } @Override public boolean isEnabled() { return true; } @Override public boolean isHandled() { return true; } }