com.siteview.mde.internal.ui.views.plugins.PluginsView.java Source code

Java tutorial

Introduction

Here is the source code for com.siteview.mde.internal.ui.views.plugins.PluginsView.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2010 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
 *     Les Jones <lesojones@gmail.com> - bug 191365
 *     EclipseSource Corporation - ongoing enhancements
 *******************************************************************************/
package com.siteview.mde.internal.ui.views.plugins;

import com.siteview.mde.internal.ui.editor.monitor.ManifestEditor;

import com.siteview.mde.core.monitor.*;

import java.io.*;
import java.util.*;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jdt.core.*;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jdt.ui.actions.OpenAction;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.*;
import org.eclipse.osgi.util.NLS;
import com.siteview.mde.internal.core.*;
import com.siteview.mde.internal.ui.*;
import com.siteview.mde.internal.ui.editor.JarEntryEditorInput;
import com.siteview.mde.internal.ui.refactoring.PDERefactoringAction;
import com.siteview.mde.internal.ui.refactoring.RefactoringActionFactory;
import com.siteview.mde.internal.ui.util.SourcePluginFilter;
import com.siteview.mde.internal.ui.views.dependencies.OpenPluginDependenciesAction;
import com.siteview.mde.internal.ui.views.dependencies.OpenPluginReferencesAction;
import com.siteview.mde.internal.ui.wizards.ListUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.eclipse.ui.actions.*;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.keys.IBindingService;
import org.eclipse.ui.part.*;
import org.eclipse.ui.progress.*;

public class PluginsView extends ViewPart implements IMonitorModelListener {

    private static final String DEFAULT_EDITOR_ID = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
    private static final String HIDE_WRKSPC = "hideWorkspace"; //$NON-NLS-1$
    private static final String HIDE_EXENABLED = "hideEnabledExternal"; //$NON-NLS-1$
    private static final String SHOW_EXDISABLED = "showDisabledExternal"; //$NON-NLS-1$
    private TreeViewer fTreeViewer;
    private DrillDownAdapter fDrillDownAdapter;
    private IPropertyChangeListener fPropertyListener;
    private Action fOpenAction;
    private Action fHideExtDisabledFilterAction;
    private Action fHideExtEnabledFilterAction;
    private Action fHideWorkspaceFilterAction;
    private Action fOpenManifestAction;
    private Action fOpenSchemaAction;
    private Action fOpenSystemEditorAction;
    private Action fOpenClassFileAction;
    private Action fOpenTextEditorAction;
    private Action fSelectDependentAction;
    private Action fSelectInJavaSearchAction;
    private Action fSelectAllAction;
    private PDERefactoringAction fRefactorAction;
    private CollapseAllAction fCollapseAllAction;
    private DisabledFilter fHideExtEnabledFilter = new DisabledFilter(true);
    private DisabledFilter fHideExtDisabledFilter = new DisabledFilter(false);
    private WorkspaceFilter fHideWorkspaceFilter = new WorkspaceFilter();
    private SourcePluginFilter fSourcePluginFilter = new SourcePluginFilter();
    private JavaFilter fJavaFilter = new JavaFilter();
    private CopyToClipboardAction fCopyAction;
    private Clipboard fClipboard;
    private Object fRoot = null;

    class DisabledFilter extends ViewerFilter {

        boolean fEnabled;

        DisabledFilter(boolean enabled) {
            fEnabled = enabled;
        }

        public boolean select(Viewer v, Object parent, Object element) {
            if (element instanceof IMonitorModelBase) {
                IMonitorModelBase model = (IMonitorModelBase) element;
                return model.getUnderlyingResource() != null || model.isEnabled() != fEnabled;
            }
            return true;
        }
    }

    class WorkspaceFilter extends ViewerFilter {
        public boolean select(Viewer v, Object parent, Object element) {
            if (element instanceof IMonitorModelBase) {
                IMonitorModelBase model = (IMonitorModelBase) element;
                return model.getUnderlyingResource() == null;
            }
            return true;
        }
    }

    class JavaFilter extends ViewerFilter {
        public boolean select(Viewer v, Object parent, Object element) {
            if (element instanceof IPackageFragment) {
                IPackageFragment packageFragment = (IPackageFragment) element;
                try {
                    return packageFragment.hasChildren();
                } catch (JavaModelException e) {
                    return false;
                }
            }
            return true;
        }
    }

