/******************************************************************************* * Copyright (c) 2005, 2006 IBM Corporation and others. * 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 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ui.examples.navigator.actions; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Properties; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionDelegate; import org.eclipse.ui.actions.WorkspaceModifyOperation; import org.eclipse.ui.examples.navigator.PropertiesTreeData; import org.eclipse.ui.internal.examples.navigator.Activator; /** * A sample action that can delete a PropertiesTreeData item from a property file. * * @since 3.2 */ public class DeletePropertyAction extends ActionDelegate { private IStructuredSelection selection = StructuredSelection.EMPTY; /* (non-Javadoc) * @see org.eclipse.ui.actions.ActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection) */ public void selectionChanged(IAction action, ISelection sel) { if(sel instanceof IStructuredSelection) selection = (IStructuredSelection) sel; else selection = StructuredSelection.EMPTY; } /* (non-Javadoc) * @see org.eclipse.ui.actions.ActionDelegate#run(org.eclipse.jface.action.IAction) */ public void run(IAction action) { WorkspaceModifyOperation deletePropertyOperation = new WorkspaceModifyOperation() { /* (non-Javadoc) * @see org.eclipse.ui.actions.WorkspaceModifyOperation#execute(org.eclipse.core.runtime.IProgressMonitor) */ protected void execute(IProgressMonitor monitor) throws CoreException { // In production code, you should always externalize strings, but this is an example. monitor.beginTask("Deleting property from selection", 5); //$NON-NLS-1$ try { if(selection.size() == 1) { Object firstElement = selection.getFirstElement(); if(firstElement instanceof PropertiesTreeData) { PropertiesTreeData data = (PropertiesTreeData) firstElement; IFile propertiesFile = data.getFile(); monitor.worked(1); if(propertiesFile != null && propertiesFile.isAccessible()) { try { // load the model Properties properties = new Properties(); properties.load(propertiesFile.getContents()); monitor.worked(1); // delete the property properties.remove(data.getName()); monitor.worked(1); // persist the model to a temporary storage medium (byte[]) ByteArrayOutputStream output = new ByteArrayOutputStream(); properties.store(output, null); monitor.worked(1); // set the contents of the properties file propertiesFile.setContents( new ByteArrayInputStream(output.toByteArray()), IResource.FORCE | IResource.KEEP_HISTORY, monitor); monitor.worked(1); } catch (IOException e) { // handle error gracefully Activator.logError(0, "Could not delete property!", e); //$NON-NLS-1$ MessageDialog.openError(Display.getDefault().getActiveShell(), "Error Deleting Property", //$NON-NLS-1$ "Could not delete property!"); //$NON-NLS-1$ } } else // shouldn't happen, but handle error condition MessageDialog.openError(Display.getDefault().getActiveShell(), "Error Deleting Property", //$NON-NLS-1$ "The properties file was not accessible!"); //$NON-NLS-1$ } else // shouldn't happen, but handle error condition MessageDialog.openError(Display.getDefault().getActiveShell(), "Error Deleting Property", //$NON-NLS-1$ "The element that was selected was not of the right type."); //$NON-NLS-1$ } else // shouldn't happen, but handle error condition MessageDialog.openError(Display.getDefault().getActiveShell(), "Error Deleting Property", //$NON-NLS-1$ "An invalid number of properties were selected."); //$NON-NLS-1$ } finally { monitor.done(); } } }; try { PlatformUI.getWorkbench().getProgressService().run(true, false, deletePropertyOperation); } catch (InvocationTargetException e) { // handle error gracefully Activator.logError(0, "Could not delete property!", e); //$NON-NLS-1$ MessageDialog.openError(Display.getDefault().getActiveShell(), "Error Deleting Property", //$NON-NLS-1$ "Could not delete property!"); //$NON-NLS-1$ } catch (InterruptedException e) { // handle error gracefully Activator.logError(0, "Could not delete property!", e); //$NON-NLS-1$ MessageDialog.openError(Display.getDefault().getActiveShell(), "Error Deleting Property", //$NON-NLS-1$ "Could not delete property!"); //$NON-NLS-1$ } } }