blob: a2cf6b5dd46ceab3045a57eb3d0b8f2347bf20e2 [file] [log] [blame]
/*******************************************************************************
* 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$
}
}
}