| /******************************************************************************* |
| * Copyright (c) 2002 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v0.5 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v05.html |
| * |
| * Contributors: |
| * IBM - Initial implementation |
| ******************************************************************************/ |
| package org.eclipse.team.internal.ui.target; |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.util.ArrayList; |
| |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.dialogs.InputDialog; |
| import org.eclipse.jface.operation.IRunnableWithProgress; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.team.core.TeamException; |
| import org.eclipse.team.core.sync.IRemoteResource; |
| import org.eclipse.team.internal.core.target.IRemoteTargetResource; |
| import org.eclipse.team.internal.ui.Policy; |
| import org.eclipse.team.internal.ui.TeamUIPlugin; |
| |
| /** |
| * Action to create a new remote folder. |
| */ |
| public class CreateNewFolderAction extends TargetAction { |
| |
| /** |
| * @see TeamAction#isEnabled() |
| */ |
| protected boolean isEnabled() throws TeamException { |
| return getSelectedRemoteFolders().length == 1; |
| } |
| |
| /** |
| * @see IActionDelegate#run(IAction) |
| */ |
| public void run(IAction action) { |
| try { |
| TeamUIPlugin.runWithProgressDialog(getShell(), true /* cancelable */, new IRunnableWithProgress() { |
| public void run(IProgressMonitor monitor) |
| throws InvocationTargetException, InterruptedException { |
| try { |
| createDir(getShell(), getSelectedRemoteFolders()[0], new String()); |
| } catch (TeamException e) { |
| throw new InvocationTargetException(e); |
| } |
| } |
| }); |
| } catch (InvocationTargetException e) { |
| handle(e, Policy.bind("Error"), Policy.bind("CreateNewFolderAction.errorCreatingFolder")); //$NON-NLS-1$ //$NON-NLS-2$ |
| } catch (InterruptedException e) { |
| } |
| } |
| |
| /** |
| * Throws a TeamException if one occured. |
| * Returns null if the operation was cancelled or an exception occured |
| */ |
| public static IRemoteTargetResource createDir(final Shell shell, final IRemoteTargetResource parent, final String defaultName) throws TeamException { |
| final IRemoteTargetResource[] newFolder = new IRemoteTargetResource[] {null}; |
| try { |
| TeamUIPlugin.runWithProgressDialog(shell, true, new IRunnableWithProgress() { |
| public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { |
| try { |
| monitor.beginTask(Policy.bind("CreateNewFolderAction.creatingFolder"), IProgressMonitor.UNKNOWN); //$NON-NLS-1$ |
| final String[] folderName = new String[] {null}; |
| final String suggestedName = getSuggestedFolderName(parent, Policy.subMonitorFor(monitor, 0), defaultName); |
| shell.getDisplay().syncExec(new Runnable() { |
| public void run() { |
| InputDialog dialog = new InputDialog(shell, |
| Policy.bind("CreateNewFolderAction.title"), //$NON-NLS-1$ |
| Policy.bind("CreateNewFolderAction.message"), //$NON-NLS-1$ |
| suggestedName, |
| null); |
| Policy.checkCanceled(monitor); |
| if(dialog.open() == dialog.OK) { |
| folderName[0] = dialog.getValue(); |
| } |
| } |
| }); |
| if(folderName[0] != null) { |
| newFolder[0] = parent.getFolder(folderName[0]); |
| newFolder[0].mkdirs(Policy.subMonitorFor(monitor, 0)); |
| } |
| } catch(TeamException e) { |
| throw new InvocationTargetException(e); |
| } finally { |
| monitor.done(); |
| } |
| } |
| }); |
| } catch(InvocationTargetException e) { |
| if (e.getTargetException() instanceof TeamException) { |
| throw (TeamException)e.getTargetException(); |
| } |
| TeamUIPlugin.handle(e); |
| } catch(InterruptedException e) { |
| } |
| return newFolder[0]; |
| } |
| |
| protected static String getSuggestedFolderName(IRemoteTargetResource parent, IProgressMonitor monitor, String defaultName) throws TeamException { |
| IRemoteResource[] members; |
| monitor.subTask(Policy.bind("CreateNewFolderAction.suggestedNameProgress")); //$NON-NLS-1$ |
| members = parent.members(monitor); |
| ArrayList names = new ArrayList(); |
| |
| String suggestedFolderName = defaultName; |
| |
| boolean nameUsed = false; |
| |
| for (int i = 0; i < members.length; i++) { |
| String existingName = members[i].getName(); |
| names.add(existingName); // cache them for next round since faster |
| if(existingName.equals(suggestedFolderName)) { |
| nameUsed = true; |
| } |
| } |
| |
| if(!nameUsed) |
| return suggestedFolderName; |
| |
| //Otherwise, keep proposing new names by incrementing a postfix name index until we find one not used |
| int postfix = 1; |
| |
| String baseName = suggestedFolderName; |
| |
| do { |
| nameUsed = false; |
| for (int i = 0; i < members.length && !nameUsed; i++) { |
| suggestedFolderName = Policy.bind("CreateNewFolderAction.suggestedNameConcat", baseName, String.valueOf(postfix)); //$NON-NLS-1$ |
| String existingName = (String) names.get(i); |
| |
| if(existingName.equals(suggestedFolderName)) { |
| postfix = postfix + 1; |
| nameUsed = true; |
| } |
| } |
| } while(nameUsed); |
| return suggestedFolderName; |
| } |
| } |