Java tutorial
/******************************************************************************* * Copyright (c) 2009 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 java.lang.reflect.InvocationTargetException; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.PlatformUI; import de.loskutov.anyedit.AnyEditToolsPlugin; import de.loskutov.anyedit.IAnyEditConstants; import de.loskutov.anyedit.Messages; import de.loskutov.anyedit.util.EclipseUtils; public class ConvertAllInFolderAction extends ConvertAllAction { @Override public void selectionChanged(IAction action, ISelection selection) { selectedFiles.clear(); selectedResources.clear(); if (selection instanceof IStructuredSelection) { IStructuredSelection ssel = (IStructuredSelection) selection; Iterator<?> iterator = ssel.iterator(); while (iterator.hasNext()) { IResource next = getResource(iterator.next()); if (next != null) { // we do not check the folders for files here, because this could lead to // big delays on large (or distributed) directories during select action // any one is accepted, file or folder selectedResources.add(next); } } } if (action != null) { action.setEnabled(getEnablement()); } } protected boolean getEnablement() { return !selectedResources.isEmpty(); } @Nullable protected IResource getResource(Object selection) { if (selection instanceof IContainer || selection instanceof IFile) { return (IResource) selection; } IResource resource = EclipseUtils.getResource(selection); if (resource instanceof IContainer || resource instanceof IFile) { return resource; } return null; } @Override public void run(final IAction action) { IPreferenceStore preferenceStore = AnyEditToolsPlugin.getDefault().getPreferenceStore(); boolean shouldAsk = preferenceStore.getBoolean(IAnyEditConstants.ASK_BEFORE_CONVERT_ALL_IN_FOLDER); if (shouldAsk) { MessageDialogWithToggle dialogWithToggle = MessageDialogWithToggle.openYesNoQuestion( AnyEditToolsPlugin.getShell(), Messages.ConvertAllInFolder_warnTitle, Messages.ConvertAllInFolder_warnMessage, Messages.ConvertAllInFolder_toggleMessage, false, preferenceStore, IAnyEditConstants.ASK_BEFORE_CONVERT_ALL_IN_FOLDER); int returnCode = dialogWithToggle.getReturnCode(); if (returnCode != IDialogConstants.YES_ID) { return; } } try { // runs in the same thread to be able to collect all files before // starting main action, which will be executed in separated thread PlatformUI.getWorkbench().getProgressService().run(true, true, new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitor.beginTask(Messages.ConvertAllInFolder_task, selectedResources.size() * 10); try { for (int i = 0; i < selectedResources.size() && !monitor.isCanceled(); i++) { Object o = selectedResources.get(i); if (o instanceof IContainer) { addAllFiles((IContainer) o, selectedFiles, monitor); } else if (o instanceof IFile) { if (selectedFiles.contains(o)) { continue; } selectedFiles.add((IFile) o); } } } finally { monitor.done(); } } }); } catch (InvocationTargetException e) { AnyEditToolsPlugin.logError("'Convert all' operation: not all files converted", e); } catch (InterruptedException e) { AnyEditToolsPlugin.logError("'Convert all' operation cancelled by user", e); return; } // will run in another thread doAction(action); } protected void doAction(IAction action) { selectedResources.clear(); super.run(action); } protected void addAllFiles(IContainer container, List<IFile> fileList, IProgressMonitor monitor) { try { IResource[] resources = container.members(); for (int i = 0; i < resources.length && !monitor.isCanceled(); i++) { monitor.internalWorked(1); IResource resource = resources[i]; int type = resource.getType(); if (type == IResource.FILE) { if (fileList.contains(resource)) { continue; } fileList.add((IFile) resource); } else if (type == IResource.FOLDER || type == IResource.PROJECT) { addAllFiles((IContainer) resource, fileList, monitor); } } } catch (CoreException e) { AnyEditToolsPlugin.logError("Couldn't collect all files for convert action in folder " + container, e); } } }