/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.java.handlers; import java.util.*; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.*; import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.ui.*; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.plugin.ModelMessages; import org.jboss.tools.common.model.plugin.ModelPlugin; import org.jboss.tools.common.meta.action.impl.*; public class OpenJavaSourceHandler extends AbstractHandler { public OpenJavaSourceHandler() {} public boolean isEnabled(XModelObject object) { if(object == null) return false; String type = getType(object); if(type == null || type.length() == 0) return false; return true; } protected String getType(XModelObject object) { String attr = getAttribute(); if(attr == null) return null; return object.getAttributeValue(attr); } protected String getAttribute() { return action.getProperty("attribute"); //$NON-NLS-1$ } public void executeHandler(XModelObject object, Properties p) throws XModelException { if(!isEnabled(object)) return; String type = getType(object); type = type.replace('.', '/') + ".java"; //$NON-NLS-1$ if(p == null || p.getProperty("property") == null) { //$NON-NLS-1$ String n = action.getProperty("property"); //$NON-NLS-1$ if(n != null) { String v = object.getAttributeValue(n); if(v != null) { if(p == null) p = new Properties(); p.put("property", v); //$NON-NLS-1$ } } } try { open(object.getModel(), type, p); } catch (CoreException e) { throw new XModelException(e); } } public static void open(XModel model, String type, Properties p) throws XModelException, CoreException { IProject project = (IProject)model.getProperties().get(XModelObjectConstants.PROJECT); IJavaProject javaProject = (IJavaProject)project.getNature(JavaCore.NATURE_ID); IJavaElement javaElement = javaProject.findElement(new Path(type)); if (javaElement == null) { String message = "Cannot find java source."; if(p != null && XModelObjectConstants.TRUE.equals(p.getProperty("ignoreWarning"))) { //$NON-NLS-1$ p.setProperty("error", message); //$NON-NLS-1$ } else { ServiceDialog d = model.getService(); d.showDialog(ModelMessages.WARNING, message, new String[]{"Close"}, null, ServiceDialog.WARNING); } } else { if(p != null && XModelObjectConstants.TRUE.equals(p.getProperty("onlySelectIfOpen"))) { //$NON-NLS-1$ IEditorInput ii = EditorUtility.getEditorInput(javaElement); IWorkbenchPage page = getWorkbenchPage(); if(page == null) return; IEditorPart editor = page.findEditor(ii); if(editor == null) return; else page.bringToTop(editor); } IJavaElement child = getElement(javaElement, p); if(child != null) { JavaUI.revealInEditor(JavaUI.openInEditor(javaElement), child); } else { JavaUI.openInEditor(javaElement); } } } private static IJavaElement getElement(IJavaElement javaElement, Properties p) { if(p == null || !(javaElement instanceof IParent)) return null; String childName = p.getProperty("property"); //$NON-NLS-1$ if(childName == null) return null; IJavaElement[] cs = null; try { cs = ((IParent)javaElement).getChildren(); } catch (JavaModelException e) { //ignore } if(cs != null) for (int i = 0; i < cs.length; i++) { if(cs[i] instanceof IType) { IType t = (IType)cs[i]; if(childName.length() > 0) { String getter = "get" + childName.substring(0, 1).toUpperCase() + childName.substring(1); //$NON-NLS-1$ IMethod m = t.getMethod(getter, new String[0]); if(m != null && m.exists()) return m; } IField f = t.getField(childName); if(f != null && f.exists()) return f; } else { if(childName.equals(cs[i].getElementName())) return cs[i]; } } return null; } private static IWorkbenchPage getWorkbenchPage() { ModelPlugin plugin = ModelPlugin.getDefault(); IWorkbench workbench = (plugin == null) ? null : plugin.getWorkbench(); IWorkbenchWindow window = (workbench == null) ? null : workbench.getActiveWorkbenchWindow(); return (window == null) ? null : window.getActivePage(); } }