    class CollapseAllAction extends Action {
        public CollapseAllAction() {
            setText(MDEUIMessages.PluginsView_CollapseAllAction_label);
            setDescription(MDEUIMessages.PluginsView_CollapseAllAction_description);
            setToolTipText(MDEUIMessages.PluginsView_CollapseAllAction_tooltip);
            setImageDescriptor(MDEPluginImages.DESC_COLLAPSE_ALL);
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.action.Action#run()
         */
        public void run() {
            fTreeViewer.collapseAll();
        }
    }

    /**
     * Constructor for PluginsView.
     */
    public PluginsView() {
        fPropertyListener = new IPropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent event) {
                String property = event.getProperty();
                if (property.equals(IPreferenceConstants.PROP_SHOW_OBJECTS)) {
                    fTreeViewer.refresh();
                }
            }
        };
    }

    public void dispose() {
        MDECore.getDefault().getModelManager().removePluginModelListener(this);
        MDECore.getDefault().getSearchablePluginsManager().removePluginModelListener(this);
        MDEPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(fPropertyListener);
        if (fClipboard != null) {
            fClipboard.dispose();
            fClipboard = null;
        }
        super.dispose();
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    public void createPartControl(Composite parent) {
        fTreeViewer = new TreeViewer(parent, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.VIRTUAL);
        fDrillDownAdapter = new DrillDownAdapter(fTreeViewer);
        fTreeViewer.setContentProvider(new PluginsContentProvider(this));
        fTreeViewer.setLabelProvider(new PluginsLabelProvider());
        // need custom comparator so that way PendingUpdateAdapter is at the top.  Using regular PluginComparator the PendingUpdateAdapter
        // will be sorted to the bottom.  When it is removed after the table is initialized, the focus will go to the last item in the table (bug 216339)
        fTreeViewer.setComparator(new ListUtil.PluginComparator() {

            public int compare(Viewer viewer, Object e1, Object e2) {
                if (e1 instanceof PendingUpdateAdapter)
                    return -1;
                else if (e2 instanceof PendingUpdateAdapter)
                    return 1;
                return super.compare(viewer, e1, e2);
            }

        });
        initDragAndDrop();
        makeActions();
        initFilters();
        IActionBars actionBars = getViewSite().getActionBars();
        contributeToActionBars(actionBars);
        registerGlobalActions(actionBars);
        hookContextMenu();
        hookDoubleClickAction();
        fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent e) {
                handleSelectionChanged(e.getSelection());
            }
        });
        MDECore.getDefault().getSearchablePluginsManager().addPluginModelListener(this);
        fTreeViewer.setInput(fRoot = getDeferredTreeRoot());

        MDECore.getDefault().getModelManager().addPluginModelListener(this);
        MDEPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(fPropertyListener);
        getViewSite().setSelectionProvider(fTreeViewer);

        PlatformUI.getWorkbench().getHelpSystem().setHelp(fTreeViewer.getControl(), IHelpContextIds.PLUGINS_VIEW);
    }

    private void contributeToActionBars(IActionBars actionBars) {
        contributeToLocalToolBar(actionBars.getToolBarManager());
        contributeToDropDownMenu(actionBars.getMenuManager());
    }

    private void contributeToDropDownMenu(IMenuManager manager) {
        manager.add(fHideWorkspaceFilterAction);
        manager.add(fHideExtEnabledFilterAction);
        manager.add(fHideExtDisabledFilterAction);
    }

    private void contributeToLocalToolBar(IToolBarManager manager) {
        fDrillDownAdapter.addNavigationActions(manager);
        manager.add(new Separator());
        manager.add(fCollapseAllAction);
    }

    private void registerGlobalActions(IActionBars actionBars) {
        actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), fSelectAllAction);
        actionBars.setGlobalActionHandler(ActionFactory.RENAME.getId(), new Action() {
            public void run() {
                IStructuredSelection selection = (IStructuredSelection) fTreeViewer.getSelection();
                if (selection.size() == 1) {
                    Object element = selection.getFirstElement();
                    if (element instanceof IMonitorModelBase) {
                        fRefactorAction.setSelection(element);
                        fRefactorAction.run();
                        return;
                    }
                }
                Display.getDefault().beep();
            }
        });
    }

    private void makeActions() {
        fClipboard = new Clipboard(fTreeViewer.getTree().getDisplay());
        fOpenAction = new Action() {
            public void run() {
                handleDoubleClick();
            }
        };
        fOpenAction.setText(MDEUIMessages.PluginsView_open);

        fHideExtDisabledFilterAction = new Action() {
            public void run() {
                boolean checked = fHideExtDisabledFilterAction.isChecked();
                if (checked)
                    fTreeViewer.removeFilter(fHideExtDisabledFilter);
                else
                    fTreeViewer.addFilter(fHideExtDisabledFilter);
                getSettings().put(SHOW_EXDISABLED, checked);
                updateContentDescription();
            }
        };
        fHideExtDisabledFilterAction.setText(MDEUIMessages.PluginsView_showDisabled);

        fHideExtEnabledFilterAction = new Action() {
            public void run() {
                boolean checked = fHideExtEnabledFilterAction.isChecked();
                if (checked)
                    fTreeViewer.removeFilter(fHideExtEnabledFilter);
                else
                    fTreeViewer.addFilter(fHideExtEnabledFilter);
                getSettings().put(HIDE_EXENABLED, !checked);
                updateContentDescription();
            }
        };
        fHideExtEnabledFilterAction.setText(MDEUIMessages.PluginsView_showEnabled);

        fHideWorkspaceFilterAction = new Action() {
            public void run() {
                boolean checked = fHideWorkspaceFilterAction.isChecked();
                if (checked)
                    fTreeViewer.removeFilter(fHideWorkspaceFilter);
                else
                    fTreeViewer.addFilter(fHideWorkspaceFilter);
                getSettings().put(HIDE_WRKSPC, !checked);
                updateContentDescription();
            }
        };
        fHideWorkspaceFilterAction.setText(MDEUIMessages.PluginsView_showWorkspace);

        fOpenTextEditorAction = new Action() {
            public void run() {
                handleOpenTextEditor(getSelectedFile(), null);
            }
        };
        fOpenTextEditorAction.setText(MDEUIMessages.PluginsView_textEditor);
        fOpenTextEditorAction.setImageDescriptor(
                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_FILE));

        fOpenSystemEditorAction = new Action() {
            public void run() {
                handleOpenSystemEditor(getSelectedFile());
            }
        };
        fOpenSystemEditorAction.setText(MDEUIMessages.PluginsView_systemEditor);

        fOpenManifestAction = new Action() {
            public void run() {
                handleOpenManifestEditor(getSelectedFile());
            }
        };
        fOpenManifestAction.setText(MDEUIMessages.PluginsView_manifestEditor);

        fOpenSchemaAction = new Action() {
            public void run() {
                handleOpenSchemaEditor(getSelectedFile());
            }
        };
        fOpenSchemaAction.setText(MDEUIMessages.PluginsView_schemaEditor);

        fCopyAction = new CopyToClipboardAction(fClipboard);
        fCopyAction.setText(MDEUIMessages.PluginsView_copy);

        fSelectDependentAction = new Action() {
            public void run() {
                handleSelectDependencies();
            }
        };
        fSelectDependentAction.setText(MDEUIMessages.PluginsView_dependentPlugins);

        fSelectInJavaSearchAction = new Action() {
            public void run() {
                handleSelectInJavaSearch();
            }
        };
        fSelectInJavaSearchAction.setText(MDEUIMessages.PluginsView_pluginsInJavaSearch);

        fSelectAllAction = new Action() {
            public void run() {
                super.run();
                fTreeViewer.getTree().selectAll();
            }
        };
        fSelectAllAction.setText(MDEUIMessages.PluginsView_SelectAllAction_label);

        fCollapseAllAction = new CollapseAllAction();

        fOpenClassFileAction = new OpenAction(getViewSite());

        fRefactorAction = RefactoringActionFactory.createRefactorPluginIdAction();
    }

    private FileAdapter getSelectedFile() {
        Object obj = getSelectedObject();
        if (obj instanceof FileAdapter)
            return (FileAdapter) obj;
        return null;
    }

    private IMonitorModelBase getEnclosingModel() {
        Object obj = getSelectedObject();
        if (obj == null)
            return null;
        if (obj instanceof IMonitorModelBase)
            return (IMonitorModelBase) obj;
        if (obj instanceof FileAdapter) {
            FileAdapter file = (FileAdapter) obj;
            if (file.isManifest()) {
                FileAdapter parent = file.getParent();
                if (parent instanceof ModelFileAdapter)
                    return ((ModelFileAdapter) parent).getModel();
            }
        }
        return null;
    }

    private Object getSelectedObject() {
        IStructuredSelection selection = (IStructuredSelection) fTreeViewer.getSelection();
        if (selection.isEmpty() || selection.size() != 1)
            return null;
        return selection.getFirstElement();
    }

    private void fillContextMenu(IMenuManager manager) {
        IStructuredSelection selection = (IStructuredSelection) fTreeViewer.getSelection();

        boolean allowRefactoring = false;
        if (selection.size() == 1) {
            Object sobj = selection.getFirstElement();
            boolean addSeparator = false;
            if (sobj instanceof IMonitorModelBase) {
                IMonitorModelBase model = (IMonitorModelBase) sobj;
                File file = new File(model.getInstallLocation());
                if (file.isFile() || model.getUnderlyingResource() != null) {
                    manager.add(fOpenAction);
                }
                if (model.getUnderlyingResource() != null)
                    allowRefactoring = true;
            }
            if (sobj instanceof FileAdapter && ((FileAdapter) sobj).isDirectory() == false) {
                manager.add(fOpenAction);
                MenuManager openWithMenu = new MenuManager(MDEUIMessages.PluginsView_openWith);
                fillOpenWithMenu(openWithMenu, sobj);
                manager.add(openWithMenu);
                addSeparator = true;
            }
            if (isOpenableStorage(sobj)) {
                manager.add(fOpenAction);
                addSeparator = true;
            }
            if (sobj instanceof IClassFile) {
                manager.add(fOpenClassFileAction);
                addSeparator = true;
            }
            IMonitorModelBase entry = getEnclosingModel();
            if (entry != null) {
                Action action = new OpenPluginDependenciesAction(entry);
                action.setText(MDEUIMessages.PluginsView_openDependencies);
                action.setImageDescriptor(MDEPluginImages.DESC_CALLEES);
                manager.add(action);
                manager.add(new Separator());

                action = new OpenPluginReferencesAction(entry);
                action.setText(MDEUIMessages.SearchAction_references);
                action.setImageDescriptor(MDEPluginImages.DESC_CALLERS);
                manager.add(action);
                addSeparator = true;
            }
            if (addSeparator)
                manager.add(new Separator());
        }
        if (selection.size() > 0) {
            if (isShowInApplicable()) {
                String showInLabel = MDEUIMessages.PluginsView_showIn;
                IBindingService bindingService = (IBindingService) PlatformUI.getWorkbench()
                        .getAdapter(IBindingService.class);
                if (bindingService != null) {
                    String keyBinding = bindingService.getBestActiveBindingFormattedFor(
                            IWorkbenchCommandConstants.NAVIGATE_SHOW_IN_QUICK_MENU);
                    if (keyBinding != null) {
                        showInLabel += '\t' + keyBinding;
                    }
                }
                IMenuManager showInMenu = new MenuManager(showInLabel);
                showInMenu.add(ContributionItemFactory.VIEWS_SHOW_IN.create(getViewSite().getWorkbenchWindow()));

                manager.add(showInMenu);
                manager.add(new Separator());
            }
            if (ImportActionGroup.canImport(selection)) {
                ImportActionGroup actionGroup = new ImportActionGroup();
                actionGroup.setContext(new ActionContext(selection));
                actionGroup.fillContextMenu(manager);
                manager.add(new Separator());
            }

            JavaSearchActionGroup actionGroup = new JavaSearchActionGroup();
            actionGroup.setContext(new ActionContext(selection));
            actionGroup.fillContextMenu(manager);
        }
        fCopyAction.setSelection(selection);
        manager.add(fCopyAction);
        IMenuManager selectionMenu = new MenuManager(MDEUIMessages.PluginsView_select);
        manager.add(selectionMenu);
        if (selection.size() > 0)
            selectionMenu.add(fSelectDependentAction);
        selectionMenu.add(fSelectInJavaSearchAction);
        selectionMenu.add(fSelectAllAction);
        manager.add(new Separator());
        if (allowRefactoring) {
            fRefactorAction.setSelection(selection.getFirstElement());
            manager.add(fRefactorAction);
            manager.add(new Separator());
        }
        fDrillDownAdapter.addNavigationActions(manager);
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    public boolean isShowInApplicable() {
        IStructuredSelection selection = (IStructuredSelection) fTreeViewer.getSelection();
        if (selection.isEmpty())
            return false;
        for (Iterator iter = selection.iterator(); iter.hasNext();) {
            Object obj = iter.next();
            if (!(obj instanceof IMonitorModelBase))
                return false;
            if (((IMonitorModelBase) obj).getUnderlyingResource() == null)
                return false;
        }
        return true;
    }

    private void fillOpenWithMenu(IMenuManager manager, Object obj) {
        FileAdapter adapter = (FileAdapter) obj;
        String editorId = adapter.getEditorId();

        String fileName = adapter.getFile().getName();
        String lcFileName = fileName.toLowerCase(Locale.ENGLISH);
        ImageDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry().getImageDescriptor(fileName);
        if (lcFileName.equals(ICoreConstants.PLUGIN_FILENAME_DESCRIPTOR)
                || lcFileName.equals(ICoreConstants.FRAGMENT_FILENAME_DESCRIPTOR)
                || lcFileName.equals(ICoreConstants.MANIFEST_FILENAME_LOWER_CASE)) {
            fOpenManifestAction.setImageDescriptor(desc);
            manager.add(fOpenManifestAction);
            manager.add(new Separator());
            fOpenManifestAction.setChecked(editorId != null && editorId.equals(IMDEUIConstants.MANIFEST_EDITOR_ID));
        }
        if (lcFileName.endsWith(".mxsd") || lcFileName.endsWith(".exsd")) { //$NON-NLS-1$ //$NON-NLS-2$
            fOpenSchemaAction.setImageDescriptor(desc);
            manager.add(fOpenSchemaAction);
            manager.add(new Separator());
            fOpenSchemaAction.setChecked(editorId != null && editorId.equals(IMDEUIConstants.SCHEMA_EDITOR_ID));
        }
        manager.add(fOpenTextEditorAction);
        fOpenTextEditorAction.setChecked(editorId == null || editorId.equals(DEFAULT_EDITOR_ID));
        fOpenSystemEditorAction.setImageDescriptor(desc);
        fOpenSystemEditorAction.setChecked(editorId != null && editorId.equals("@system")); //$NON-NLS-1$
        manager.add(fOpenSystemEditorAction);
    }

    protected void initDragAndDrop() {
        int ops = DND.DROP_COPY | DND.DROP_MOVE;
        Transfer[] transfers = new Transfer[] { FileTransfer.getInstance() };
        fTreeViewer.addDragSupport(ops, transfers, new PluginsDragAdapter(fTreeViewer));
    }

    private IDialogSettings getSettings() {
        IDialogSettings master = MDEPlugin.getDefault().getDialogSettings();
        IDialogSettings section = master.getSection("pluginsView"); //$NON-NLS-1$
        if (section == null) {
            section = master.addNewSection("pluginsView"); //$NON-NLS-1$
        }
        return section;
    }

    private void initFilters() {
        IDialogSettings settings = getSettings();
        fTreeViewer.addFilter(fJavaFilter);
        boolean hideWorkspace = settings.getBoolean(HIDE_WRKSPC);
        boolean hideEnabledExternal = settings.getBoolean(HIDE_EXENABLED);
        boolean hideDisabledExternal = !settings.getBoolean(SHOW_EXDISABLED);
        if (hideWorkspace)
            fTreeViewer.addFilter(fHideWorkspaceFilter);
        if (hideEnabledExternal)
            fTreeViewer.addFilter(fHideExtEnabledFilter);
        if (hideDisabledExternal)
            fTreeViewer.addFilter(fHideExtDisabledFilter);
        fHideWorkspaceFilterAction.setChecked(!hideWorkspace);
        fHideExtEnabledFilterAction.setChecked(!hideEnabledExternal);
        fHideExtDisabledFilterAction.setChecked(!hideDisabledExternal);
        fTreeViewer.addFilter(fSourcePluginFilter);
    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                PluginsView.this.fillContextMenu(manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(fTreeViewer.getControl());
        fTreeViewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, fTreeViewer);
    }

    private void handleDoubleClick() {
        Object obj = getSelectedObject();
        if (obj instanceof IMonitorModelBase) {
            boolean expanded = false;
            // only expand target models
            if (((IMonitorModelBase) obj).getUnderlyingResource() == null) {
                expanded = fTreeViewer.getExpandedState(obj);
                fTreeViewer.setExpandedState(obj, !expanded);
            }
            if (fTreeViewer.getExpandedState(obj) == expanded) {
                // not expandable, open editor
                ManifestEditor.openPluginEditor((IMonitorModelBase) obj);
            }
        } else if (obj instanceof FileAdapter) {
            FileAdapter adapter = (FileAdapter) obj;
            if (adapter.isDirectory()) {
                fTreeViewer.setExpandedState(adapter, !fTreeViewer.getExpandedState(adapter));
                return;
            }
            String editorId = adapter.getEditorId();
            if (editorId != null && editorId.equals("@system")) //$NON-NLS-1$
                handleOpenSystemEditor(adapter);
            else
                handleOpenTextEditor(adapter, editorId);
        } else if (obj instanceof IClassFile) {
            fOpenClassFileAction.run();
        } else if (isOpenableStorage(obj)) {
            handleOpenStorage((IStorage) obj);
        }
    }

    private static boolean isOpenableStorage(Object storage) {
        if (storage instanceof IJarEntryResource)
            return ((IJarEntryResource) storage).isFile();
        return storage instanceof IStorage;
    }

    private void handleOpenStorage(IStorage obj) {
        IWorkbenchPage page = MDEPlugin.getActivePage();
        IEditorInput input = new JarEntryEditorInput(obj);
        try {
            page.openEditor(input, DEFAULT_EDITOR_ID);
        } catch (PartInitException e) {
            MDEPlugin.logException(e);
        }
    }

    private void handleSelectDependencies() {
        IStructuredSelection selection = (IStructuredSelection) fTreeViewer.getSelection();
        if (selection.size() == 0)
            return;

        IMonitorModelBase[] models = new IMonitorModelBase[selection.size()];
        System.arraycopy(selection.toArray(), 0, models, 0, selection.size());
        // exclude "org.eclipse.ui.workbench.compatibility" - it is only needed for pre-3.0 bundles
        Set set = DependencyManager.getSelfandDependencies(models,
                new String[] { "org.eclipse.ui.workbench.compatibility" }); //$NON-NLS-1$
        Object[] symbolicNames = set.toArray();
        ArrayList result = new ArrayList(set.size());
        for (int i = 0; i < symbolicNames.length; i++) {
            IMonitorModelBase model = MonitorRegistry.findModel(symbolicNames[i].toString());
            if (model != null)
                result.add(model);
        }
        fTreeViewer.setSelection(new StructuredSelection(result.toArray()));
    }

    private void handleSelectInJavaSearch() {
        PluginsContentProvider provider = (PluginsContentProvider) fTreeViewer.getContentProvider();
        Object[] elements = provider.getElements(fTreeViewer.getInput());
        ArrayList result = new ArrayList();
        for (int i = 0; i < elements.length; i++) {
            Object element = elements[i];
            if (element instanceof IMonitorModelBase) {
                String id = ((IMonitorModelBase) element).getMonitorBase().getId();
                if (MDECore.getDefault().getSearchablePluginsManager().isInJavaSearch(id))
                    result.add(element);
            }
        }
        fTreeViewer.setSelection(new StructuredSelection(result.toArray()));
    }

    private void handleOpenTextEditor(FileAdapter adapter, String editorId) {
        if (adapter == null)
            return;
        IWorkbenchPage page = MDEPlugin.getActivePage();
        if (editorId == null) {
            if (adapter.isManifest())
                editorId = IMDEUIConstants.MANIFEST_EDITOR_ID;
            else if (adapter.isSchema())
                editorId = IMDEUIConstants.SCHEMA_EDITOR_ID;
        }
        try {
            if (editorId == null || editorId.equals("@system")) //$NON-NLS-1$
                editorId = DEFAULT_EDITOR_ID;
            IFileStore store = EFS.getStore(adapter.getFile().toURI());
            IEditorInput in = new FileStoreEditorInput(store);
            page.openEditor(in, editorId);
            adapter.setEditorId(editorId);
        } catch (PartInitException e) {
            MDEPlugin.logException(e);
        } catch (CoreException e) {
            MDEPlugin.logException(e);
        }
    }

    private void handleOpenManifestEditor(FileAdapter adapter) {
        handleOpenTextEditor(adapter, IMDEUIConstants.MANIFEST_EDITOR_ID);
    }

    private void handleOpenSchemaEditor(FileAdapter adapter) {
        handleOpenTextEditor(adapter, IMDEUIConstants.SCHEMA_EDITOR_ID);
    }

    private void handleOpenSystemEditor(FileAdapter adapter) {
        if (adapter == null)
            return;
        File localFile = null;

        try {
            localFile = getLocalCopy(adapter.getFile());
        } catch (IOException e) {
            MDEPlugin.logException(e);
            return;
        }
        // Start busy indicator.
        final File file = localFile;
        final boolean result[] = new boolean[1];
        BusyIndicator.showWhile(fTreeViewer.getTree().getDisplay(), new Runnable() {
            public void run() {
                // Open file using shell.
                String path = file.getAbsolutePath();
                result[0] = Program.launch(path);
            }
        });

        // ShellExecute returns whether call was successful
        if (!result[0]) {
            MDEPlugin.logException(
                    new PartInitException(NLS.bind(MDEUIMessages.PluginsView_unableToOpen, file.getName())));
        } else {
            adapter.setEditorId("@system"); //$NON-NLS-1$
        }
    }

    private File getLocalCopy(File file) throws IOException {
        // create a tmp. copy of this file and make it
        // read-only. This is to ensure that the original
        // file belonging to the external plug-in directories
        // will not be modified. 
        String fileName = file.getName();
        String prefix;
        String suffix = null;
        int dotLoc = fileName.indexOf('.');
        if (dotLoc != -1) {
            prefix = fileName.substring(0, dotLoc);
            suffix = fileName.substring(dotLoc);
        } else {
            prefix = fileName;
        }

        File tmpFile = File.createTempFile(prefix, suffix);
        tmpFile.deleteOnExit();
        FileOutputStream fos = new FileOutputStream(tmpFile);
        FileInputStream fis = new FileInputStream(file);
        byte[] cbuffer = new byte[1024];
        int read = 0;

        while (read != -1) {
            read = fis.read(cbuffer);
            if (read != -1)
                fos.write(cbuffer, 0, read);
        }
        fos.flush();
        fos.close();
        fis.close();
        tmpFile.setReadOnly();
        return tmpFile;
    }

    private void handleSelectionChanged(ISelection selection) {
        String text = ""; //$NON-NLS-1$
        Object obj = getSelectedObject();
        if (obj instanceof IMonitorModelBase) {
            text = ((IMonitorModelBase) obj).getInstallLocation();
        }
        if (obj instanceof FileAdapter) {
            text = ((FileAdapter) obj).getFile().getAbsolutePath();
        }
        getViewSite().getActionBars().getStatusLineManager().setMessage(text);
    }

    private void hookDoubleClickAction() {
        fTreeViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                handleDoubleClick();
            }
        });
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
     */
    public void setFocus() {
        fTreeViewer.getTree().setFocus();
    }

    void updateTitle(Object newInput) {
        IConfigurationElement config = getConfigurationElement();
        if (config == null)
            return;

        if (newInput == null || newInput.equals(MDECore.getDefault().getModelManager())) {
            updateContentDescription();
            setTitleToolTip(getTitle());
        } else {
            setTitleToolTip(getInputPath(newInput));
        }
    }

    private String getInputPath(Object input) {
        if (input instanceof FileAdapter) {
            return "file: " + ((FileAdapter) input).getFile().getAbsolutePath(); //$NON-NLS-1$
        }
        if (input instanceof IMonitorModelBase) {
            IMonitorModelBase model = (IMonitorModelBase) input;
            return "plugin: " + model.getInstallLocation(); //$NON-NLS-1$
        }
        return ""; //$NON-NLS-1$
    }

    protected void updateContentDescription() {
        String total = null;
        String visible = null;

        MonitorModelManager manager = MDECore.getDefault().getModelManager();
        if (manager.isInitialized()) {
            // Only show the correct values if the PDE is already initialized
            // (N.B. PluginRegistry.getAllModels() would call the init if allowed to execute)
            total = Integer.toString(MonitorRegistry.getAllModels().length);
            visible = Integer.toString(fTreeViewer.getTree().getItemCount());
        } else {
            // defaults to be shown if the PDE isn't initialized
            total = MDEUIMessages.PluginsView_TotalPlugins_unknown;
            visible = "0"; //$NON-NLS-1$
        }
        setContentDescription(NLS.bind(MDEUIMessages.PluginsView_description, visible, total));
    }

    public void modelsChanged(final MonitorModelDelta delta) {
        if (fTreeViewer == null || fTreeViewer.getTree().isDisposed())
            return;

        fTreeViewer.getTree().getDisplay().asyncExec(new Runnable() {
            public void run() {
                int kind = delta.getKind();
                if (fTreeViewer.getTree().isDisposed())
                    return;
                if ((kind & MonitorModelDelta.CHANGED) != 0 || (kind & MonitorModelDelta.REMOVED) != 0) {
                    // Don't know exactly what change - 
                    // the safest way out is to refresh
                    fTreeViewer.refresh();
                } else if ((kind & MonitorModelDelta.ADDED) != 0) {
                    ModelEntry[] added = delta.getAddedEntries();
                    for (int i = 0; i < added.length; i++) {
                        IMonitorModelBase[] models = getModels(added[i]);
                        for (int j = 0; j < models.length; j++) {
                            if (isVisible(models[j]))
                                fTreeViewer.add(fRoot, models[j]);
                        }
                    }
                }
                updateContentDescription();
            }
        });
    }

    private IMonitorModelBase[] getModels(ModelEntry entry) {
        return (entry.hasWorkspaceModels()) ? entry.getWorkspaceModels() : entry.getExternalModels();
    }

    private boolean isVisible(IMonitorModelBase entry) {
        ViewerFilter[] filters = fTreeViewer.getFilters();
        for (int i = 0; i < filters.length; i++) {
            if (!filters[i].select(fTreeViewer, fRoot, entry))
                return false;
        }
        return true;
    }

    public Object getAdapter(Class adapter) {
        if (isShowInApplicable()) {
            if (adapter == IShowInSource.class && isShowInApplicable()) {
                return getShowInSource();
            } else if (adapter == IShowInTargetList.class) {
                return getShowInTargetList();
            }
        }

        return super.getAdapter(adapter);
    }

    /**
     * Returns the <code>IShowInSource</code> for this view.
     * @return the <code>IShowInSource</code> 
     */
    protected IShowInSource getShowInSource() {
        return new IShowInSource() {
            public ShowInContext getShowInContext() {
                ArrayList resourceList = new ArrayList();
                IStructuredSelection selection = (IStructuredSelection) fTreeViewer.getSelection();
                IStructuredSelection resources;
                if (selection.isEmpty()) {
                    resources = null;
                } else {
                    for (Iterator iter = selection.iterator(); iter.hasNext();) {
                        Object obj = iter.next();
                        if (obj instanceof IMonitorModelBase) {
                            resourceList.add(((IMonitorModelBase) obj).getUnderlyingResource());
                        }
                    }
                    resources = new StructuredSelection(resourceList);
                }

                return new ShowInContext(fTreeViewer.getInput(), resources);
            }
        };
    }

    /**
     * Returns the <code>IShowInTargetList</code> for this view.
     * @return the <code>IShowInTargetList</code> 
     */
    protected IShowInTargetList getShowInTargetList() {
        return new IShowInTargetList() {
            public String[] getShowInTargetIds() {
                return new String[] { JavaUI.ID_PACKAGES, IPageLayout.ID_PROJECT_EXPLORER };
            }
        };
    }

    /*
     * Returns an IDeferredWorkbenchAdapater which will be used to load this view in the background if the ModelManager is not fully initialized
     */
    private IDeferredWorkbenchAdapter getDeferredTreeRoot() {
        return new IDeferredWorkbenchAdapter() {

            public void fetchDeferredChildren(Object object, IElementCollector collector,
                    IProgressMonitor monitor) {
                Object[] bases = getChildren(object);
                collector.add(bases, monitor);
                monitor.done();
            }

            public ISchedulingRule getRule(Object object) {
                return null;
            }

            public boolean isContainer() {
                return true;
            }

            public Object[] getChildren(Object o) {
                return MDECore.getDefault().getModelManager().getAllModels();
            }

            public ImageDescriptor getImageDescriptor(Object object) {
                return null;
            }

            public String getLabel(Object o) {
                return MDEUIMessages.PluginsView_deferredLabel0;
            }

            public Object getParent(Object o) {
                return null;
            }

        };
    }
}