001: /*******************************************************************************
002: * Copyright (c) 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: ******************************************************************************/package org.eclipse.ui.internal.ide.undo;
011:
012: import java.net.URI;
013:
014: import org.eclipse.core.resources.IFolder;
015: import org.eclipse.core.resources.IResource;
016: import org.eclipse.core.resources.IWorkspaceRoot;
017: import org.eclipse.core.runtime.Assert;
018: import org.eclipse.core.runtime.CoreException;
019: import org.eclipse.core.runtime.IPath;
020: import org.eclipse.core.runtime.IProgressMonitor;
021: import org.eclipse.core.runtime.OperationCanceledException;
022: import org.eclipse.core.runtime.SubProgressMonitor;
023:
024: /**
025: * FolderDescription is a lightweight description that describes a folder to be
026: * created.
027: *
028: * This class is not intended to be instantiated or used by clients.
029: *
030: * @since 3.3
031: *
032: */
033: public class FolderDescription extends ContainerDescription {
034:
035: /**
036: * Create a FolderDescription from the specified folder handle. Typically
037: * used when the folder handle represents a resource that actually exists,
038: * although it will not fail if the resource is non-existent.
039: *
040: * @param folder
041: * the folder to be described
042: */
043: public FolderDescription(IFolder folder) {
044: super (folder);
045: }
046:
047: /**
048: * Create a FolderDescription from the specified folder handle. If the
049: * folder to be created should be linked to a different location, specify
050: * the location.
051: *
052: * @param folder
053: * the folder to be described
054: * @param linkLocation
055: * the location to which the folder is linked, or
056: * <code>null</code> if it is not linked
057: */
058: public FolderDescription(IFolder folder, URI linkLocation) {
059: super (folder);
060: this .name = folder.getName();
061: this .location = linkLocation;
062: }
063:
064: /*
065: * (non-Javadoc)
066: *
067: * @see org.eclipse.ui.internal.ide.undo.ContainerDescription#createResourceHandle()
068: */
069: public IResource createResourceHandle() {
070: IWorkspaceRoot workspaceRoot = getWorkspace().getRoot();
071: IPath folderPath = parent.getFullPath().append(name);
072: return workspaceRoot.getFolder(folderPath);
073: }
074:
075: /*
076: * (non-Javadoc)
077: *
078: * @see org.eclipse.ui.internal.ide.undo.ResourceDescription#createExistentResourceFromHandle(org.eclipse.core.resources.IResource,
079: * org.eclipse.core.runtime.IProgressMonitor)
080: */
081: public void createExistentResourceFromHandle(IResource resource,
082: IProgressMonitor monitor) throws CoreException {
083:
084: Assert.isLegal(resource instanceof IFolder);
085: if (resource.exists()) {
086: return;
087: }
088: IFolder folderHandle = (IFolder) resource;
089: try {
090: monitor.beginTask("", 200); //$NON-NLS-1$
091: monitor
092: .setTaskName(UndoMessages.FolderDescription_NewFolderProgress);
093: if (monitor.isCanceled()) {
094: throw new OperationCanceledException();
095: }
096: if (location != null) {
097: folderHandle.createLink(location,
098: IResource.ALLOW_MISSING_LOCAL,
099: new SubProgressMonitor(monitor, 100));
100: } else {
101: folderHandle.create(false, true,
102: new SubProgressMonitor(monitor, 100));
103: }
104: if (monitor.isCanceled()) {
105: throw new OperationCanceledException();
106: }
107: createChildResources(folderHandle, monitor, 100);
108:
109: } finally {
110: monitor.done();
111: }
112: }
113: }
|