001: /*****************************************************************************************
002: * Copyright (c) 2004 Andrei Loskutov. All rights reserved. This program and the
003: * accompanying materials are made available under the terms of the BSD License which
004: * accompanies this distribution, and is available at
005: * http://www.opensource.org/licenses/bsd-license.php Contributor: Andrei Loskutov -
006: * initial API and implementation
007: ****************************************************************************************/package de.loskutov.bco.ui.actions;
008:
009: import org.eclipse.core.resources.IContainer;
010: import org.eclipse.core.resources.IFile;
011: import org.eclipse.core.resources.IResource;
012: import org.eclipse.core.resources.ResourcesPlugin;
013: import org.eclipse.jdt.core.IJavaElement;
014: import org.eclipse.jdt.core.JavaCore;
015: import org.eclipse.jface.action.IAction;
016: import org.eclipse.jface.dialogs.IDialogConstants;
017: import org.eclipse.swt.widgets.Shell;
018: import org.eclipse.ui.IObjectActionDelegate;
019: import org.eclipse.ui.dialogs.ResourceListSelectionDialog;
020:
021: import de.loskutov.bco.BytecodeOutlinePlugin;
022:
023: /**
024: * @author Andrei
025: */
026: public class OpenAction extends BytecodeAction implements
027: IObjectActionDelegate {
028:
029: /**
030: * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
031: */
032: public void run(IAction action) {
033: // always only one element!
034: IJavaElement[] resources = getSelectedResources();
035:
036: // select one from input dialog
037: IJavaElement element2 = selectJavaElement();
038: if (element2 == null) {
039: return;
040: }
041: try {
042: exec(resources[0], element2);
043: } catch (Exception e) {
044: BytecodeOutlinePlugin.error("Failed to run Compare: "
045: + e.getMessage(), e);
046: }
047: }
048:
049: private IJavaElement selectJavaElement() {
050: IContainer input = ResourcesPlugin.getWorkspace().getRoot();
051:
052: OpenClassFileDialog dialog = new OpenClassFileDialog(shell,
053: input, IResource.FILE);
054:
055: int resultCode = dialog.open();
056: if (resultCode != IDialogConstants.OK_ID) {
057: return null;
058: }
059:
060: Object[] result = dialog.getResult();
061: if (result == null || result.length == 0
062: || !(result[0] instanceof IFile)) {
063: return null;
064: }
065: return JavaCore.create((IFile) result[0]);
066: }
067:
068: /**
069: * @author Andrei
070: */
071: private static final class OpenClassFileDialog extends
072: ResourceListSelectionDialog {
073:
074: /**
075: * @param parentShell
076: * @param container
077: * @param typesMask
078: */
079: public OpenClassFileDialog(Shell parentShell,
080: IContainer container, int typesMask) {
081: super (parentShell, container, typesMask);
082: setTitle("Bytecode compare");
083: setMessage("Please select class file to compare");
084: }
085:
086: /**
087: * Extends the super's filter to exclude derived resources.
088: * @since 3.0
089: */
090: protected boolean select(IResource resource) {
091: if (resource == null) {
092: return false;
093: }
094: String fileExtension = resource.getFileExtension();
095: return super .select(resource)
096: && ("java".equals(fileExtension) || "class"
097: .equals(fileExtension));
098: }
099: }
100:
101: }
|