1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-11 10:15:39 +02:00

[143503] [updating] need a synchronize cache operation

This commit is contained in:
David McKnight 2007-12-03 19:58:58 +00:00
parent 5bc04695e2
commit 6e9b519517
3 changed files with 220 additions and 1 deletions

View file

@ -42,6 +42,9 @@ VirtualObjectDecorator.label=Virtual Object Decorator
ScriptExecutableDecorator.label=Script Executable Decorator
VirtualObjectDecorator.label=Virtual Object Decorator
# Actions
synchronizeCache.label=Synchronize Cache
synchronizeCache.tooltip=Download remote files to the Remote System Explorer file cache.
Search.Page = Remote Search
searchMenu.label = Se&arch

View file

@ -418,6 +418,21 @@ Martin Oberhuber (Wind River) - [186748] Move ISubSystemConfigurationAdapter fro
</decorator>
</extension>
<extension point="org.eclipse.ui.popupMenus">
<objectContribution
objectClass="org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile"
id="org.eclipse.rse.files.ui.actions.synchronizeCache">
<visibility>
<objectState name="isdirectory" value="true"/>
</visibility>
<action
label="%synchronizeCache.label"
tooltip="%synchronizeCache.tooltip"
class="org.eclipse.rse.files.ui.actions.SynchronizeCacheActionDelegate"
menubarPath="group.importexport"
id="synchronizeCache">
</action>
</objectContribution>
</extension>
</plugin>

View file

@ -0,0 +1,201 @@
/********************************************************************************
* Copyright (c) 2007 IBM Corporation. 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
*
* Initial Contributors:
* The following IBM employees contributed to the Remote System Explorer
* component that contains this file: David McKnight.
*
* Contributors:
* {Name} (company) - description of contribution.
* David McKnight (IBM) [143503] [updating] need a synchronize cache operation
********************************************************************************/
package org.eclipse.rse.files.ui.actions;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.rse.core.model.SystemRemoteResourceSet;
import org.eclipse.rse.internal.files.ui.Activator;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
import org.eclipse.rse.ui.view.ISystemViewElementAdapter;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionDelegate;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
/**
* This action downloads remote files of a directory to the temp file cache
* if the lastest versions have not yet been cached.
*
*/
public class SynchronizeCacheActionDelegate implements IActionDelegate {
protected IStructuredSelection fSelection;
private IStatus errorStatus;
public SynchronizeCacheActionDelegate() {
}
public void run(IAction action) {
errorStatus = null;
IRemoteFile[] files = getRemoteFiles(fSelection);
boolean completed = performCacheRemoteFiles(files);
if (!completed) {
return; // not appropriate to show errors
}
// If errors occurred, open an Error dialog
if (errorStatus != null) {
ErrorDialog.openError(getShell(), "Error Caching Remote Files", null, errorStatus);
errorStatus = null;
}
}
private void cacheRemoteFiles(IRemoteFile[] files, IProgressMonitor monitor)
{
IRemoteFile firstFile = files[0];
ISystemViewElementAdapter adapter = (ISystemViewElementAdapter)((IAdaptable)firstFile).getAdapter(ISystemViewElementAdapter.class);
SystemRemoteResourceSet set = new SystemRemoteResourceSet(firstFile.getParentRemoteFileSubSystem(), files);
adapter.doDrag(set, monitor);
}
boolean performCacheRemoteFiles(final IRemoteFile[] files) {
IRunnableWithProgress op = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InterruptedException, InvocationTargetException {
try {
// download all files that need to be cached
cacheRemoteFiles(files, monitor);
}
catch (Exception e) {
if (e.getCause() instanceof CoreException) {
recordError((CoreException)e.getCause());
} else {
Activator.getDefault().getLog().log(new Status(IStatus.ERROR,
Activator.getDefault().getBundle().getSymbolicName(),
-1, e.getMessage(), e));
displayError(e.getMessage());
}
}
}
};
try {
//TODO make this a Job an run in foreground with option to send to background
ProgressMonitorDialog mon = new ProgressMonitorDialog(getShell()) {
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText("Synchronizing Remote File Cache");
}
};
mon.run(true, true, op);
} catch (InterruptedException e) {
return false;
} catch (InvocationTargetException e) {
displayError("Internal Error: "+e.getTargetException().getMessage()); //$NON-NLS-1$
return false;
}
return true;
}
/**
* Opens an error dialog to display the given message.
* <p>
* Note that this method must be called from UI thread.
* </p>
*
* @param message
* the message
*/
void displayError(String message) {
MessageDialog.openError(getShell(), "Error Caching Remote Files", message);
}
/**
* Records the core exception to be displayed to the user once the action is
* finished.
*
* @param error
* a <code>CoreException</code>
*/
final void recordError(CoreException error) {
this.errorStatus = error.getStatus();
}
/**
* Sets the selection. The selection is only set if given a structured selection, otherwise it is set to an
* empty structured selection.
* @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
*/
public void selectionChanged(IAction action, ISelection selection) {
if (selection instanceof IStructuredSelection) {
fSelection = (IStructuredSelection)selection;
}
else {
fSelection = StructuredSelection.EMPTY;
}
}
/**
* Returns the remote files in the selection.
* Use this method if this action allows multiple remote file selection.
* @return an array of remote files.
*/
protected IRemoteFile[] getRemoteFiles(IStructuredSelection selection) {
IRemoteFile[] files = new IRemoteFile[selection.size()];
Iterator iter = selection.iterator();
int i = 0;
while (iter.hasNext()) {
files[i++] = (IRemoteFile)iter.next();
}
return files;
}
/**
* Returns the workbench.
* @return the workbench.
*/
protected IWorkbench getWorkbench() {
return PlatformUI.getWorkbench();
}
/**
* Returns the active shell.
* @return the active shell.
*/
protected Shell getShell() {
return Display.getDefault().getActiveShell();
}
/**
* Returns the selection.
* @return the selection.
*/
protected IStructuredSelection getSelection() {
return fSelection;
}
}