diff options
author | Michael Valenta | 2002-04-16 17:58:25 +0000 |
---|---|---|
committer | Michael Valenta | 2002-04-16 17:58:25 +0000 |
commit | 326828feedeea64d6bea9c74ad8101ab7f3f7b17 (patch) | |
tree | b13c5dcb0c3d44b6df65c113842aebde3fe84447 | |
parent | 5f696b93530e6df710f8ef367420075d00c58d80 (diff) | |
download | eclipse.platform.team-326828feedeea64d6bea9c74ad8101ab7f3f7b17.tar.gz eclipse.platform.team-326828feedeea64d6bea9c74ad8101ab7f3f7b17.tar.xz eclipse.platform.team-326828feedeea64d6bea9c74ad8101ab7f3f7b17.zip |
Update CVSDecorator to use project configure/deconfigure notification
6 files changed, 157 insertions, 187 deletions
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSDecorator.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSDecorator.java index 0ba07afdf..08ca6a425 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSDecorator.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSDecorator.java @@ -6,17 +6,23 @@ package org.eclipse.team.internal.ccvs.ui; */ import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; +import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.IResourceChangeListener; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.IResourceVisitor; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.resource.ImageDescriptor; @@ -30,7 +36,6 @@ import org.eclipse.team.core.RepositoryProvider; import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin; import org.eclipse.team.internal.ccvs.core.CVSTeamProvider; import org.eclipse.team.internal.ccvs.core.IResourceStateChangeListener; -import org.eclipse.team.internal.ccvs.core.util.ResourceDeltaVisitor; import org.eclipse.ui.internal.DecoratorDefinition; import org.eclipse.ui.internal.DecoratorManager; import org.eclipse.ui.internal.WorkbenchPlugin; @@ -50,7 +55,7 @@ import org.eclipse.ui.internal.WorkbenchPlugin; * the queue used between the decorator and the decorator runnable such that priority can be * given to visible elements when decoration requests are made.] */ -public class CVSDecorator extends LabelProvider implements ILabelDecorator, IResourceStateChangeListener, IDecorationNotifier { +public class CVSDecorator extends LabelProvider implements ILabelDecorator, IResourceChangeListener, IResourceStateChangeListener, IDecorationNotifier { // Resources that need an icon and text computed for display to the user private List decoratorNeedsUpdating = new ArrayList(); @@ -65,43 +70,15 @@ public class CVSDecorator extends LabelProvider implements ILabelDecorator, IRes private Hashtable imageCache = new Hashtable(); - private ChangeListener changeListener; - - private class ChangeListener extends ResourceDeltaVisitor { - List changedResources = new ArrayList(); - protected void handleAdded(IResource[] resources) { - } - // remove the cached decoration for any removed resource - protected void handleRemoved(IResource[] resources) { - for (int i = 0; i < resources.length; i++) { - IResource resource = resources[i]; - if(RepositoryProvider.getProvider(resource.getProject(), CVSProviderPlugin.getTypeId())!=null) { - cache.remove(resources[i]); - } - } - } - // for changed resources we have to update the decoration - protected void handleChanged(IResource[] resources) { - changedResources.addAll(Arrays.asList(resources)); - } - protected void finished() { - resourceStateChanged((IResource[])changedResources.toArray(new IResource[changedResources.size()])); - changedResources.clear(); - } - protected int getEventMask() { - return IResourceChangeEvent.PRE_AUTO_BUILD; - } - } + // Keep track of deconfigured projects + private Set deconfiguredProjects = new HashSet(); public CVSDecorator() { // thread that calculates the decoration for a resource decoratorUpdateThread = new Thread(new CVSDecorationRunnable(this), "CVS"); //$NON-NLS-1$ decoratorUpdateThread.start(); CVSProviderPlugin.addResourceStateChangeListener(this); - - // listener for workspace resource changes - changeListener = new ChangeListener(); - changeListener.register(); + ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.PRE_AUTO_BUILD); } public String decorateText(String text, Object o) { @@ -215,6 +192,54 @@ public class CVSDecorator extends LabelProvider implements ILabelDecorator, IRes return decoratorNeedsUpdating.size(); } /* + * Handle resource changes and project description changes + * + * @see IResourceChangeListener#resourceChanged(IResourceChangeEvent) + */ + public void resourceChanged(IResourceChangeEvent event) { + try { + final List changedResources = new ArrayList(); + event.getDelta().accept(new IResourceDeltaVisitor() { + public boolean visit(IResourceDelta delta) throws CoreException { + IResource resource = delta.getResource(); + + if(resource.getType()==IResource.ROOT) { + // continue with the delta + return true; + } + + if (resource.getType() == IResource.PROJECT) { + // If there is no CVS nature, don't continue + if (RepositoryProvider.getProvider((IProject)resource, CVSProviderPlugin.getTypeId()) == null) { + // deconfigure if appropriate (see CVSDecorator#projectDeconfigured(IProject)) + if (deconfiguredProjects.contains(resource)) { + refresh((IProject)resource); + deconfiguredProjects.remove(resource); + } + return false; + } + } + + switch (delta.getKind()) { + case IResourceDelta.REMOVED: + // remove the cached decoration for any removed resource + cache.remove(resource); + break; + case IResourceDelta.CHANGED: + // for changed resources we have to update the decoration + changedResources.add(resource); + } + + return true; + } + }); + resourceStateChanged((IResource[])changedResources.toArray(new IResource[changedResources.size()])); + changedResources.clear(); + } catch (CoreException e) { + CVSProviderPlugin.log(e.getStatus()); + } + } + /* * @see IResourceStateChangeListener#resourceStateChanged(IResource[]) */ public void resourceStateChanged(IResource[] changedResources) { @@ -283,16 +308,16 @@ public class CVSDecorator extends LabelProvider implements ILabelDecorator, IRes WorkbenchPlugin.getDefault().getDecoratorManager().reset(); } - public static void refresh(IResource resource) { + public void refresh(IProject project) { final List resources = new ArrayList(); try { - resource.accept(new IResourceVisitor() { + project.accept(new IResourceVisitor() { public boolean visit(IResource resource) { resources.add(resource); return true; } }); - CVSProviderPlugin.broadcastResourceStateChanges((IResource[]) resources.toArray(new IResource[resources.size()])); + resourceStateChanged((IResource[]) resources.toArray(new IResource[resources.size()])); } catch (CoreException e) { } } @@ -391,7 +416,7 @@ public class CVSDecorator extends LabelProvider implements ILabelDecorator, IRes shutdown(); // unregister change listeners - changeListener.deregister(); + ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); CVSProviderPlugin.removeResourceStateChangeListener(this); // dispose of images created as overlays @@ -407,4 +432,21 @@ public class CVSDecorator extends LabelProvider implements ILabelDecorator, IRes } imageCache = new Hashtable(); } + /** + * @see IResourceStateChangeListener#projectConfigured(IProject) + */ + public void projectConfigured(IProject project) { + refresh(project); + } + + /** + * @see IResourceStateChangeListener#projectDeconfigured(IProject) + */ + public void projectDeconfigured(IProject project) { + // Unfortunately, the nature is still associated with the project at this point. + // Therefore, we will remember that the project has been deconfigured and we will + // refresh the decorators in the resource delta listener + deconfiguredProjects.add(project); + } + }
\ No newline at end of file diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSMoveDeleteHook.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSMoveDeleteHook.java index fc1d5968e..a601fd547 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSMoveDeleteHook.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSMoveDeleteHook.java @@ -16,30 +16,21 @@ import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IResourceVisitor; import org.eclipse.core.resources.team.IMoveDeleteHook; import org.eclipse.core.resources.team.IResourceTree; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; +import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin; -import org.eclipse.team.internal.ccvs.core.CVSStatus; import org.eclipse.team.internal.ccvs.core.ICVSFile; import org.eclipse.team.internal.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; +import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; import org.eclipse.ui.IWorkbenchWindow; public class CVSMoveDeleteHook implements IMoveDeleteHook { @@ -63,46 +54,90 @@ public class CVSMoveDeleteHook implements IMoveDeleteHook { }); } - private void makeFileOutgoingDeletion(IResourceTree tree, IFile source, IFile destination, int updateFlags, IProgressMonitor monitor) throws CoreException { + /* + * Delete the file and return true if an outgoing deletion will result + * and the parent folder needs to remain + */ + private boolean makeFileOutgoingDeletion(IResourceTree tree, IFile source, IFile destination, int updateFlags, IProgressMonitor monitor) throws CoreException { + // Delete or move the file if (destination == null) { tree.standardDeleteFile(source, updateFlags, monitor); } else { tree.standardMoveFile(source, destination, updateFlags, monitor); } + // Indicate whether the parent folder must remain for outgoing deletions + ICVSFile cvsFile = CVSWorkspaceRoot.getCVSFileFor(source); + boolean mustRemain; + try { + mustRemain = (cvsFile.isManaged() && ! cvsFile.getSyncInfo().isAdded()); + } catch (CVSException e) { + tree.failed(e.getStatus()); + mustRemain = true; + } + return mustRemain; } /* * Delete the files contained in the folder structure rooted at source. - * Return true if at least one file was deleted + * Return true if at least one file has been marked as an outgoing deletion and the parent folder must remain */ - private boolean makeFolderOutgoingDeletion(final IResourceTree tree, final IFolder source, final IFolder destination, final int updateFlags, final IProgressMonitor monitor) throws CoreException { - final boolean[] fileFound = new boolean[] {false}; - source.accept(new IResourceVisitor() { - public boolean visit(IResource resource) throws CoreException { - if (resource.isTeamPrivateMember()) { - return false; + private boolean makeFolderOutgoingDeletion(IResourceTree tree, IFolder source, IFolder destination, int updateFlags, IProgressMonitor monitor) throws CoreException { + boolean fileFound = false; + + // Create the destination for a move + if (destination != null && ! destination.exists()) { + destination.create(false, true, monitor); + } + + // Move or delete the children + IResource[] members = source.members(); + for (int i = 0; i < members.length; i++) { + IResource child = members[i]; + if (child.getType() == IResource.FOLDER) { + // Determine the corresponding destination folder + IFolder destFolder = null; + if (destination != null) { + destFolder = destination.getFolder(child.getFullPath().removeFirstSegments(source.getFullPath().segmentCount())); } - if (resource.getType() == IResource.FOLDER) { - if (destination != null) { - IFolder destFolder = destination.getFolder(resource.getFullPath().removeFirstSegments(source.getFullPath().segmentCount())); - destFolder.create(false, true, monitor); - } + + // Try to delete/move the child + if (makeFolderOutgoingDeletion(tree, (IFolder)child, destFolder, updateFlags, monitor)) { + fileFound = true; + // XXX Below line commented out for now // tree.failed(new CVSStatus(IStatus.WARNING, CVSStatus.FOLDER_NEEDED_FOR_FILE_DELETIONS, Policy.bind("CVSMoveDeleteHook.folderDeletionFailure", resource.getFullPath().toString()))); //$NON-NLS-1$ - } else if (resource.getType() == IResource.FILE) { - fileFound[0] = true; - IFile destFile = null; - if (destination != null) { - destFile = destination.getFile(resource.getFullPath().removeFirstSegments(source.getFullPath().segmentCount())); - } - makeFileOutgoingDeletion(tree, (IFile)resource, destFile, updateFlags, monitor); - return false; } - return true; + } else if (child.getType() == IResource.FILE) { + IFile destFile = null; + if (destination != null) { + destFile = destination.getFile(child.getFullPath().removeFirstSegments(source.getFullPath().segmentCount())); + } + fileFound = makeFileOutgoingDeletion(tree, (IFile)child, destFile, updateFlags, monitor); } + } - }, IResource.DEPTH_INFINITE, false); - - return fileFound[0]; + // If there were no files, delete the folder + if ( ! fileFound) { + try { + ICVSFolder folder = CVSWorkspaceRoot.getCVSFolderFor(source); + // We we need to check if the folder already has outgoing deletions + ICVSFile[] files = folder.getFiles(); + for (int i = 0; i < files.length; i++) { + ICVSFile cvsFile = files[i]; + if (cvsFile.isManaged() && ! cvsFile.getSyncInfo().isAdded()) { + fileFound = true; + break; + } + } + // If there is still no file, we can delete the folder + if ( ! fileFound) { + tree.standardDeleteFolder(source, updateFlags, monitor); + folder.unmanage(null); + } + } catch (CVSException e) { + tree.failed(e.getStatus()); + } + } + return fileFound; } private boolean checkForTeamPrivate(final IResource resource) { @@ -131,7 +166,12 @@ public class CVSMoveDeleteHook implements IMoveDeleteHook { } final ICVSFile cvsFile = CVSWorkspaceRoot.getCVSFileFor(source); - if (cvsFile.isManaged()) { + ResourceSyncInfo info = null; + try { + info = cvsFile.getSyncInfo(); + } catch (CVSException e) { + } + if (info != null && ! info.isAdded()) { // prompt the user for choices: Mark as outgoing deletion or cancel final boolean[] performDelete = new boolean[] { ! CVSProviderPlugin.getPlugin().getPromptOnFileDelete()}; if ( ! performDelete[0]){ diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSUIPlugin.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSUIPlugin.java index 49c98846a..74034bcdb 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSUIPlugin.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSUIPlugin.java @@ -50,8 +50,6 @@ public class CVSUIPlugin extends AbstractUIPlugin { public static final String DECORATOR_ID = "org.eclipse.team.cvs.ui.decorator"; //$NON-NLS-1$ private Hashtable imageDescriptors = new Hashtable(20); - - private ChangeListener changeListener = new ChangeListener(); public final static String ICON_PATH; static { @@ -231,7 +229,6 @@ public class CVSUIPlugin extends AbstractUIPlugin { initializeImages(); initializePreferences(); repositoryManager = new RepositoryManager(); - changeListener.register(); // if the global ignores list is changed then update decorators. TeamUIPlugin.getPlugin().addPropertyChangeListener(new IPropertyChangeListener() { @@ -257,7 +254,6 @@ public class CVSUIPlugin extends AbstractUIPlugin { * @see Plugin#shutdown() */ public void shutdown() throws CoreException { - changeListener.deregister(); super.shutdown(); try { repositoryManager.shutdown(); diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ChangeListener.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ChangeListener.java deleted file mode 100644 index 8faa3ced7..000000000 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ChangeListener.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.eclipse.team.internal.ccvs.ui; - -/* - * (c) Copyright IBM Corp. 2000, 2002. - * All Rights Reserved. - */ - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.team.internal.ccvs.core.util.ResourceDeltaVisitor; - -public class ChangeListener extends ResourceDeltaVisitor { - - static class ConfirmFolderDeleteDialog extends MessageDialog { - private Button doNotShowOption; - - ConfirmFolderDeleteDialog(Shell parentShell) { - super( - parentShell, - getTitle(), - null, // accept the default window icon - getMessage(), - MessageDialog.INFORMATION, - new String[] {IDialogConstants.OK_LABEL}, - 0); // yes is the default - } - - static String getTitle() { - return Policy.bind("ChangeListener.Deleting_CVS_folders_1"); //$NON-NLS-1$ - } - - static String getMessage() { - return Policy.bind("ChangeListener.Folders_cannot_be_deleted_from_a_CVS_server_from_the_client._To_delete_the_folder_2"); //$NON-NLS-1$ - } - - protected Control createCustomArea(Composite parent) { - Composite composite = new Composite(parent, SWT.NONE); - composite.setLayout(new GridLayout()); - doNotShowOption = new Button(composite, SWT.CHECK); - doNotShowOption.addSelectionListener(selectionListener); - - doNotShowOption.setText(Policy.bind("ChangeListener.Do_not_ask_me_about_this_again_3")); //$NON-NLS-1$ - - // set initial state - doNotShowOption.setSelection(false); - return composite; - } - - private SelectionListener selectionListener = new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - Button button = (Button) e.widget; - if (button.getSelection()) { - } - } - }; - } - - /* - * @see ResourceDeltaVisitor#handleAdded(IResource[]) - */ - protected void handleAdded(IResource[] resources) { - } - - /* - * @see ResourceDeltaVisitor#handleRemoved(IResource[]) - */ - protected void handleRemoved(IResource[] resources) { - List folderDeletions = new ArrayList(); - for (int i = 0; i < resources.length; i++) { - if(resources[i].getType()==IResource.FOLDER) { - folderDeletions.add(resources[i]); - } - } - - if(!folderDeletions.isEmpty()) { - // prompt user - } - } - - /* - * @see ResourceDeltaVisitor#handleChanged(IResource[]) - */ - protected void handleChanged(IResource[] resources) { - } - - /* - * @see ResourceDeltaVisitor#finished() - */ - protected void finished() { - } -} diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/UnmanageAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/UnmanageAction.java index 9b119849f..85f04e3a4 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/UnmanageAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/UnmanageAction.java @@ -164,7 +164,6 @@ public class UnmanageAction extends TeamAction { } finally { // We want to remove the nature even if the unmanage operation fails Team.removeNatureFromProject((IProject)resource, CVSProviderPlugin.getTypeId(), Policy.subMonitorFor(subMonitor, 10)); - CVSDecorator.refresh(resource); } } } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java index 87f8f449e..8e7bd6563 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java @@ -216,7 +216,6 @@ public class SharingWizard extends Wizard implements IConfigurationWizard { // Create the remote module for the project CVSProviderPlugin.getProvider().createModule(location, project, getModuleName(), new SubProgressMonitor(monitor, 50)); } - CVSDecorator.refresh(project); } catch (TeamException e) { throw new InvocationTargetException(e); } finally { |