Java tutorial
/******************************************************************************* * 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); } } }