Author: kmorin Date: 2009-07-22 15:08:00 +0200 (Wed, 22 Jul 2009) New Revision: 1503 Added: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ComponentHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/FrameHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/SelectableButtonHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TextComponentHandler.java Removed: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ApplicationHandler.java Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/SwingGuixInitializer.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/events/SwingEventHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/generator/SwingAbstractClassGenerator.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/generator/SwingGenerator.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ButtonHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/CellHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/LabelHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/MenuBarHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/MenuHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/MenuItemHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/PanelHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/RowHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TabPanelHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TableHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TextFieldHandler.java trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ToggleButtonHandler.java Log: Added the proxyEventInfo (to generate the binding) Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/SwingGuixInitializer.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/SwingGuixInitializer.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/SwingGuixInitializer.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -22,7 +22,7 @@ //~--- non-JDK imports -------------------------------------------------------- import org.nuiton.guix.tags.swing.PanelHandler; -import org.nuiton.guix.tags.swing.ApplicationHandler; +import org.nuiton.guix.tags.swing.FrameHandler; import org.nuiton.guix.tags.swing.CellHandler; import org.nuiton.guix.tags.swing.RowHandler; import org.nuiton.guix.tags.swing.TableHandler; @@ -43,7 +43,8 @@ */ public class SwingGuixInitializer { public static void initialize() { - TagManager.registerGuixClassHandler("Application", ApplicationHandler.class); + TagManager.registerGuixClassHandler("Application", FrameHandler.class); + TagManager.registerGuixClassHandler("Frame", FrameHandler.class); TagManager.registerGuixClassHandler("Table", TableHandler.class); TagManager.registerGuixClassHandler("Row", RowHandler.class); TagManager.registerGuixClassHandler("Cell", CellHandler.class); Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/events/SwingEventHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/events/SwingEventHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/events/SwingEventHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -89,6 +89,9 @@ methods.put(method, value); map.put(esd, methods); } + else if(map.get(esd).get(method) != null) { + map.get(esd).put(method, map.get(esd).get(method) + value); + } else { map.get(esd).put(method, value); } Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/generator/SwingAbstractClassGenerator.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/generator/SwingAbstractClassGenerator.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/generator/SwingAbstractClassGenerator.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -19,7 +19,10 @@ package org.nuiton.guix.generator; //~--- non-JDK imports -------------------------------------------------------- -import java.beans.IntrospectionException;import org.nuiton.guix.tags.swing.MenuBarHandler; +import java.beans.IntrospectionException; +import java.io.File; +import java.util.Map; +import org.nuiton.guix.tags.swing.MenuBarHandler; ; import org.nuiton.guix.model.GuixModelObject; @@ -58,6 +61,8 @@ List<StyleSheet> styleSheets = new ArrayList<StyleSheet>(); /** map of the different parts of the script associated with gmo */ Map<ScriptPart, Object> script; + /** Bindings to generate */ + Map<String,Map<String, String>> bindings2Generate = new HashMap<String,Map<String, String>>(); /** * Constructor @@ -77,8 +82,7 @@ script = sh.decomposeScript(gmo.getClassDescriptor().getScript()); } - @Override - public void generate(File out) { + public JavaFile generates() { super.generate(); //add imports @@ -89,13 +93,11 @@ //add bodycode jf.addBodyCode((String) script.get(ScriptPart.BODYCODE)); - //add bindinggroup - jf.addField(new JavaField(Modifier.PRIVATE, - "org.jdesktop.beansbinding.BindingGroup", - "bindingGroup", "bindingGroup for databinding"), - true); - //add fields - addFields(gmo); + //add implementation of firePropertyChange + JavaArgument[] args = new JavaArgument[]{new JavaArgument("String", "name"), + new JavaArgument("Object", "oldValue"), + new JavaArgument("Object", "newValue")}; + jf.addMethod(new JavaMethod(Modifier.PUBLIC, "void", "firePropertyChange", args, null, "super.firePropertyChange(name, oldValue, newValue);", null)); //add constructor jf.addMethod(new JavaMethod(Modifier.PUBLIC, null, gmo.getClassDescriptor().getName() + "Abstract", @@ -124,7 +126,7 @@ jf.addMethod(new JavaMethod(Modifier.PUBLIC, "void", getMethodName(Method.COMPONENTS_TREE), null, null, methodBodies.get(Method.COMPONENTS_TREE), "components layout")); //add databinding method - StringBuffer dataBinding = new StringBuffer("bindingGroup = new org.jdesktop.beansbinding.BindingGroup();\n"); + StringBuffer dataBinding = new StringBuffer(); dataBinding.append(methodBodies.get(Method.DATABINDING_INIT)); jf.addMethod(new JavaMethod(Modifier.PUBLIC, "void", getMethodName(Method.DATABINDING_INIT), null, null, dataBinding.toString(), "initilization of databinding")); @@ -151,62 +153,18 @@ jf.addMethod(m); } } - //set superclass and interface - jf.setSuperClass(gmo.getClassDescriptor().getSuperClass().getPackageName() + "." + gmo.getClassDescriptor().getSuperClass().getName()); - jf.addInterface(gmo.getClassDescriptor().getName()); //saves the file - saveFile(out); + //saveFile(out); } catch (ClassNotFoundException eee) { if (log.isErrorEnabled()) { log.error(eee); } } + return jf; } /** - * Adds fields to the file to generate - * - * @param gmo the GuixModelObject to analyze - */ - private void addFields(GuixModelObject gmo) { - for (GuixModelObject child : gmo.getChildren()) { - //if gmo represents a Guix tag - if (child.getClassDescriptor().getPackageName() == null - && TagManager.getGuixClassHandler(child.getClassDescriptor().getName()) != null) { - Class clazz; - try { - TagHandler th = (TagHandler)TagManager.getGuixClassHandler(child.getClassDescriptor().getName()).newInstance(); - if(th.getClassToGenerate() != null) { - clazz = th.getClassToGenerate(); - jf.addField(new JavaField(Modifier.PRIVATE, - clazz.getSimpleName(), - child.getId(), child.getJavadoc()), - true); - } - } - catch (InstantiationException eee) { - if(log.isErrorEnabled()) { - log.error(eee); - } - } - catch (IllegalAccessException eee) { - if(log.isErrorEnabled()) { - log.error(eee); - } - } - } - else { - jf.addField(new JavaField(Modifier.PRIVATE, - (classes != null && classes.contains(child.getClassDescriptor().toString())) ? child.getClassDescriptor().getName() + "Abstract" : child.getClassDescriptor().getName(), - child.getId(), child.getJavadoc()), - true); - } - addFields(child); - } - } - - /** * Browse the GuixModelObjects to add the creation, initialization and bindings methods to the file to gnerate * * @param gmo the GuixModelObject to analyze @@ -233,11 +191,16 @@ TableHandler table = new TableHandler(gmo); //the table is a JPanel clazz = table.getClassToGenerate(); + + jf.addField(new JavaField(Modifier.PRIVATE, + clazz.getName(), + gmo.getId(), gmo.getJavadoc(), table), + true); //the layout of the table is the GridBagLayout creationMethod.append(gmo.getId()).append(" = new ") .append(clazz.getName()).append("(new java.awt.GridBagLayout());\n"); - constraint = processAttributes(clazz, gmo, bindings, creationMethod, null, seh, null); + constraint = processAttributes(clazz, gmo, bindings, creationMethod, null, seh, null, table); //add the component to its parent componentsTree.append(gmo.getParent().getId() == null ? "this" : gmo.getParent().getId()).append(".add(").append(gmo.getId()); @@ -296,11 +259,16 @@ StringBuffer creationMethod = new StringBuffer(); MenuBarHandler menuBar = new MenuBarHandler(); clazz = menuBar.getClassToGenerate(); - //the layout of the table is the GridBagLayout + + jf.addField(new JavaField(Modifier.PRIVATE, + clazz.getName(), + gmo.getId(), gmo.getJavadoc(), menuBar), + true); + // creationMethod.append(gmo.getId()).append(" = new ") .append(clazz.getName()).append("();\n"); - constraint = processAttributes(clazz, gmo, bindings, creationMethod, null, seh, null); + constraint = processAttributes(clazz, gmo, bindings, creationMethod, null, seh, null, menuBar); //add the component to its parent componentsTree.append(gmo.getParent().getId() == null ? "this" : gmo.getParent().getId()).append(".setJMenuBar(").append(gmo.getId()).append(");\n"); @@ -317,11 +285,11 @@ componentsCreation.append("create").append(capitalizedId).append("();\n"); } else { + TagHandler th = null; if(TagManager.getGuixClassHandler(gmo.getClassDescriptor().getName()) != null) { try { - clazz = ((TagHandler)TagManager.getGuixClassHandler(gmo.getClassDescriptor().getName()).newInstance()).getClassToGenerate(); - gmo.getClassDescriptor().setPackageName(clazz.getPackage().getName()); - gmo.getClassDescriptor().setName(clazz.getSimpleName()); + th = (TagHandler)TagManager.getGuixClassHandler(gmo.getClassDescriptor().getName()).newInstance(); + clazz = th.getClassToGenerate(); } catch (InstantiationException eee) { if(log.isErrorEnabled()) { @@ -336,10 +304,8 @@ } else if(gmo.getClassDescriptor().getSuperClass() != null && TagManager.getGuixClassHandler(gmo.getClassDescriptor().getSuperClass().getName()) != null) { try { - TagHandler th = (TagHandler)TagManager.getGuixClassHandler(gmo.getClassDescriptor().getSuperClass().getName()).newInstance(); + th = (TagHandler)TagManager.getGuixClassHandler(gmo.getClassDescriptor().getSuperClass().getName()).newInstance(); clazz = th.getClassToGenerate(); - gmo.getClassDescriptor().getSuperClass().setPackageName(clazz.getPackage().getName()); - gmo.getClassDescriptor().getSuperClass().setName(clazz.getSimpleName()); } catch (InstantiationException eee) { if(log.isErrorEnabled()) { @@ -352,6 +318,7 @@ } } } + ClassDescriptor cd = gmo.getClassDescriptor(); //while the class hasn't been found and the classDescriptor is not null while (clazz == null && cd != null) { @@ -366,19 +333,51 @@ } //if the class hasn't been found if (clazz == null) { - throw new ClassNotFoundException(); + File f = new File(gmo.getClassDescriptor().toString().replace('.', File.separatorChar)); + if(f.exists()) { + + } + else { + throw new ClassNotFoundException(); + } } + if(gmo.getClassDescriptor().getPackageName() == null + && th != null && th.getClassToGenerate() != null) { + jf.addField(new JavaField(Modifier.PRIVATE, + clazz.getName(), + gmo.getId(), gmo.getJavadoc(), th), + true); + } + else if(gmo.getId() == null) { + jf.addField(new JavaField(Modifier.PRIVATE, + (classes != null && classes.contains(gmo.getClassDescriptor().toString())) ? gmo.getClassDescriptor().toString() + "Abstract" : gmo.getClassDescriptor().toString(), + gmo.getClassDescriptor().getName().toLowerCase(), "this", gmo.getJavadoc(), th), + true); + } + else { + jf.addField(new JavaField(Modifier.PRIVATE, + (classes != null && classes.contains(gmo.getClassDescriptor().toString())) ? gmo.getClassDescriptor().toString() + "Abstract" : gmo.getClassDescriptor().toString(), + gmo.getId(), gmo.getJavadoc(), th), + true); + } + //if gmo does not represents the first tag if (gmo.getParent() != null) { //id with the first letter capitalized String capitalizedId = (gmo.getId().length() > 0) ? Character.toUpperCase(gmo.getId().charAt(0)) + gmo.getId().substring(1) : gmo.getId(); StringBuffer creationMethod = new StringBuffer(); - creationMethod.append(gmo.getId()).append(" = new ").append(classes.contains(gmo.getClassDescriptor().toString()) ? gmo.getClassDescriptor().getName() + "Impl" : gmo.getClassDescriptor().getName()).append("(").append(gmo.getConstructor() != null ? gmo.getConstructor() : "").append(");\n"); + creationMethod.append(gmo.getId()).append(" = new ").append(classes.contains(gmo.getClassDescriptor().toString()) ? gmo.getClassDescriptor().toString() + "Impl" : clazz.getName()).append("(").append(gmo.getConstructor() != null ? gmo.getConstructor() : "").append(");\n"); componentsCreation.append("create").append(capitalizedId).append("();\n"); - constraint = processAttributes(clazz, gmo, bindings, creationMethod, null, seh, null); + //FIXME + if (gmo.getStyleSheets() != null) { + styleSheets.addAll(gmo.getStyleSheets()); + } + + constraint = processAttributes(clazz, gmo, bindings, creationMethod, null, seh, null, th); + //if gmo is the child of a cell if (!((gmo.getParent().getClassDescriptor().getPackageName() == null || gmo.getParent().getClassDescriptor().getPackageName().equals("org.nuiton.guix.tags.swing")) && gmo.getParent().getClassDescriptor().getName().equalsIgnoreCase("Cell"))) { //if gmo represents a JMenuBar @@ -388,29 +387,13 @@ } else { //add the component to its parent - componentsTree.append(gmo.getParent().getId() == null ? "this" : gmo.getParent().getId()).append(".add(").append(gmo.getId()); - //with a constraint if it is not null - if (constraint != null) { - componentsTree.append(",").append(constraint); - } - componentsTree.append(");\n"); - } - } - //FIXME - if (gmo.getStyleSheets() != null) { - styleSheets.addAll(gmo.getStyleSheets()); - } - - for (StyleSheet ss : styleSheets) { - for (Selector sel : ss.getSelectors()) { - if ((sel.getJavaClassName() == null || sel.getJavaClassName().equals(gmo.getClassDescriptor().getPackageName() + "." + gmo.getClassDescriptor().getName())) && (sel.getId() == null || sel.getId().equals(gmo.getId())) //&& sel.getPseudoClass().equals("") - && (sel.getStyleClass() == null || sel.getStyleClass().equals(gmo.getStyleClass()))) { - for (Rule rule : sel.getRules()) { - for (Entry<String, String> entry : rule.getProperties().entrySet()) { - String capitalizedAttribute = (entry.getKey().length() > 0) ? Character.toUpperCase(entry.getKey().charAt(0)) + entry.getKey().substring(1) : entry.getKey(); - creationMethod.append(gmo.getId()).append(".set").append(capitalizedAttribute).append("(").append(entry.getValue()).append(");\n"); - } + if(java.awt.Component.class.isAssignableFrom(clazz)) { + componentsTree.append(gmo.getParent().getId() == null ? "this" : gmo.getParent().getId()).append(".add(").append(gmo.getId()); + //with a constraint if it is not null + if (constraint != null) { + componentsTree.append(",").append(constraint); } + componentsTree.append(");\n"); } } } @@ -419,7 +402,21 @@ //if gmo represents the first tag else { boolean layoutDefined = false; - constraint = processAttributes(clazz, gmo, bindings, null, componentsTree, seh, layoutDefined); + //set superclass and interface + if(th != null) { + jf.setSuperClass(th.getClassToGenerate().getName()); + } + else { + jf.setSuperClass(gmo.getClassDescriptor().getSuperClass().getPackageName() + "." + gmo.getClassDescriptor().getSuperClass().getName()); + } + jf.addInterface(gmo.getClassDescriptor().getName()); + + //FIXME + if (gmo.getStyleSheets() != null) { + styleSheets.addAll(gmo.getStyleSheets()); + } + + constraint = processAttributes(clazz, gmo, bindings, null, componentsTree, seh, layoutDefined, th); } //browse the children of gmo for (GuixModelObject child : gmo.getChildren()) { @@ -449,11 +446,15 @@ * @param layoutDefined true if a layout has been defined * @return */ - private String processAttributes(Class clazz, GuixModelObject gmo, StringBuffer bindings, StringBuffer creationMethod, StringBuffer componentsTree, SwingEventHandler seh, Boolean layoutDefined) { + private String processAttributes(Class clazz, GuixModelObject gmo, StringBuffer bindings, StringBuffer creationMethod, + StringBuffer componentsTree, SwingEventHandler seh, Boolean layoutDefined, TagHandler th) { String constraint = null; + processCSSAttributes(gmo, seh, clazz); //browses the attributes for (AttributeDescriptor attr : gmo.getAttributeDescriptors()) { - + if(th != null && th.getAttrToGenerate(attr.getName()) != null) { + attr.setName(th.getAttrToGenerate(attr.getName())); + } boolean addQuote = false; //the attribute name with the first letter capitalized String capitalizedAttribute = (attr.getName().length() > 0) ? Character.toUpperCase(attr.getName().charAt(0)) + attr.getName().substring(1) : attr.getName(); @@ -476,20 +477,23 @@ if (realAttribute) { //get the code of the binding (removes braces mostly) String binding = BindingUtils.processDataBindings(attr.getValue()); - //if the attribute binds the value of another component attribute - if (binding != null) { - bindings.append("bindingGroup.addBinding(\n").append("org.jdesktop.beansbinding.Bindings.createAutoBinding(\n" + - "org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ,").append("this").append(",org.jdesktop.beansbinding.ELProperty.create(\"${").append(binding).append("}\"),").append(gmo.getId()).append(",org.jdesktop.beansbinding.BeanProperty.create(\"").append(attr.getName()).append("\")").append("));\n").append("bindingGroup.bind();\n"); + + java.lang.reflect.Method[] methods = clazz.getMethods(); + int m = 0; + //checks if the setter for this attribute exists + while(m < methods.length && !methods[m].getName().equals("set" + capitalizedAttribute)) { + m++; } - else { - java.lang.reflect.Method[] methods = clazz.getMethods(); - int m = 0; - //checks if the setter for this attribute exists - while(m < methods.length && !methods[m].getName().equals("set" + capitalizedAttribute)) - m++; - //if yes - if(m < methods.length) { - //checks if the parameter of the setter is a String + //if yes + if(m < methods.length) { + //if the attribute binds the value of another component attribute + if (binding != null) { + if(!bindings2Generate.containsKey(gmo.getId())) { + bindings2Generate.put(gmo.getId(), new HashMap<String, String>()); + } + bindings2Generate.get(gmo.getId()).put(attr.getName(), binding); + } + else { //checks if the parameter of the setter is a String addQuote = methods[m].getParameterTypes()[0].equals(String.class); //generates the code to set the attribute to object if(creationMethod != null) @@ -502,10 +506,10 @@ layoutDefined = true; } } - else if(log.isErrorEnabled()) { - log.error(attr.getName() + " cannot be set."); - } } + else if(log.isErrorEnabled()) { + log.error(attr.getName() + " cannot be set."); + } } } catch (IntrospectionException ex) { @@ -532,5 +536,103 @@ //return the constraint to put the object into its parent return constraint; } + + private void processCSSAttributes(GuixModelObject gmo, SwingEventHandler seh, Class clazz) { + Map<String, String> cssIds = new HashMap<String, String>(); + Map<String, String> cssStyleClasses = new HashMap<String, String>(); + Map<String, String> cssJavaClasses = new HashMap<String, String>(); + List<AttributeDescriptor> ads = new ArrayList<AttributeDescriptor>(); + for (StyleSheet ss : styleSheets) { + for (Selector sel : ss.getSelectors()) { + if((sel.getId() == null || sel.getId().equals(gmo.getId())) + && (sel.getStyleClass() == null || sel.getStyleClass().equals(gmo.getStyleClass())) + && (sel.getJavaClassName() == null || sel.getJavaClassName().equals(gmo.getClassDescriptor().getName()))) { + boolean realAttribute = true; + if (sel.getPseudoClass() != null && sel.getPseudoClass().startsWith("on") && Character.isUpperCase(sel.getPseudoClass().charAt(2))) { + //the swing event does not start by "on" + String lowerCaseAttribute = (sel.getPseudoClass().length() > 2) ? Character.toLowerCase(sel.getPseudoClass().charAt(2)) + sel.getPseudoClass().substring(3) : sel.getPseudoClass(); + StringBuffer eventAction = new StringBuffer(); + + for (Rule rule : sel.getRules()) { + for (Entry<String, String> entry : rule.getProperties().entrySet()) { + java.lang.reflect.Method[] methods = clazz.getMethods(); + String capitalizedAttribute = (entry.getKey().length() > 0) ? Character.toUpperCase(entry.getKey().charAt(0)) + entry.getKey().substring(1) : entry.getKey(); + int m = 0; + //checks if the setter for this attribute exists + while(m < methods.length && !methods[m].getName().equals("set" + capitalizedAttribute)) { + m++; + } + //if yes + if(m < methods.length) { + //checks if the parameter of the setter is a String + boolean addQuote = methods[m].getParameterTypes()[0].equals(String.class); + //generates the code to set the attribute to object + eventAction.append(gmo.getId()).append(".set").append(capitalizedAttribute).append("(").append(addQuote ? "\"" : "").append(entry.getValue()).append(addQuote ? "\"" : "").append(");\n"); + } + else if(log.isErrorEnabled()) { + log.error(entry.getKey() + " cannot be set."); + } + } + } + try { + realAttribute = !seh.addEvent(clazz, lowerCaseAttribute, eventAction.toString()); + } + catch (IntrospectionException ex) { + if(log.isErrorEnabled()) { + log.error("Error while adding event " + sel.getPseudoClass()); + } + } + } + if(realAttribute) { + if (sel.getId() != null && sel.getId().equals(gmo.getId())) { + for (Rule rule : sel.getRules()) { + for (Entry<String, String> entry : rule.getProperties().entrySet()) { + cssIds.put(entry.getKey(), entry.getValue()); + } + } + } + else if (sel.getStyleClass() != null && sel.getStyleClass().equals(gmo.getStyleClass())) { + for (Rule rule : sel.getRules()) { + for (Entry<String, String> entry : rule.getProperties().entrySet()) { + cssStyleClasses.put(entry.getKey(), entry.getValue()); + } + } + } + else if (sel.getJavaClassName() != null && sel.getJavaClassName().equals(gmo.getClassDescriptor().getName())) { + for (Rule rule : sel.getRules()) { + for (Entry<String, String> entry : rule.getProperties().entrySet()) { + cssJavaClasses.put(entry.getKey(), entry.getValue()); + } + } + } + } + } + } + } + for(Entry<String, String> entry : cssIds.entrySet()) { + ads.add(new AttributeDescriptor(entry.getKey(), entry.getValue())); + } + for(Entry<String, String> entry : cssStyleClasses.entrySet()) { + if(!cssIds.containsKey(entry.getKey())) { + ads.add(new AttributeDescriptor(entry.getKey(), entry.getValue())); + } + } + for(Entry<String, String> entry : cssJavaClasses.entrySet()) { + if(!cssIds.containsKey(entry.getKey()) && !cssStyleClasses.containsKey(entry.getKey())) { + ads.add(new AttributeDescriptor(entry.getKey(), entry.getValue())); + } + } + gmo.getAttributeDescriptors().addAll(ads); + } + + @Override + public void generate(File out) { + throw new UnsupportedOperationException("Not supported yet."); + } + + public Map<String, Map<String, String>> getBindings2Generate() { + return bindings2Generate; + } + } Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/generator/SwingGenerator.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/generator/SwingGenerator.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/generator/SwingGenerator.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -18,10 +18,21 @@ */ package org.nuiton.guix.generator; +import java.beans.PropertyChangeListener; import java.io.File; import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Array; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.swing.JComponent; +import javax.swing.JPanel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.guix.tags.TagHandler; /** * Generates the interface, abstract class and implementation class @@ -34,11 +45,14 @@ /** log */ protected Log log = LogFactory.getLog(SwingGenerator.class); + Map<SwingJavaFileGenerator, File> generators = new HashMap<SwingJavaFileGenerator, File>(); + /** * Generates the interface, abstract class and implementation class * corresponding to the class described by the user. */ - public void generate() { + @Override + public JavaFile generate() { String gmoClassName = gmo.getClassDescriptor().getName(); File out = new File(destDir, gmoClassName + ".java"); File outAbstract = new File(destDir, gmoClassName + "Abstract.java"); @@ -64,8 +78,11 @@ SwingImplementationGenerator simg = new SwingImplementationGenerator(gmo, classes); sing.generate(out); - sacg.generate(outAbstract); + generators.put(sing, out); + JavaFile jf = sacg.generates(); + generators.put(sacg, outAbstract); simg.generate(outImpl); + generators.put(simg, outImpl); if (mainClass) { SwingMainClassGenerator smcg = new SwingMainClassGenerator(gmo); @@ -76,6 +93,10 @@ serializer.startTag("", "bean"); serializer.attribute("", "id", gmoClassName.replace(out.getName().charAt(0), Character.toLowerCase(out.getName().charAt(0)))).attribute("", "class", gmoClassName + "Impl").attribute("", "singleton", "false").endTag("", "bean"); + + setBindingsToGenerate(sacg.getBindings2Generate()); + + return jf; } catch (IllegalArgumentException ex) { log.error(ex); @@ -90,5 +111,274 @@ else if (log.isWarnEnabled()) { log.warn(gmo.getClassDescriptor().getName() + " has already been generated and is up to date."); } + return null; } + + @Override + public void saveFiles() { + for(JavaFileGenerator gen : generators.keySet()) { + gen.saveFile(generators.get(gen)); + } + } + + @Override + public List<Class> generateBindings(StringBuffer dbCreation, StringBuffer dbDeletion, TagHandler prevTh, JavaFile jf, Class clazz, + String[] binding, int i, List<String> alreadyChecked, String methodToInvoke, Map<GuixGenerator,JavaFile> generatedFiles) { + boolean bindingExists = false; + String returnType = null; + String getter = null; + JavaFile nextFile = null; + Class nextClazz = null; + TagHandler th = null; + String model = null; + Class listener = null; + String addMethod = null; + String removeMethod = null; + List<Class> result = new ArrayList<Class>(); + + if(binding[i].endsWith(")")) { + String realMethodName = binding[i].substring(0, binding[i].indexOf("(")); + String realAttributename = null; + if(prevTh != null) { + if(binding[i].startsWith("get")) { + realAttributename = prevTh.getAttrToGenerate(Character.toLowerCase(binding[i].charAt(3)) + binding[i].substring(4, binding[i].indexOf("("))); + if(realAttributename != null) { + realMethodName = "get" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1); + } + } + else if(binding[i].startsWith("is")){ + realAttributename = prevTh.getAttrToGenerate(Character.toLowerCase(binding[i].charAt(2)) + binding[i].substring(3, binding[i].indexOf("("))); + if(realAttributename != null) { + realMethodName = "is" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1); + } + } + } + if(realAttributename == null) { + if(binding[i].startsWith("get")) { + realAttributename = Character.toLowerCase(binding[i].charAt(3)) + binding[i].substring(4, binding[i].indexOf("(")); + } + else if(binding[i].startsWith("is")){ + realAttributename = Character.toLowerCase(binding[i].charAt(2)) + binding[i].substring(3, binding[i].indexOf("(")); + } + else { + realAttributename = binding[i].substring(0, binding[i].indexOf("(")); + } + } + if (jf != null) { + bindingExists = jf.getMethod(realMethodName, null) != null; + if (bindingExists) { + returnType = jf.getMethod(realMethodName, null).getReturnType(); + JavaField f = jf.getField(realAttributename); + if (f != null) { + th = f.getTagHandler(); + } + } + } + else { + try { + clazz.getMethod(realMethodName, null); + returnType = clazz.getMethod(realMethodName, null).getReturnType().getName(); + bindingExists = true; + } + catch (NoSuchMethodException eee) { + bindingExists = false; + } + } + getter = realMethodName + binding[i].substring(binding[i].indexOf("(")); + } + else { + String realAttributename = null; + if(prevTh != null) { + realAttributename = prevTh.getAttrToGenerate(binding[i]); + } + if(realAttributename == null) { + realAttributename = binding[i]; + } + if (jf != null) { + bindingExists = jf.getMethod("get" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1), null) != null || jf.getMethod("is" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1), null) != null; + if (bindingExists) { + returnType = jf.getMethod("get" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1), null) != null ? jf.getMethod("get" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1), null).getReturnType() + : jf.getMethod("is" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1), null).getReturnType(); + } + + getter = jf.getMethod("get" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1), null) != null ? "get" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1) + "()" + : "is" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1) + "()"; + + JavaField f = jf.getField(realAttributename); + if (f != null) { + th = f.getTagHandler(); + } + } + else { + try { + clazz.getMethod("get" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1), null); + returnType = clazz.getMethod("get" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1), null).getReturnType().getName(); + getter = "get" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1) + "()"; + bindingExists = true; + } + catch (NoSuchMethodException eee) { + try { + clazz.getMethod("is" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1), null); + returnType = clazz.getMethod("is" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1), null).getReturnType().getName(); + getter = "is" + Character.toUpperCase(realAttributename.charAt(0)) + realAttributename.substring(1) + "()"; + bindingExists = true; + } + catch (NoSuchMethodException eee2) { + bindingExists = false; + } + } + } + } + if(bindingExists) { + if(th != null) { + String getterWoBraces = getter.substring(0, getter.indexOf("(")); + if(th.hasEventInfosAboutMethod(getterWoBraces)) { + model = th.getEventInfosModelName(getterWoBraces); + listener = th.getEventInfosListenerClass(getterWoBraces); + addMethod = th.getEventInfosAddListenerMethodName(getterWoBraces); + removeMethod = th.getEventInfosRemoveListenerMethodName(getterWoBraces); + } + else { + listener = PropertyChangeListener.class; + addMethod = "addPropertyChangeListener"; + removeMethod = "removePropertyChangeListener"; + } + } + else if(i == binding.length - 1 && prevTh != null) { + String getterWoBraces = getter.substring(0, getter.indexOf("(")); + if(prevTh.hasEventInfosAboutMethod(getterWoBraces)) { + model = prevTh.getEventInfosModelName(getterWoBraces); + listener = prevTh.getEventInfosListenerClass(getterWoBraces); + addMethod = prevTh.getEventInfosAddListenerMethodName(getterWoBraces); + removeMethod = prevTh.getEventInfosRemoveListenerMethodName(getterWoBraces); + } + else { + listener = PropertyChangeListener.class; + addMethod = "addPropertyChangeListener"; + removeMethod = "removePropertyChangeListener"; + } + } + else { + listener = PropertyChangeListener.class; + addMethod = "addPropertyChangeListener"; + removeMethod = "removePropertyChangeListener"; + } + + dbCreation.append("if("); + dbDeletion.append("if("); + if(alreadyChecked != null && !alreadyChecked.isEmpty()) { + for(int j = 0 ; j < alreadyChecked.size() ; j++) { + dbCreation.append(alreadyChecked.get(0)); + dbDeletion.append(alreadyChecked.get(0)); + for(int k = 1 ; k <= j ; k++) { + dbCreation.append(".").append(alreadyChecked.get(k)); + dbDeletion.append(".").append(alreadyChecked.get(k)); + } + dbCreation.append(" != null && "); + dbDeletion.append(" != null && "); + } + + if(binding.length > alreadyChecked.size() + 1) { + for(int j = 0 ; j < alreadyChecked.size() ; j++) { + dbCreation.append(alreadyChecked.get(j)).append("."); + dbDeletion.append(alreadyChecked.get(j)).append("."); + } + dbCreation.append(getter).append(" != null"); + dbDeletion.append(getter).append(" != null"); + } + else { + dbCreation.delete(dbCreation.length() - 4, dbCreation.length()); + dbDeletion.delete(dbDeletion.length() - 4, dbDeletion.length()); + } + } + else { + dbCreation.append(getter).append(" != null"); + dbDeletion.append(getter).append(" != null"); + } + dbCreation.append(") {\n"); + dbDeletion.append(") {\n"); + + if(alreadyChecked != null) { + for(int j = 0 ; j < alreadyChecked.size() ; j++) { + dbCreation.append(alreadyChecked.get(j)).append("."); + dbDeletion.append(alreadyChecked.get(j)).append("."); + } + } + if(model != null) { + dbCreation.append("get").append(Character.toUpperCase(model.charAt(0))) + .append(model.substring(1)).append("()"); + dbDeletion.append("get").append(Character.toUpperCase(model.charAt(0))) + .append(model.substring(1)).append("()"); + } + else { + dbCreation.append(getter); + dbDeletion.append(getter); + } +// dbCreation.append(".").append(addMethod).append("((") +// .append(listener.getName()).append(") org.nuiton.guix.runtime.Util.getEventListener(") +// .append(listener.getName()).append(".class,this,\"onChangeFrom") +// .append(methodToInvoke).append("\"));\n}\n"); +// dbDeletion.append(".").append(removeMethod).append("((") +// .append(listener.getName()).append(") org.nuiton.guix.runtime.Util.getEventListener(") +// .append(listener.getName()).append(".class,this,\"onChangeFrom") +// .append(methodToInvoke).append("\"));\n}\n"); + + dbCreation.append(".").append(addMethod).append("(new ").append(listener.getName()).append("() {\n"); + dbDeletion.append(".").append(removeMethod).append("(new ").append(listener.getName()).append("() {\n"); + for(Method m : listener.getMethods()) { + StringBuffer sb = new StringBuffer(); + for(Annotation a : m.getDeclaredAnnotations()) { + dbCreation.append(a.toString()).append("\n"); + } + //add the method that handles the event + sb.append("public ") + .append(m.getReturnType().getCanonicalName()) + .append(" ") + .append(m.getName()) + .append("("); + for(int n = 0 ; n < m.getParameterTypes().length ; n++) { + sb.append(m.getParameterTypes()[n].getCanonicalName()) + .append(" arg") + .append(n) + .append(", "); + } + sb.delete(sb.length() - 2, sb.length()) + .append(")") + .append(" {\n") + .append("onChangeFrom").append(methodToInvoke) + .append("();\n}\n"); + dbCreation.append(sb); + dbDeletion.append(sb); + } + dbCreation.append("});\n}\n"); + dbDeletion.append("});\n}\n"); + + try { + nextClazz = Class.forName(returnType); + } + catch (ClassNotFoundException eee) { + for(JavaFile javaFile : generatedFiles.values()) { + if(returnType.equals(javaFile.getPackageName() + "." + javaFile.getClassName())) { + nextFile = javaFile; + break; + } + } + } + if(alreadyChecked == null){ + alreadyChecked = new ArrayList<String>(); + } + alreadyChecked.add(getter); + if(i + 1 < binding.length) { + result.addAll(generateBindings(dbCreation, dbDeletion, th, nextFile, nextClazz, binding, i+1, alreadyChecked, methodToInvoke, generatedFiles)); + } + if(!result.contains(listener)) { + result.add(listener); + } + } + else if(log.isErrorEnabled()) { + log.error("unable to bind " + binding[i]); + } + return result; + } + } Deleted: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ApplicationHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ApplicationHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ApplicationHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -1,22 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package org.nuiton.guix.tags.swing; - -/** - * - * @author kevin - */ -public class ApplicationHandler extends org.nuiton.guix.tags.ApplicationHandler { - - public ApplicationHandler() { - super(); - } - - public Class getClassToGenerate() { - return javax.swing.JFrame.class; - } - -} Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ButtonHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ButtonHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ButtonHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -9,8 +9,15 @@ * * @author kevin */ -public class ButtonHandler extends org.nuiton.guix.tags.ButtonHandler { +public class ButtonHandler extends ComponentHandler { + public ButtonHandler() { + super(); + attrMap.put("onClick", "onActionPerformed"); + attrMap.put("onLostFocus", "onFocusLost"); + attrMap.put("onFocus", "onFocusGained"); + } + @Override public Class getClassToGenerate() { return javax.swing.JButton.class; Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/CellHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/CellHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/CellHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -18,6 +18,7 @@ */ package org.nuiton.guix.tags.swing; +import org.nuiton.guix.model.AttributeDescriptor; import org.nuiton.guix.model.GuixModelObject; /** @@ -25,8 +26,19 @@ * * @author kevin */ -public class CellHandler extends org.nuiton.guix.tags.CellHandler { +public class CellHandler extends TableHandler { + /** id of the object contained by the cell */ + private String id = null; + /** number of columns of the cell */ + private int columns = 1; + /** number of rows of the cell */ + private int rows = 1; + /** index of the row */ + private int row = -1; + /** index of the column */ + private int column = -1; + /** * Constructor */ @@ -40,7 +52,43 @@ * @param cell the GuixModelObject which represents the cell */ public CellHandler(GuixModelObject cell) { - super(cell); + assert cell.getChildren().size() == 1; + id = cell.getChildren().get(0).getId(); + for (AttributeDescriptor attr : cell.getAttributeDescriptors()) { + if (attr.getName().equals("columns")) { + columns = Integer.valueOf(attr.getValue()); + } + else if (attr.getName().equals("column")) { + column = Integer.valueOf(attr.getValue()); + } + else if (attr.getName().equals("rows")) { + rows = Integer.valueOf(attr.getValue()); + } + else if (attr.getName().equals("weightx")) { + weightx = Double.valueOf(attr.getValue()); + } + else if (attr.getName().equals("weighty")) { + weighty = Double.valueOf(attr.getValue()); + } + else if (attr.getName().equals("ipadx")) { + ipadx = Integer.valueOf(attr.getValue()); + } + else if (attr.getName().equals("ipady")) { + ipady = Integer.valueOf(attr.getValue()); + } + else if (attr.getName().equals("halign")) { + horizontalAlignment = getHalign(attr.getValue()); + } + else if (attr.getName().equals("valign")) { + verticalAlignment = getValign(attr.getValue()); + } + else if (attr.getName().equals("fill")) { + fill = attr.getValue(); + } + else if (attr.getName().equals("insets")) { + insets = attr.getValue(); + } + } } /** @@ -50,11 +98,81 @@ * @param row the row which contains the cell */ public CellHandler(GuixModelObject cell, RowHandler row) { - super(cell,row); + this(cell); + //if the attributes that the row contains too have not been defined by the user within the cell, + //but have been defined in the row (or the table), set them + if (horizontalAlignment == null) { + horizontalAlignment = row.getHorizontalAlignment() == null ? TableHandler.DEFAULT_HORIZONTAL_ALIGNMENT : row.getHorizontalAlignment(); + } + if (verticalAlignment == null) { + verticalAlignment = row.getVerticalAlignment() == null ? TableHandler.DEFAULT_VERTICAL_ALIGNMENT : row.getVerticalAlignment(); + } + if (fill == null) { + fill = row.getFill() == null ? TableHandler.DEFAULT_FILL : row.getFill(); + } + if (insets == null) { + insets = row.getInsets() == null ? TableHandler.DEFAULT_INSETS : row.getInsets(); + } + if (ipadx == null) { + ipadx = row.getIpadx() == null ? TableHandler.DEFAULT_IPADX : row.getIpadx(); + } + if (ipady == null) { + ipady = row.getIpady() == null ? TableHandler.DEFAULT_IPADY : row.getIpady(); + } + if (weightx == null) { + weightx = row.getWeightx() == null ? TableHandler.DEFAULT_WEIGHTX : row.getWeightx(); + } + if (weighty == null) { + weighty = row.getWeighty() == null ? TableHandler.DEFAULT_WEIGHTY : row.getWeighty(); + } + if(this.row == -1) { + this.row = row.getRow() < 0 ? -1 : row.getRow(); + } } @Override public Class getClassToGenerate() { return null; } + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getColumn() { + return column; + } + + public void setColumn(int column) { + this.column = column; + } + + public int getColumns() { + return columns; + } + + public void setColumns(int columns) { + this.columns = columns; + } + + public int getRow() { + return row; + } + + public void setRow(int row) { + this.row = row; + } + + public int getRows() { + return rows; + } + + public void setRows(int rows) { + this.rows = rows; + } } Added: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ComponentHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ComponentHandler.java (rev 0) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ComponentHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -0,0 +1,39 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.nuiton.guix.tags.swing; +import java.awt.event.ComponentListener; +import java.awt.event.FocusListener; +import org.nuiton.guix.tags.DefaultTagHandler; + +/** + * + * @author kevin + */ +public abstract class ComponentHandler extends DefaultTagHandler { + + public ComponentHandler() { + super(); + configureProxyEventInfo(); + attrMap.put("onLostFocus", "onFocusLost"); + attrMap.put("onFocus", "onFocusGained"); + } + + @Override + protected void configureProxyEventInfo() { + super.configureProxyEventInfo(); + addProxyEventInfo("hasFocus", FocusListener.class); + addProxyEventInfo("isVisible", ComponentListener.class); + addProxyEventInfo("getBounds", ComponentListener.class); + addProxyEventInfo("getLocation", ComponentListener.class); + addProxyEventInfo("getLocationOnScreen", ComponentListener.class); + addProxyEventInfo("getSize", ComponentListener.class); + addProxyEventInfo("getX", ComponentListener.class); + addProxyEventInfo("getY", ComponentListener.class); + addProxyEventInfo("getWidth", ComponentListener.class); + addProxyEventInfo("getHeight", ComponentListener.class); + } + +} Added: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/FrameHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/FrameHandler.java (rev 0) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/FrameHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -0,0 +1,22 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.nuiton.guix.tags.swing; + +/** + * + * @author kevin + */ +public class FrameHandler extends ComponentHandler { + + public FrameHandler() { + super(); + } + + public Class getClassToGenerate() { + return javax.swing.JFrame.class; + } + +} Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/LabelHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/LabelHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/LabelHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -9,7 +9,7 @@ * * @author kevin */ -public class LabelHandler extends org.nuiton.guix.tags.LabelHandler { +public class LabelHandler extends ComponentHandler { /** * Constructor Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/MenuBarHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/MenuBarHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/MenuBarHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -9,7 +9,7 @@ * * @author kevin */ -public class MenuBarHandler extends org.nuiton.guix.tags.MenuBarHandler { +public class MenuBarHandler extends ComponentHandler { /** * Constructor Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/MenuHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/MenuHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/MenuHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -4,12 +4,13 @@ */ package org.nuiton.guix.tags.swing; +import javax.swing.event.MenuListener; /** * * @author kevin */ -public class MenuHandler extends org.nuiton.guix.tags.MenuHandler { +public class MenuHandler extends ComponentHandler { /** * Constructor @@ -23,4 +24,9 @@ return javax.swing.JMenu.class; } + @Override + protected void configureProxyEventInfo() { + super.configureProxyEventInfo(); + addProxyEventInfo("isSelected", MenuListener.class); + } } Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/MenuItemHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/MenuItemHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/MenuItemHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -9,13 +9,14 @@ * * @author kevin */ -public class MenuItemHandler extends org.nuiton.guix.tags.MenuItemHandler { +public class MenuItemHandler extends ComponentHandler { /** * Constructor */ public MenuItemHandler() { super(); + attrMap.put("action", "onActionPerformed"); } @Override Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/PanelHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/PanelHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/PanelHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -9,7 +9,7 @@ * * @author kevin */ -public class PanelHandler extends org.nuiton.guix.tags.PanelHandler { +public class PanelHandler extends ComponentHandler { /** * Constructor Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/RowHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/RowHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/RowHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -18,6 +18,7 @@ */ package org.nuiton.guix.tags.swing; +import org.nuiton.guix.model.AttributeDescriptor; import org.nuiton.guix.model.GuixModelObject; /** @@ -25,7 +26,10 @@ * * @author kevin */ -public class RowHandler extends org.nuiton.guix.tags.RowHandler { +public class RowHandler extends TableHandler { + + /** index of the row */ + private int row = -1; /** * Constructor @@ -34,25 +38,87 @@ super(); } - /** + /** * Constructor * * @param row the GuixModelObject which represents the row */ - public RowHandler(GuixModelObject row) { - super(row); - } + public RowHandler(GuixModelObject row) { + for (AttributeDescriptor attr : row.getAttributeDescriptors()) { + if (attr.getName().equals("row")) { + this.row = Integer.valueOf(attr.getValue()); + } + else if (attr.getName().equals("weightx")) { + weightx = Double.valueOf(attr.getValue()); + } + else if (attr.getName().equals("weighty")) { + weighty = Double.valueOf(attr.getValue()); + } + else if (attr.getName().equals("ipadx")) { + ipadx = Integer.valueOf(attr.getValue()); + } + else if (attr.getName().equals("ipady")) { + ipady = Integer.valueOf(attr.getValue()); + } + else if (attr.getName().equals("halign")) { + horizontalAlignment = getHalign(attr.getValue()); + } + else if (attr.getName().equals("valign")) { + verticalAlignment = getValign(attr.getValue()); + } + else if (attr.getName().equals("fill")) { + fill = attr.getValue(); + } + else if (attr.getName().equals("insets")) { + insets = attr.getValue(); + } + } + } - /** + /** * Constructor * * @param row the GuixModelObject which represents the row * @param table the table which contains the row */ - public RowHandler(GuixModelObject row, TableHandler table) { - super(row, table); + public RowHandler(GuixModelObject row, TableHandler table) { + this(row); + //if the attributes that the table contains too have not been defined by the user within the row, + //but have been defined in the table, set them + if (horizontalAlignment == null) { + horizontalAlignment = table.getHorizontalAlignment() == null ? TableHandler.DEFAULT_HORIZONTAL_ALIGNMENT : table.getHorizontalAlignment(); + } + if (verticalAlignment == null) { + verticalAlignment = table.getVerticalAlignment() == null ? TableHandler.DEFAULT_VERTICAL_ALIGNMENT : table.getVerticalAlignment(); + } + if (fill == null) { + fill = table.getFill() == null ? TableHandler.DEFAULT_FILL : table.getFill(); + } + if (insets == null) { + insets = table.getInsets() == null ? TableHandler.DEFAULT_INSETS : table.getInsets(); + } + if (ipadx == null) { + ipadx = table.getIpadx() == null ? TableHandler.DEFAULT_IPADX : table.getIpadx(); + } + if (ipady == null) { + ipady = table.getIpady() == null ? TableHandler.DEFAULT_IPADY : table.getIpady(); + } + if (weightx == null) { + weightx = table.getWeightx() == null ? TableHandler.DEFAULT_WEIGHTX : table.getWeightx(); + } + if (weighty == null) { + weighty = table.getWeighty() == null ? TableHandler.DEFAULT_WEIGHTY : table.getWeighty(); + } } + public int getRow() { + return row; + } + + public void setRow(int row) { + this.row = row; + } + @Override public Class getClassToGenerate() { return null; Added: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/SelectableButtonHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/SelectableButtonHandler.java (rev 0) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/SelectableButtonHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -0,0 +1,24 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.nuiton.guix.tags.swing; +import javax.swing.event.ChangeListener; + +/** + * + * @author kevin + */ +public class SelectableButtonHandler extends ButtonHandler { + + public SelectableButtonHandler() { + super(); + } + + @Override + public void configureProxyEventInfo() { + super.configureProxyEventInfo(); + addProxyEventInfo("isSelected", ChangeListener.class, "model"); + } +} Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TabPanelHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TabPanelHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TabPanelHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -4,12 +4,14 @@ */ package org.nuiton.guix.tags.swing; +import java.awt.event.ContainerListener; +import javax.swing.event.ChangeListener; /** * * @author kevin */ -public class TabPanelHandler extends org.nuiton.guix.tags.TabPanelHandler { +public class TabPanelHandler extends ComponentHandler { /** * Constructor @@ -23,4 +25,12 @@ return javax.swing.JTabbedPane.class; } + @Override + public void configureProxyEventInfo() { + super.configureProxyEventInfo(); + addProxyEventInfo("getSelectedIndex", ChangeListener.class); + addProxyEventInfo("getSelectedComponent", ChangeListener.class); + addProxyEventInfo("getTabCount", ContainerListener.class); + } + } Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TableHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TableHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TableHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -22,6 +22,7 @@ import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.guix.model.AttributeDescriptor; import org.nuiton.guix.model.GuixModelObject; /** @@ -29,17 +30,41 @@ * * @author kevin */ -public class TableHandler extends org.nuiton.guix.tags.TableHandler { +public class TableHandler extends PanelHandler { private static Log log = LogFactory.getLog(TableHandler.class); public static String DEFAULT_ANCHOR = "java.awt.GridBagConstraints.FIRST_LINE_START"; + protected enum VerticalAlignment { + + ALIGN_TOP, ALIGN_MIDDLE, ALIGN_BOTTOM + } + protected enum HorizontalAlignment { + + ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT, ALIGN_DEFAULT + } + public static final String DEFAULT_INSETS = "3, 3, 3, 3"; + public static final HorizontalAlignment DEFAULT_HORIZONTAL_ALIGNMENT = HorizontalAlignment.ALIGN_DEFAULT; + public static final VerticalAlignment DEFAULT_VERTICAL_ALIGNMENT = VerticalAlignment.ALIGN_TOP; + public static final String DEFAULT_FILL = "java.awt.GridBagConstraints.BOTH"; + public static final Integer DEFAULT_IPADX = 1; + public static final Integer DEFAULT_IPADY = 1; + public static final Double DEFAULT_WEIGHTX = 0.0; + public static final Double DEFAULT_WEIGHTY = 0.0; + protected Double weightx = null; + protected Double weighty = null; + protected Integer ipadx = null; + protected Integer ipady = null; + protected HorizontalAlignment horizontalAlignment = null; + protected VerticalAlignment verticalAlignment = null; + protected String fill = null; + protected String insets = null; + /** * Constructor */ public TableHandler() { - super(); } /** @@ -48,8 +73,136 @@ * @param table the GuixModelObject which represents the table */ public TableHandler(GuixModelObject table) { - super(table); + + for (AttributeDescriptor attr : table.getAttributeDescriptors()) { + if (attr.getName().equals("weightx")) { + weightx = Double.valueOf(attr.getValue()); + } + else if (attr.getName().equals("weighty")) { + weighty = Double.valueOf(attr.getValue()); + } + else if (attr.getName().equals("ipadx")) { + ipadx = Integer.valueOf(attr.getValue()); + } + else if (attr.getName().equals("ipady")) { + ipady = Integer.valueOf(attr.getValue()); + } + else if (attr.getName().equals("halign")) { + horizontalAlignment = getHalign(attr.getValue()); + if (horizontalAlignment == null) { + if (log.isErrorEnabled()) { + log.error(table.getId() + "'s halign attribute has a wrong value : " + attr.getValue()); + } + horizontalAlignment = HorizontalAlignment.ALIGN_DEFAULT; + } + } + else if (attr.getName().equals("valign")) { + verticalAlignment = getValign(attr.getValue()); + if (verticalAlignment == null) { + if (log.isErrorEnabled()) { + log.error(table.getId() + "'s halign attribute has a wrong value : " + attr.getValue()); + } + verticalAlignment = VerticalAlignment.ALIGN_TOP; + } + } + else if (attr.getName().equals("fill")) { + fill = attr.getValue(); + } + else if (attr.getName().equals("insets")) { + insets = attr.getValue(); + } + } } + + public HorizontalAlignment getHorizontalAlignment() { + return horizontalAlignment; + } + + public void setHorizontalAlignment(HorizontalAlignment horizontalAlignment) { + this.horizontalAlignment = horizontalAlignment; + } + + public VerticalAlignment getVerticalAlignment() { + return verticalAlignment; + } + + public void setVerticalAlignment(VerticalAlignment verticalAlignment) { + this.verticalAlignment = verticalAlignment; + } + + public String getFill() { + return fill; + } + + public void setFill(String fill) { + this.fill = fill; + } + + public String getInsets() { + return insets; + } + + public void setInsets(String insets) { + this.insets = insets; + } + + public Integer getIpadx() { + return ipadx; + } + + public void setIpadx(Integer ipadx) { + this.ipadx = ipadx; + } + + public Integer getIpady() { + return ipady; + } + + public void setIpady(Integer ipady) { + this.ipady = ipady; + } + + public Double getWeightx() { + return weightx; + } + + public void setWeightx(Double weightx) { + this.weightx = weightx; + } + + public Double getWeighty() { + return weighty; + } + + public void setWeighty(Double weighty) { + this.weighty = weighty; + } + + public HorizontalAlignment getHalign(String halign) { + if (halign.equalsIgnoreCase("left")) { + return HorizontalAlignment.ALIGN_LEFT; + } + if (halign.equalsIgnoreCase("right")) { + return HorizontalAlignment.ALIGN_RIGHT; + } + if (halign.equalsIgnoreCase("center")) { + return HorizontalAlignment.ALIGN_CENTER; + } + return null; + } + + public VerticalAlignment getValign(String valign) { + if (valign.equalsIgnoreCase("top")) { + return VerticalAlignment.ALIGN_TOP; + } + if (valign.equalsIgnoreCase("bottom")) { + return VerticalAlignment.ALIGN_BOTTOM; + } + if (valign.equalsIgnoreCase("middle")) { + return VerticalAlignment.ALIGN_MIDDLE; + } + return null; + } /** * Creates a cell with the right column and generates the code to add it to the table @@ -208,9 +361,4 @@ return null; } - @Override - public Class getClassToGenerate() { - return javax.swing.JPanel.class; - } - } Added: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TextComponentHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TextComponentHandler.java (rev 0) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TextComponentHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -0,0 +1,24 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.nuiton.guix.tags.swing; +import javax.swing.event.DocumentListener; + +/** + * + * @author kevin + */ +public abstract class TextComponentHandler extends ComponentHandler { + + public TextComponentHandler() { + super(); + } + + @Override + public void configureProxyEventInfo() { + super.configureProxyEventInfo(); + addProxyEventInfo("getText", DocumentListener.class, "document"); + } +} Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TextFieldHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TextFieldHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/TextFieldHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -9,7 +9,7 @@ * * @author kevin */ -public class TextFieldHandler extends org.nuiton.guix.tags.TextFieldHandler { +public class TextFieldHandler extends TextComponentHandler { /** * Constructor Modified: trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ToggleButtonHandler.java =================================================================== --- trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ToggleButtonHandler.java 2009-07-22 13:07:30 UTC (rev 1502) +++ trunk/guix-compiler-swing/src/main/java/org/nuiton/guix/tags/swing/ToggleButtonHandler.java 2009-07-22 13:08:00 UTC (rev 1503) @@ -4,16 +4,20 @@ */ package org.nuiton.guix.tags.swing; +import javax.swing.event.ChangeListener; /** * * @author kevin */ -public class ToggleButtonHandler extends org.nuiton.guix.tags.ToggleButtonHandler { +public class ToggleButtonHandler extends SelectableButtonHandler { + public ToggleButtonHandler() { + super(); + } + @Override public Class getClassToGenerate() { return javax.swing.JToggleButton.class; } - }