/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.tools.ui.internal.filesview;
import com.google.dart.tools.ui.DartPluginImages;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.SameShellProvider;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchCommandConstants;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
import org.eclipse.ui.internal.ide.StatusUtil;
import java.lang.reflect.InvocationTargetException;
/**
* Standard action for refreshing selected resources in the workspace.
*/
@SuppressWarnings("restriction")
public class RefreshAction extends org.eclipse.ui.actions.RefreshAction {
private final FilesView view;
/**
* Creates a new action.
*/
public RefreshAction(FilesView view) {
super(new SameShellProvider(view.getShell()));
DartPluginImages.setLocalImageDescriptors(this, "refresh.gif");//$NON-NLS-1$
setActionDefinitionId(IWorkbenchCommandConstants.FILE_REFRESH);
this.view = view;
}
@Override
public void run() {
//viewer refresh smarts based on a similar action for the eclipse Resource Navigator
//(see org.eclipse.ui.views.navigator.WorkspaceActionGroup)
final IStatus[] errorStatus = new IStatus[1];
errorStatus[0] = Status.OK_STATUS;
final WorkspaceModifyOperation op = (WorkspaceModifyOperation) createOperation(errorStatus);
WorkspaceJob job = new WorkspaceJob("refresh") { //$NON-NLS-1$
@Override
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
try {
op.run(monitor);
Shell shell = view.getShell();
if (shell != null && !shell.isDisposed()) {
shell.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
TreeViewer viewer = view.getViewer();
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
viewer.refresh();
}
}
});
}
} catch (InvocationTargetException e) {
String msg = NLS.bind(
IDEWorkbenchMessages.WorkspaceAction_logTitle,
getClass().getName(),
e.getTargetException());
throw new CoreException(StatusUtil.newStatus(IStatus.ERROR, msg, e.getTargetException()));
} catch (InterruptedException e) {
return Status.CANCEL_STATUS;
}
return errorStatus[0];
}
};
ISchedulingRule rule = op.getRule();
if (rule != null) {
job.setRule(rule);
}
job.setUser(true);
job.schedule();
}
}