com.liferay.ide.portlet.ui.navigator.actions.OpenPortletResourceAction.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.ide.portlet.ui.navigator.actions.OpenPortletResourceAction.java

Source

/*******************************************************************************
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 *
 * Contributors:
 *      Kamesh Sampath - initial implementation
 *      Gregory Amerson - initial implementation review and ongoing maintenance
 *
 *******************************************************************************/

package com.liferay.ide.portlet.ui.navigator.actions;

import com.liferay.ide.portlet.core.model.Portlet;
import com.liferay.ide.portlet.ui.PortletUIPlugin;
import com.liferay.ide.portlet.ui.navigator.PortletNode;
import com.liferay.ide.portlet.ui.navigator.PortletResourcesRootNode;
import com.liferay.ide.portlet.ui.navigator.PortletsNode;
import com.liferay.ide.project.core.util.ProjectUtil;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.sapphire.Element;
import org.eclipse.sapphire.java.JavaTypeName;
import org.eclipse.sapphire.ui.SapphireEditor;
import org.eclipse.sapphire.ui.forms.MasterDetailsContentNodePart;
import org.eclipse.sapphire.ui.forms.MasterDetailsContentOutline;
import org.eclipse.sapphire.ui.forms.swt.MasterDetailsEditorPage;
import org.eclipse.sapphire.ui.swt.xml.editor.SapphireEditorForXml;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.BaseSelectionListenerAction;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.FileEditorInput;

/**
 * @author <a href="mailto:kamesh.sampath@hotmail.com">Kamesh Sampath</a>
 * @author Gregory Amerson
 */
public class OpenPortletResourceAction extends BaseSelectionListenerAction {

    private static final String ACTION_MESSAGE = Msgs.openPortletConfigurationFile;
    private static final String PORTLETS_NODE_LABEL = Msgs.portlets;

    protected IEditorPart editorPart;
    protected Object selectedNode;

    public OpenPortletResourceAction() {
        super(ACTION_MESSAGE);
    }

    /**
     * @param file
     * @return
     */
    protected IEditorDescriptor findEditor(IFile file) {
        IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
        IContentType contentType = IDE.getContentType(file);
        IEditorDescriptor editorDescriptor = registry.getDefaultEditor(file.getName(), contentType);

        if (editorDescriptor == null) {
            return null; // no editor associated...
        }

        return editorDescriptor;
    }

    protected IFile initEditorPart() {
        IFile file = null;

        if (this.selectedNode instanceof PortletsNode) {
            PortletsNode portletsNode = (PortletsNode) this.selectedNode;
            PortletResourcesRootNode rootNode = portletsNode.getParent();
            file = ProjectUtil.getPortletXmlFile(rootNode.getProject());
        } else if (this.selectedNode instanceof PortletNode) {
            PortletNode portletNode = (PortletNode) this.selectedNode;
            PortletResourcesRootNode rootNode = portletNode.getParent().getParent();
            file = ProjectUtil.getPortletXmlFile(rootNode.getProject());
        }

        // Check to see if the editor part is already open
        if (editorPart == null && file != null) {
            IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
            IEditorReference[] editorReferences = page.getEditorReferences();

            for (IEditorReference iEditorReference : editorReferences) {
                if (file.getName().equals(iEditorReference.getName())) {
                    this.editorPart = iEditorReference.getEditor(false);
                }
            }
        }

        return file;
    }

    protected IEditorPart openEditor(IFile file) {
        IEditorDescriptor editorDescriptor = findEditor(file);
        IEditorPart editorPart = null;

        if (editorDescriptor != null) {
            IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();

            try {
                editorPart = page.findEditor(new FileEditorInput(file));

                if (editorPart == null) {
                    editorPart = page.openEditor(new FileEditorInput(file), editorDescriptor.getId());
                }

            } catch (Exception e) {
                MessageDialog.openError(page.getWorkbenchWindow().getShell(), Msgs.errorOpeningFile,
                        e.getMessage());
            }
        }

        return editorPart;
    }

