Java tutorial
/***************************************************************************** * Copyright (c) 2006, 2007 g-Eclipse Consortium * 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 development of the original code was made for the * g-Eclipse project founded by European Union * project number: FP6-IST-034327 http://www.geclipse.eu/ * * Contributors: * Mathias Stuempert - initial API and implementation *****************************************************************************/ package eu.geclipse.ui.internal.actions; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.WorkspaceJob; 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.core.runtime.SubMonitor; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.actions.BaseSelectionListenerAction; import eu.geclipse.core.model.IGridContainer; import eu.geclipse.core.model.IGridElement; /** * Refreshes all selected elements. Delegates the refresh of non-virtual * elements to {@link org.eclipse.ui.actions.RefreshAction}. Virtual * elements are currently not handled. Connections are only handled in the * first level of the hierarchy, i.e. only directly selected connection * elements are refreshed but not the complete file tree. */ public class RefreshAction extends BaseSelectionListenerAction { /** * The refresh action used to delegate non-virtual elements to. */ private org.eclipse.ui.actions.RefreshAction resourcesRefresh; private List<IGridElement> virtualElements; /** * Construct a new refresh action. * * @param shell The Shell for this action. */ protected RefreshAction(final Shell shell) { super(Messages.getString("RefreshAction.refresh")); //$NON-NLS-1$ this.resourcesRefresh = new org.eclipse.ui.actions.RefreshAction(shell); } /* (non-Javadoc) * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { if (this.resourcesRefresh.isEnabled()) { this.resourcesRefresh.run(); } if (!this.virtualElements.isEmpty()) { refreshElements(this.virtualElements); } } /* (non-Javadoc) * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection) */ @Override protected boolean updateSelection(final IStructuredSelection selection) { boolean result = false; List<IResource> resources = new ArrayList<IResource>(); this.virtualElements = new ArrayList<IGridElement>(); result = filterSelection(selection, resources, this.virtualElements); if (result) { if (!resources.isEmpty() || (resources.isEmpty() && this.virtualElements.isEmpty())) { this.resourcesRefresh.selectionChanged(new StructuredSelection(resources)); result = this.resourcesRefresh.isEnabled(); } result |= resources.isEmpty() && !this.virtualElements.isEmpty(); } return result; } private boolean filterSelection(final IStructuredSelection selection, final List<IResource> resources, final List<IGridElement> elements) { Iterator<?> iter = selection.iterator(); while (iter.hasNext()) { Object o = iter.next(); IResource resource = getResource(o); if (resource != null) { resources.add(resource); } else if (o instanceof IGridElement) { elements.add((IGridElement) o); } } return (resources.size() + elements.size()) == selection.size(); } private void refreshElements(final List<IGridElement> elements) { WorkspaceJob job = new WorkspaceJob("Element Refresh") { @Override public IStatus runInWorkspace(final IProgressMonitor monitor) throws CoreException { SubMonitor sMonitor = SubMonitor.convert(monitor, "Refreshing virtual grid elements", elements.size()); for (IGridElement element : elements) { if (element instanceof IGridContainer) { IGridContainer container = (IGridContainer) element; container.setDirty(); container.refresh(sMonitor.newChild(1)); } } return Status.OK_STATUS; } }; job.schedule(); } /** * Searches for all connection elements in the specified selection * and activates them. * * @param selection The selection to be searched for connection elements. */ /*private void activateConnections( final IStructuredSelection selection ) { Iterator< ? > iter = selection.iterator(); while ( iter.hasNext() ) { Object obj = iter.next(); if ( obj instanceof IGridConnectionElement ) { IGridConnectionElement connection = ( IGridConnectionElement ) obj; connection.setDirty(); } } }*/ /** * Get all resources in the specified selection. * * @param selection The selection to be searched for resources. * @return A selection containing the selected resources. */ /*private IStructuredSelection filterResources( final IStructuredSelection selection ) { List< IResource > resources = new ArrayList< IResource >(); Iterator< ? > iter = selection.iterator(); while ( iter.hasNext() ) { Object next = iter.next(); IResource resource = getResource( next ); if ( resource != null ) { resources.add( resource ); } } return new StructuredSelection( resources ); }*/ /** * Get all virtual elements in the specified selection. * * @param selection The selection to be searched for virtual elements. * @return A selection containing the selected virtual elements. */ /*private IStructuredSelection filterVirtualElements( final IStructuredSelection selection ) { List< IGridElement > elements = new ArrayList< IGridElement >(); Iterator< ? > iter = selection.iterator(); while ( iter.hasNext() ) { Object next = iter.next(); if ( next instanceof IGridElement ) { IGridElement element = ( IGridElement ) next; if ( element.isVirtual() ) { elements.add( element ); } } } return new StructuredSelection( elements ); }*/ /** * Try to obtain an {@link IResource} from the specified object. * * @param o The object from which to obtain a resource. * @return An {@link IResource} or <code>null</code> if no resource * could be retrieved from the object. */ private IResource getResource(final Object o) { IResource resource = null; if (o instanceof IResource) { resource = (IResource) o; } else if (o instanceof IAdaptable) { resource = (IResource) ((IAdaptable) o).getAdapter(IResource.class); } return resource; } }