| /******************************************************************************* |
| * Copyright (c) 2005, 2018 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * 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.core.runtime.Platform; |
| 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; |
| |
| /** |
| * 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; |
| |
| @Override |
| public void selectionChanged(IAction action, ISelection sel) { |
| if(sel instanceof IStructuredSelection) |
| selection = (IStructuredSelection) sel; |
| else |
| selection = StructuredSelection.EMPTY; |
| } |
| |
| @Override |
| public void run(IAction action) { |
| |
| WorkspaceModifyOperation deletePropertyOperation = new WorkspaceModifyOperation() { |
| @Override |
| 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 |
| Platform.getLog(DeletePropertyAction.class).error("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 | InterruptedException e) { |
| // handle error gracefully |
| Platform.getLog(DeletePropertyAction.class).error("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$ |
| } |
| |
| } |
| } |