    /**
     * @param file
     */
    protected void openPortletJavaClass(final IFile file) {
        Element modelElement = ((PortletNode) this.selectedNode).getModel();

        if (modelElement instanceof Portlet) {
            final Portlet portlet = (Portlet) modelElement;
            final JavaTypeName portletClassFile = portlet.getPortletClass().content();

            Display.getDefault().asyncExec(new Runnable() {

                public void run() {
                    IJavaProject project = JavaCore.create(file.getProject());

                    String fullyQualifiedName = portletClassFile.qualified();
                    try {
                        IType type = project.findType(fullyQualifiedName);

                        if (type != null && type.exists()) {
                            IResource resource = type.getResource();

                            if (resource instanceof IFile) {
                                IFile javaFile = (IFile) resource;
                                IEditorDescriptor editorDescriptor = findEditor(javaFile);
                                IEditorPart editorPart = null;

                                if (editorDescriptor != null) {
                                    IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
                                            .getActivePage();

                                    try {
                                        editorPart = page.findEditor(new FileEditorInput(javaFile));

                                        if (editorPart == null) {
                                            editorPart = page.openEditor(new FileEditorInput(javaFile),
                                                    editorDescriptor.getId());
                                        }

                                    } catch (Exception e) {
                                        MessageDialog.openError(page.getWorkbenchWindow().getShell(),
                                                Msgs.errorOpeningFile, e.getMessage());
                                    }
                                }
                            }
                        }
                    } catch (JavaModelException e) {
                        PortletUIPlugin.logError(e);
                    }
                }
            });
        }
    }

    @Override
    public void run() {
        if (isEnabled()) {
            final IFile file = initEditorPart();

            if (file != null && file.exists()) {
                editorPart = openEditor(file);

                if (editorPart != null && this.selectedNode instanceof PortletNode) {
                    selectAndRevealItem(editorPart);
                    openPortletJavaClass(file);
                }

            }
        }
    }

    /**
     * @param editor
     *            TODO: need to work on to fix to reveal the selected node
     */
    protected void selectAndRevealItem(IEditorPart editorPart) {
        if (this.editorPart instanceof SapphireEditor) {
            SapphireEditorForXml editor = (SapphireEditorForXml) editorPart;

            PortletNode portletNavigatorNode = (PortletNode) this.selectedNode;
            Element selectedModelElement = portletNavigatorNode.getModel();

            if (selectedModelElement != null) {
                MasterDetailsEditorPage mdepDetailsEditorPage = (MasterDetailsEditorPage) editor
                        .getActivePageInstance();

                if (mdepDetailsEditorPage != null) {
                    MasterDetailsContentOutline contentOutline = mdepDetailsEditorPage.outline();
                    MasterDetailsContentNodePart rootNode = contentOutline.getRoot();

                    if (rootNode != null) {
                        MasterDetailsContentNodePart portletAppNode = rootNode.nodes().visible().get(0);
                        MasterDetailsContentNodePart portletsNode = portletAppNode.findNode(PORTLETS_NODE_LABEL);

                        // TODO: Performance Check ???, cant we not have the shared model ?

                        if (portletsNode != null) {
                            if (selectedModelElement instanceof Portlet) {
                                Portlet selectedPortlet = (Portlet) selectedModelElement;

                                for (MasterDetailsContentNodePart childNode : portletsNode.nodes().visible()) {
                                    String selectedPortletName = selectedPortlet.getPortletName().content();

                                    if (childNode.getModelElement() instanceof Portlet) {
                                        Portlet mpContentNodePortlet = (Portlet) childNode.getModelElement();
                                        String mpContentNodePortletName = mpContentNodePortlet.getPortletName()
                                                .content();

                                        if (selectedPortletName.equals(mpContentNodePortletName)) {
                                            childNode.select();
                                            childNode.setExpanded(true);
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    @Override
    protected boolean updateSelection(IStructuredSelection selection) {
        if (selection.size() == 1) {
            this.selectedNode = selection.getFirstElement();

            if (editorPart == null) {
                initEditorPart();
            }

            if (editorPart != null && this.selectedNode instanceof PortletNode) {
                selectAndRevealItem(editorPart);
            }

            return true;
        }

        return false;
    }

    private static class Msgs extends NLS {
        public static String errorOpeningFile;
        public static String openPortletConfigurationFile;
        public static String portlets;

        static {
            initializeMessages(OpenPortletResourceAction.class.getName(), Msgs.class);
        }
    }
}