/******************************************************************************* * 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.meta.ui.editor; import java.util.*; import org.jboss.tools.common.model.*; import org.jboss.tools.common.meta.action.impl.*; public class GenerateHelpKeysHandler extends AbstractHandler { String defpath = null; public GenerateHelpKeysHandler() {} public boolean isEnabled(XModelObject object) { return object != null; } public void executeHandler(XModelObject object, Properties p) throws XModelException { defpath = action.getProperty("default"); //$NON-NLS-1$ XModelObject q = findOrCreateProperties(object); XModelObject[] fs = object.getChildren("FileMETA"); //$NON-NLS-1$ for (int i = 0; i < fs.length; i++) processFile(fs[i], q); q.setModified(true); } private XModelObject findOrCreateProperties(XModelObject p) { XModelObject q = p.getChildByPath("keys.properties"); //$NON-NLS-1$ if(q == null) { q = p.getModel().createModelObject("FilePROPERTIES", new Properties()); //$NON-NLS-1$ q.setAttributeValue("name", "keys"); //$NON-NLS-1$ //$NON-NLS-2$ q.setAttributeValue("extension", "properties"); //$NON-NLS-1$ //$NON-NLS-2$ p.addChild(q); } return q; } private void validateProperty(XModelObject q, String name, String value) { if(q.getChildByPath(name) != null) return; XModelObject v = q.getModel().createModelObject("Property", new Properties()); //$NON-NLS-1$ v.setAttributeValue("name", name); //$NON-NLS-1$ if(value != null) v.setAttributeValue("value", value); //$NON-NLS-1$ q.addChild(v); } private void processFile(XModelObject f, XModelObject q) { XModelObject[] es = f.getChildren("MetaEntity"); //$NON-NLS-1$ for (int i = 0; i < es.length; i++) processEntity(es[i], q); es = f.getChildren("MetaEntityExtension"); //$NON-NLS-1$ for (int i = 0; i < es.length; i++) processEntityExtension(es[i], q); } private void processEntity(XModelObject e, XModelObject q) { boolean impl = (e.getAttributeValue("implementation").length() > 0); //$NON-NLS-1$ if(impl) { // validateProperty(q, e.getAttributeValue("name"), defpath); } processActions(e, q, impl); } private void processEntityExtension(XModelObject e, XModelObject q) { processActions(e, q, true); } private void processActions(XModelObject e, XModelObject q, boolean impl) { XModelObject[] as = collectActions(e); String pref = e.getAttributeValue("name") + "_"; //$NON-NLS-1$ //$NON-NLS-2$ for (int i = 0; i < as.length; i++) processAction(pref, as[i], q); if(impl) { // validateProperty(q, pref + "Properties", defpath); } } private XModelObject[] collectActions(XModelObject e) { ArrayList l = new ArrayList(); collectActions(e, l); return (XModelObject[])l.toArray(new XModelObject[0]); } private void collectActions(XModelObject e, ArrayList l) { XModelObject[] as = e.getChildren("MetaActionList"); //$NON-NLS-1$ for (int i = 0; i < as.length; i++) collectActions(as[i], l); as = e.getChildren("MetaAction"); //$NON-NLS-1$ for (int i = 0; i < as.length; i++) l.add(as[i]); } private void processAction(String pref, XModelObject a, XModelObject q) { String n = a.getAttributeValue("name"); //$NON-NLS-1$ String dn = a.getAttributeValue("display name"); //$NON-NLS-1$ if(dn.endsWith("...")) dn = dn.substring(0, dn.length() - 3); //$NON-NLS-1$ if(n.startsWith("Add") || n.startsWith("Create")) { //$NON-NLS-1$ //$NON-NLS-2$ Properties p = getProperties(a); String key = p.getProperty("key"); //$NON-NLS-1$ if(key == null) { key = pref + n; } String wt = dn; if(!wt.startsWith("Add") && !wt.startsWith("New")) { //$NON-NLS-1$ //$NON-NLS-2$ wt = "Add " + wt; //$NON-NLS-1$ } validateProperty(q, key + ".WindowTitle", wt); //$NON-NLS-1$ String on = getObjectName(a); if(on == null) on = dn; validateProperty(q, key + ".Title", on); //$NON-NLS-1$ } else if(n.equals("Properties")) { //$NON-NLS-1$ String key = pref + n; // validateProperty(q, key + ".WindowTitle", "Properties"); XModelObject b = a; while(b != null && b.getModelEntity().getName().toLowerCase().indexOf("entity") < 0) { //$NON-NLS-1$ b = b.getParent(); } String on = (b == null) ? dn : getObjectName2(b); if(on == null) on = dn; validateProperty(q, key + ".Title", on); //$NON-NLS-1$ } else if(a.getAttributeValue("wizard").length() > 0) { //$NON-NLS-1$ Properties p = getProperties(a); String key = p.getProperty("key"); //$NON-NLS-1$ if(key == null) { key = pref + n; } // validateProperty(q, key, defpath); validateProperty(q, key + ".WindowTitle", dn); //$NON-NLS-1$ validateProperty(q, key + ".Title", ""); //$NON-NLS-1$ //$NON-NLS-2$ validateProperty(q, key + ".Message", ""); //$NON-NLS-1$ //$NON-NLS-2$ } else if(isSpecialWizard(a.getAttributeValue("handler"))) { //$NON-NLS-1$ int m = a.getChildren().length; for (int i = 0; i < m; i++) { String key = pref + n + "_" + i; //$NON-NLS-1$ // validateProperty(q, key, defpath); validateProperty(q, key + ".WindowTitle", dn); //$NON-NLS-1$ validateProperty(q, key + ".Title", ""); //$NON-NLS-1$ //$NON-NLS-2$ validateProperty(q, key + ".Message", ""); //$NON-NLS-1$ //$NON-NLS-2$ } } else if(n.indexOf("Edit") >= 0) { //$NON-NLS-1$ String key = pref + n; // validateProperty(q, key, defpath); validateProperty(q, key + ".WindowTitle", dn); //$NON-NLS-1$ validateProperty(q, key + ".Title", ""); //$NON-NLS-1$ //$NON-NLS-2$ validateProperty(q, key + ".Message", ""); //$NON-NLS-1$ //$NON-NLS-2$ } } private boolean isSpecialWizard(String s) { return s.equals("org.jboss.tools.common.meta.action.impl.handlers.DefaultSpecialHandler") //$NON-NLS-1$ || s.equals("%SpecialWizard%"); //$NON-NLS-1$ } private String getObjectName(XModelObject a) { XModelObject[] cs = a.getChildren(); if(cs == null || cs.length == 0) return null; String n = cs[0].getAttributeValue("entity name"); //$NON-NLS-1$ return getObjectName(n); } private String getObjectName2(XModelObject a) { return getObjectName(a.getAttributeValue("name")); //$NON-NLS-1$ } private String getObjectName(String n) { StringBuffer result = new StringBuffer(); for (int i = 0; i < n.length(); i++) { char ch = n.charAt(i); if(i > 0 && Character.isUpperCase(ch) && !Character.isUpperCase(n.charAt(i - 1))) { result.append(' '); } if(!Character.isDigit(ch) && ch != '.') { result.append(ch); } } return result.toString(); } private Properties getProperties(XModelObject a) { Properties p = new Properties(); String ps = a.getAttributeValue("properties"); //$NON-NLS-1$ if(ps == null || ps.length() == 0) return p; StringTokenizer st = new StringTokenizer(ps, ";"); //$NON-NLS-1$ while(st.hasMoreTokens()) { String t = st.nextToken(); int i = t.indexOf('='); if(i < 0) continue; String n = t.substring(0, i); String v = t.substring(i + 1); p.setProperty(n, v); } return p; } }