Jaxx-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
December 2008
- 2 participants
- 69 discussions
30 Dec '08
Author: tchemit
Date: 2008-12-30 08:51:47 +0000 (Tue, 30 Dec 2008)
New Revision: 1100
Added:
lutinjaxx/branches/before-lutinjaxx-1.0/
Log:
mise en branche pour refractorer le compilateur jaxx
Copied: lutinjaxx/branches/before-lutinjaxx-1.0 (from rev 1099, lutinjaxx/trunk)
1
0
[Buix-commits] r1099 - lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/css
by tchemit@users.labs.libre-entreprise.org 28 Dec '08
by tchemit@users.labs.libre-entreprise.org 28 Dec '08
28 Dec '08
Author: tchemit
Date: 2008-12-28 16:06:56 +0000 (Sun, 28 Dec 2008)
New Revision: 1099
Modified:
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/css/DataBinding.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/css/Pseudoclasses.java
Log:
clean code
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/css/DataBinding.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/css/DataBinding.java 2008-12-28 16:03:04 UTC (rev 1098)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/css/DataBinding.java 2008-12-28 16:06:56 UTC (rev 1099)
@@ -21,7 +21,7 @@
@Override
public boolean equals(Object o) {
- return (o instanceof DataBinding && ((DataBinding) o).getId().equals(getId()));
+ return o instanceof DataBinding && ((DataBinding) o).getId().equals(getId());
}
@Override
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/css/Pseudoclasses.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/css/Pseudoclasses.java 2008-12-28 16:03:04 UTC (rev 1098)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/css/Pseudoclasses.java 2008-12-28 16:06:56 UTC (rev 1099)
@@ -38,15 +38,17 @@
@Override
public boolean equals(Object o) {
- if (!(o instanceof PropertyValue))
+ if (!(o instanceof PropertyValue)) {
return false;
+ }
PropertyValue value = (PropertyValue) o;
- if (value.getId() != getId())
+ if (value.getId() != getId()) {
return false;
- if (value.getValue() == null)
+ }
+ if (value.getValue() == null) {
return getValue() == null;
- else
- return value.getValue().equals(getValue());
+ }
+ return value.getValue().equals(getValue());
}
@Override
1
0
[Buix-commits] r1098 - in lutinjaxx/trunk/jaxx-core/src: main/java/jaxx/compiler main/java/jaxx/introspection main/java/jaxx/tags/swing test/java/jaxx/junit
by tchemit@users.labs.libre-entreprise.org 28 Dec '08
by tchemit@users.labs.libre-entreprise.org 28 Dec '08
28 Dec '08
Author: tchemit
Date: 2008-12-28 16:03:04 +0000 (Sun, 28 Dec 2008)
New Revision: 1098
Modified:
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/CompiledObject.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/DataSource.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/introspection/JAXXIntrospector.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/introspection/JAXXPropertyDescriptor.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/tags/swing/JTextComponentHandler.java
lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/junit/ClassDescriptorTest.java
Log:
generify ClassDescriptor
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/CompiledObject.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/CompiledObject.java 2008-12-28 15:44:40 UTC (rev 1097)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/CompiledObject.java 2008-12-28 16:03:04 UTC (rev 1098)
@@ -295,9 +295,9 @@
String methodName = JAXXCompiler.capitalize(property);
try {
- MethodDescriptor methodDescriptor = overrideType.getMethodDescriptor("get" + methodName, new ClassDescriptor[0]);
+ MethodDescriptor methodDescriptor = overrideType.getMethodDescriptor("get" + methodName);
if (methodDescriptor != null) {
- if (overrideType.getMethodDescriptor("set" + methodName, new ClassDescriptor[]{methodDescriptor.getReturnType()}) != null) {
+ if (overrideType.getMethodDescriptor("set" + methodName, methodDescriptor.getReturnType()) != null) {
// handle cases where object is overridden to be a different class
result = javaCode;
}
@@ -424,8 +424,8 @@
ClassDescriptor descriptor = ClassDescriptorLoader.getClassDescriptor(getObjectClass().getName());
String listenerClassName = addMethod.getParameterTypes()[0].getName();
ClassDescriptor listenerDescriptor = ClassDescriptorLoader.getClassDescriptor(listenerClassName);
- MethodDescriptor addMethodDescriptor = descriptor.getMethodDescriptor(addMethod.getName(), new ClassDescriptor[]{listenerDescriptor});
- MethodDescriptor listenerMethodDescriptor = listenerDescriptor.getMethodDescriptor(listenerMethod.getName(), new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(listenerMethod.getParameterTypes()[0].getName())});
+ MethodDescriptor addMethodDescriptor = descriptor.getMethodDescriptor(addMethod.getName(), listenerDescriptor);
+ MethodDescriptor listenerMethodDescriptor = listenerDescriptor.getMethodDescriptor(listenerMethod.getName(), ClassDescriptorLoader.getClassDescriptor(listenerMethod.getParameterTypes()[0].getName()));
addEventHandler(eventId, addMethodDescriptor, listenerMethodDescriptor, code, compiler);
}
catch (Exception e) {
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/DataSource.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/DataSource.java 2008-12-28 15:44:40 UTC (rev 1097)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/DataSource.java 2008-12-28 16:03:04 UTC (rev 1098)
@@ -310,7 +310,7 @@
}
String methodName = lastNode.substring(dotPos + 1).trim();
try {
- MethodDescriptor method = contextClass.getMethodDescriptor(methodName, new ClassDescriptor[0]);
+ MethodDescriptor method = contextClass.getMethodDescriptor(methodName);
trackMemberIfPossible(objectCode, contextClass, method.getName(), true, listenerId);
return method.getReturnType();
}
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/introspection/JAXXIntrospector.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/introspection/JAXXIntrospector.java 2008-12-28 15:44:40 UTC (rev 1097)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/introspection/JAXXIntrospector.java 2008-12-28 16:03:04 UTC (rev 1098)
@@ -69,8 +69,8 @@
try {
ClassDescriptor typeDescriptor = ClassDescriptorLoader.getClassDescriptor(type.getName(), type.getClassLoader());
JAXXPropertyDescriptor propertyDescriptor = new JAXXPropertyDescriptor(classDescriptor, explicitProperty.getName(),
- readMethod != null ? classDescriptor.getMethodDescriptor(readMethod.getName(), new ClassDescriptor[0]) : null,
- writeMethod != null ? classDescriptor.getMethodDescriptor(writeMethod.getName(), new ClassDescriptor[]{typeDescriptor}) : null);
+ readMethod != null ? classDescriptor.getMethodDescriptor(readMethod.getName()) : null,
+ writeMethod != null ? classDescriptor.getMethodDescriptor(writeMethod.getName(), typeDescriptor) : null);
propertyDescriptor.setBound(explicitProperty.isBound());
Enumeration<String> attributeNames = explicitProperty.attributeNames();
while (attributeNames.hasMoreElements()) {
@@ -92,7 +92,7 @@
// does the same)
boolean propertyChangeSource;
try {
- classDescriptor.getMethodDescriptor("addPropertyChangeListener", new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(PropertyChangeListener.class)});
+ classDescriptor.getMethodDescriptor("addPropertyChangeListener", ClassDescriptorLoader.getClassDescriptor(PropertyChangeListener.class));
propertyChangeSource = true;
}
catch (NoSuchMethodException e) {
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/introspection/JAXXPropertyDescriptor.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/introspection/JAXXPropertyDescriptor.java 2008-12-28 15:44:40 UTC (rev 1097)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/introspection/JAXXPropertyDescriptor.java 2008-12-28 16:03:04 UTC (rev 1098)
@@ -39,11 +39,11 @@
public MethodDescriptor getReadMethodDescriptor() {
if (readMethod == null) {
try {
- readMethod = getClassDescriptor().getMethodDescriptor("get" + capitalize(getName()), new ClassDescriptor[0]);
+ readMethod = getClassDescriptor().getMethodDescriptor("get" + capitalize(getName()));
}
catch (NoSuchMethodException e) {
try {
- readMethod = getClassDescriptor().getMethodDescriptor("is" + capitalize(getName()), new ClassDescriptor[0]);
+ readMethod = getClassDescriptor().getMethodDescriptor("is" + capitalize(getName()));
}
catch (NoSuchMethodException e2) {
}
@@ -59,7 +59,7 @@
String methodName = "set" + capitalize(getName());
MethodDescriptor read = getReadMethodDescriptor();
if (read != null) {
- writeMethod = getClassDescriptor().getMethodDescriptor(methodName, new ClassDescriptor[]{read.getReturnType()});
+ writeMethod = getClassDescriptor().getMethodDescriptor(methodName, read.getReturnType());
} else {
throw new CompilerException("Internal error: requesting 'set' method for property of unknown type: '" + getName() + "' (in " + getClassDescriptor() + ")");
}
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/tags/swing/JTextComponentHandler.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/tags/swing/JTextComponentHandler.java 2008-12-28 15:44:40 UTC (rev 1097)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/tags/swing/JTextComponentHandler.java 2008-12-28 16:03:04 UTC (rev 1098)
@@ -29,7 +29,7 @@
protected void setDefaults(CompiledObject object, Element tag, JAXXCompiler compiler) throws CompilerException {
super.setDefaults(object, tag, compiler);
try {
- object.getObjectClass().getMethodDescriptor("setColumns", new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(int.class)});
+ object.getObjectClass().getMethodDescriptor("setColumns", ClassDescriptorLoader.getClassDescriptor(int.class));
setAttribute(object, "columns", String.valueOf(DEFAULT_COLUMNS), false, compiler);
}
catch (NoSuchMethodException e) {
Modified: lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/junit/ClassDescriptorTest.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/junit/ClassDescriptorTest.java 2008-12-28 15:44:40 UTC (rev 1097)
+++ lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/junit/ClassDescriptorTest.java 2008-12-28 16:03:04 UTC (rev 1098)
@@ -11,7 +11,7 @@
@Test
public void testGetClassDescriptor() throws Exception {
- ClassDescriptor object = ClassDescriptorLoader.getClassDescriptor("jaxx.runtime.swing.navigation.NavigationTreeModel.NavigationTreeNode");
+ ClassDescriptorLoader.getClassDescriptor("jaxx.runtime.swing.navigation.NavigationTreeModel.NavigationTreeNode");
}
@@ -19,11 +19,11 @@
@Test
public void testBuiltInClassName() throws ClassNotFoundException, NoSuchMethodException {
ClassDescriptor object = ClassDescriptorLoader.getClassDescriptor("java.lang.Object");
- MethodDescriptor toString = object.getMethodDescriptor("toString", new ClassDescriptor[0]);
+ MethodDescriptor toString = object.getMethodDescriptor("toString");
assertEquals(toString.getName(), "toString");
assertEquals(toString.getParameterTypes().length, 0);
- MethodDescriptor equals = object.getMethodDescriptor("equals", new ClassDescriptor[]{object});
+ MethodDescriptor equals = object.getMethodDescriptor("equals", object);
assertEquals(equals.getName(), "equals");
assertEquals(equals.getParameterTypes().length, 1);
assertEquals(equals.getParameterTypes()[0], object);
@@ -39,7 +39,7 @@
@Test
public void testUserClassName() throws ClassNotFoundException, NoSuchMethodException {
ClassDescriptor me = ClassDescriptorLoader.getClassDescriptor("jaxx.junit.ClassDescriptorTest", getClass().getClassLoader());
- MethodDescriptor testUserClassName = me.getMethodDescriptor("testUserClassName", new ClassDescriptor[0]);
+ MethodDescriptor testUserClassName = me.getMethodDescriptor("testUserClassName");
assertEquals(testUserClassName.getName(), "testUserClassName");
assertEquals(testUserClassName.getParameterTypes().length, 0);
}
1
0
[Buix-commits] r1097 - in lutinjaxx/trunk/jaxx-core: . src/main/java/jaxx/compiler src/main/java/jaxx/css src/main/java/jaxx/tags
by tchemit@users.labs.libre-entreprise.org 28 Dec '08
by tchemit@users.labs.libre-entreprise.org 28 Dec '08
28 Dec '08
Author: tchemit
Date: 2008-12-28 15:44:40 +0000 (Sun, 28 Dec 2008)
New Revision: 1097
Added:
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/StylesheetHelper.java
Modified:
lutinjaxx/trunk/jaxx-core/changelog.txt
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/JAXXCompiler.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/Rule.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/Selector.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/Stylesheet.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/tags/DefaultObjectHandler.java
Log:
use StylesheetHelper
Modified: lutinjaxx/trunk/jaxx-core/changelog.txt
===================================================================
--- lutinjaxx/trunk/jaxx-core/changelog.txt 2008-12-28 15:44:10 UTC (rev 1096)
+++ lutinjaxx/trunk/jaxx-core/changelog.txt 2008-12-28 15:44:40 UTC (rev 1097)
@@ -1,4 +1,10 @@
-0.8 ??? 2009????
+1.0 ???? 200812??
+
+0.8 ??? 200812??
+ * 20081228 [chemit] - generify ClassDescriptor
+ - introduce StylesheetHelper helper class to detach Stylesheet, Rule and Selector classes from
+ JAXXCompiler and make possible to extract compiler engine from runtime
+
* 20081227 [chemit] - add PCS on ValidatorErrorTable to be used by table validation
* 20081218 [chemit] - improve generation of methods
* 20081214 [chemit] - can now in validation, put error with args (all args must be separated by a ##)
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/JAXXCompiler.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/JAXXCompiler.java 2008-12-28 15:44:10 UTC (rev 1096)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/compiler/JAXXCompiler.java 2008-12-28 15:44:40 UTC (rev 1097)
@@ -9,6 +9,7 @@
import jaxx.UnsupportedTagException;
import jaxx.css.Rule;
import jaxx.css.Stylesheet;
+import jaxx.css.StylesheetHelper;
import jaxx.parser.ParseException;
import jaxx.reflect.ClassDescriptor;
import jaxx.reflect.ClassDescriptorLoader;
@@ -597,7 +598,7 @@
}
public void addInlineStyle(CompiledObject object, String propertyName, boolean dataBinding) {
- inlineStyles.add(Rule.inlineAttribute(object, propertyName, dataBinding));
+ inlineStyles.add(StylesheetHelper.inlineAttribute(object, propertyName, dataBinding));
}
/*---------------------------------------------------------------------------------*/
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/Rule.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/Rule.java 2008-12-28 15:44:10 UTC (rev 1096)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/Rule.java 2008-12-28 15:44:40 UTC (rev 1097)
@@ -4,15 +4,9 @@
*/
package jaxx.css;
-import jaxx.CompilerException;
-import jaxx.compiler.CompiledObject;
-
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.HashMap;
import java.util.Map;
-public class Rule implements Serializable, Comparable {
+public class Rule implements java.io.Serializable, Comparable<Rule> {
public static final String INLINE_ATTRIBUTE = "<inline attribute>";
public static final String DATA_BINDING = "<data binding>";
@@ -23,57 +17,38 @@
public Rule(Selector[] selectors, Map<String, String> properties) {
this.selectors = selectors;
- Arrays.sort(selectors);
+ java.util.Arrays.sort(selectors);
this.properties = properties;
}
public Rule(Selector[] selectors, String[] keys, String[] values) {
this.selectors = selectors;
- Arrays.sort(selectors);
- this.properties = new HashMap<String, String>();
- if (keys.length != values.length)
+ java.util.Arrays.sort(selectors);
+ this.properties = new java.util.HashMap<String, String>();
+ if (keys.length != values.length) {
throw new IllegalArgumentException("keys and values must have the same number of entries");
- for (int i = 0; i < keys.length; i++)
+ }
+ for (int i = 0; i < keys.length; i++) {
properties.put(keys[i], values[i]);
+ }
}
-
- public static Rule inlineAttribute(CompiledObject object, String propertyName, boolean dataBinding) {
- Map<String, String> properties = new HashMap<String, String>();
- properties.put(propertyName, dataBinding ? DATA_BINDING : INLINE_ATTRIBUTE);
- return new Rule(new Selector[]{new Selector(null, null, null, object.getId(), true)}, properties);
- }
-
-
public Selector[] getSelectors() {
return selectors;
}
-
public Map<String, String> getProperties() {
return properties;
}
-
- public int appliesTo(CompiledObject object) throws CompilerException {
- int appliesTo = Selector.NEVER_APPLIES;
- for (Selector selector : selectors) {
- appliesTo = Math.max(selector.appliesTo(object), appliesTo);
- if (appliesTo == Selector.ALWAYS_APPLIES || appliesTo == Selector.ALWAYS_APPLIES_INHERIT_ONLY)
- break;
- }
- return appliesTo;
+ @Override
+ public int compareTo(Rule o) {
+ return selectors[0].compareTo(o.selectors[0]); // they are already sorted so we only need to compare the highest-ranked from each one
}
-
- public int compareTo(Object o) {
- Rule r = (Rule) o;
- return selectors[0].compareTo(r.selectors[0]); // they are already sorted so we only need to compare the highest-ranked from each one
- }
-
@Override
public String toString() {
- return "Rule[" + Arrays.asList(selectors) + ", " + properties + "]";
+ return "Rule[" + java.util.Arrays.asList(selectors) + ", " + properties + "]";
}
}
\ No newline at end of file
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/Selector.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/Selector.java 2008-12-28 15:44:10 UTC (rev 1096)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/Selector.java 2008-12-28 15:44:40 UTC (rev 1097)
@@ -4,12 +4,7 @@
*/
package jaxx.css;
-import jaxx.compiler.CompiledObject;
-import jaxx.reflect.ClassDescriptor;
-
-import java.io.Serializable;
-
-public class Selector implements Serializable, Comparable {
+public class Selector implements java.io.Serializable, Comparable<Selector> {
public static final int NEVER_APPLIES = 0;
public static final int PSEUDOCLASS_APPLIES_INHERIT_ONLY = 1;
public static final int PSEUDOCLASS_APPLIES = 2;
@@ -21,7 +16,7 @@
private String pseudoClass;
private String id;
private boolean inline;
- private static final long serialVersionUID = 2183853334224189438L;
+ private static final long serialVersionUID = 1L;
public Selector(String javaClassName, String styleClass, String pseudoClass, String id) {
@@ -38,44 +33,6 @@
}
- public int appliesTo(CompiledObject object) {
- boolean inheritOnly = false;
- CompiledObject parent = object;
- while (parent != null) {
- boolean classMatch = (javaClassName == null);
- if (!classMatch) {
- ClassDescriptor javaClass = parent.getObjectClass();
- do {
- String name = javaClass.getName();
- if (name.equals(javaClassName) || name.substring(name.lastIndexOf(".") + 1).equals(javaClassName)) {
- classMatch = true;
- break;
- }
- javaClass = javaClass.getSuperclass();
- }
- while (javaClass != null);
- }
-
- boolean styleClassMatch = (styleClass == null || styleClass.equals(parent.getStyleClass()));
-
- String objectId = parent.getId();
- objectId = objectId.substring(objectId.lastIndexOf(".") + 1);
- boolean idMatch = (id == null || (' ' + objectId + ' ').indexOf(' ' + id + ' ') > -1);
-
- if (classMatch && styleClassMatch && idMatch) {
- if (pseudoClass != null)
- return inheritOnly ? PSEUDOCLASS_APPLIES_INHERIT_ONLY : PSEUDOCLASS_APPLIES;
- else
- return inheritOnly ? ALWAYS_APPLIES_INHERIT_ONLY : ALWAYS_APPLIES;
- }
-
- parent = parent.getParent();
- inheritOnly = true;
- }
- return NEVER_APPLIES;
- }
-
-
public String getJavaClassName() {
return javaClassName;
}
@@ -100,29 +57,38 @@
return inline;
}
-
- public int compareTo(Object o) {
- Selector selector = (Selector) o;
- if (inline && !selector.inline)
+ @Override
+ public int compareTo(Selector selector) {
+ if (inline && !selector.inline) {
return 1;
- if (!inline && selector.inline)
+ }
+ if (!inline && selector.inline) {
return -1;
- if (pseudoClass != null && selector.pseudoClass == null)
+ }
+ if (pseudoClass != null && selector.pseudoClass == null) {
return 1;
- if (pseudoClass == null && selector.pseudoClass != null)
+ }
+ if (pseudoClass == null && selector.pseudoClass != null) {
return -1;
- if (id != null && selector.id == null)
+ }
+ if (id != null && selector.id == null) {
return 1;
- if (id == null && selector.id != null)
+ }
+ if (id == null && selector.id != null) {
return -1;
- if (styleClass != null && selector.styleClass == null)
+ }
+ if (styleClass != null && selector.styleClass == null) {
return 1;
- if (styleClass == null && selector.styleClass != null)
+ }
+ if (styleClass == null && selector.styleClass != null) {
return -1;
- if (javaClassName != null && selector.javaClassName == null)
+ }
+ if (javaClassName != null && selector.javaClassName == null) {
return 1;
- if (javaClassName == null && selector.javaClassName != null)
+ }
+ if (javaClassName == null && selector.javaClassName != null) {
return -1;
+ }
return 0;
}
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/Stylesheet.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/Stylesheet.java 2008-12-28 15:44:10 UTC (rev 1096)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/Stylesheet.java 2008-12-28 15:44:40 UTC (rev 1097)
@@ -4,33 +4,7 @@
*/
package jaxx.css;
-import jaxx.CompilerException;
-import jaxx.compiler.CompiledObject;
-import jaxx.compiler.DataBinding;
-import jaxx.compiler.DataSource;
-import jaxx.compiler.JAXXCompiler;
-import jaxx.parser.JavaParser;
-import jaxx.parser.JavaParserTreeConstants;
-import jaxx.parser.SimpleNode;
-import jaxx.reflect.ClassDescriptor;
-import jaxx.reflect.ClassDescriptorLoader;
-import jaxx.reflect.MethodDescriptor;
-import jaxx.tags.DefaultObjectHandler;
-import jaxx.tags.TagManager;
-import jaxx.types.TypeManager;
-
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.io.Serializable;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-public class Stylesheet implements Serializable {
+public class Stylesheet implements java.io.Serializable {
private Rule[] rules;
private static final long serialVersionUID = 1L;
@@ -39,411 +13,33 @@
rules = new Rule[0];
}
-
public Stylesheet(Rule[] rules) {
this.rules = rules;
- Arrays.sort(rules);
+ java.util.Arrays.sort(rules);
}
-
public Rule[] getRules() {
return rules;
}
-
public void add(Rule newRule) {
Rule[] oldRules = rules;
rules = new Rule[oldRules.length + 1];
System.arraycopy(oldRules, 0, rules, 0, oldRules.length);
rules[rules.length - 1] = newRule;
- Arrays.sort(rules);
+ java.util.Arrays.sort(rules);
}
-
public void add(Rule[] newRules) {
Rule[] oldRules = rules;
rules = new Rule[oldRules.length + newRules.length];
System.arraycopy(oldRules, 0, rules, 0, oldRules.length);
System.arraycopy(newRules, 0, rules, oldRules.length, newRules.length);
- Arrays.sort(rules);
+ java.util.Arrays.sort(rules);
}
-
- public void applyTo(CompiledObject object, JAXXCompiler compiler, Stylesheet overrides) throws CompilerException {
- Map<String, String> overriddenProperties;
- if (overrides != null)
- overriddenProperties = overrides.getApplicableProperties(object);
- else
- overriddenProperties = null;
-
- Map<String, String> properties = getApplicableProperties(object);
- if (properties != null) {
- if (overriddenProperties != null)
- properties.keySet().removeAll(overriddenProperties.keySet());
- DefaultObjectHandler handler = TagManager.getTagHandler(object.getObjectClass());
- for (Map.Entry<String, String> e : properties.entrySet()) {
- String value = e.getValue();
- if (value.equals(Rule.INLINE_ATTRIBUTE) || value.equals(Rule.DATA_BINDING))
- continue;
- handler.setAttribute(object, e.getKey(), e.getValue(), false, compiler);
- }
- }
-
- Rule[] pseudoClasses = getApplicablePseudoClasses(object);
- if (pseudoClasses != null) {
- Map<String, Map<String, String>> combinedPseudoClasses = new LinkedHashMap<String, Map<String, String>>();
- for (Rule pseudoClass1 : pseudoClasses) {
- Selector[] selectors = pseudoClass1.getSelectors();
- for (Selector selector : selectors) {
- if (selector.appliesTo(object) == Selector.PSEUDOCLASS_APPLIES) {
- properties = pseudoClass1.getProperties();
- String pseudoClass = selector.getPseudoClass();
- // TODO: overrides by downstream pseudoclasses are not handled
- Map<String, String> combinedProperties = combinedPseudoClasses.get(pseudoClass);
- if (combinedProperties == null) {
- combinedProperties = new HashMap<String, String>();
- combinedPseudoClasses.put(pseudoClass, combinedProperties);
- }
- combinedProperties.putAll(properties);
- }
- }
- }
-
- int count = 0;
- for (Map.Entry<String, Map<String, String>> e : combinedPseudoClasses.entrySet()) {
- applyPseudoClass(e.getKey(), e.getValue(), object, compiler, count++);
- }
- }
- }
-
-
- /**
- * Replaces all references to the variable "object" with the actual object ID.
- *
- * @param code ?
- * @param id ?
- * @return ?
- * @throws jaxx.CompilerException ?
- */
- private String replaceObjectReferences(String code, String id) throws CompilerException {
- JavaParser p = new JavaParser(new StringReader(code + ";"));
- p.Expression();
- SimpleNode node = p.popNode();
- scanNode(node, id);
- return node.getText();
- }
-
-
- private void scanNode(SimpleNode node, String id) {
- if (node.getId() == JavaParserTreeConstants.JJTNAME) {
- String name = node.getText();
- if (name.equals("object") || (name.indexOf(".") != -1 && name.substring(0, name.indexOf(".")).trim().equals("object")))
- node.firstToken.image = id;
- } else {
- int count = node.jjtGetNumChildren();
- for (int i = 0; i < count; i++)
- scanNode(node.getChild(i), id);
- }
- }
-
-
- private void compilePseudoClassAdd(String pseudoClass, CompiledObject object, String propertyCode, JAXXCompiler compiler) throws CompilerException {
- if (pseudoClass.equals("mouseover")) {
- try {
- MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
- object.addEventHandler("style." + pseudoClass + ".add", addMouseListener,
- ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mouseEntered",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
- propertyCode, compiler);
- }
- catch (NoSuchMethodException e) {
- compiler.reportError("mouseover pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
- }
- } else if (pseudoClass.equals("mouseout")) {
- try {
- MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
- object.addEventHandler("style." + pseudoClass + ".add", addMouseListener,
- ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mouseExited",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
- propertyCode, compiler);
- compiler.appendInitDataBindings("{" + propertyCode + "}");
- }
- catch (NoSuchMethodException e) {
- compiler.reportError("mouseout pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
- }
- } else if (pseudoClass.equals("mousedown")) {
- try {
- MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
- object.addEventHandler("style." + pseudoClass + ".add", addMouseListener,
- ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mousePressed",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
- propertyCode, compiler);
- }
- catch (NoSuchMethodException e) {
- compiler.reportError("mousedown pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
- }
- } else if (pseudoClass.equals("mouseup")) {
- try {
- MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
- object.addEventHandler("style." + pseudoClass + ".add", addMouseListener,
- ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mouseReleased",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
- propertyCode, compiler);
- compiler.appendInitDataBindings("{" + propertyCode + "}");
- }
- catch (NoSuchMethodException e) {
- compiler.reportError("mouseup pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
- }
- } else if (pseudoClass.startsWith("{")) {
- pseudoClass = pseudoClass.substring(1, pseudoClass.length() - 1).trim();
- pseudoClass = replaceObjectReferences(pseudoClass, object.getJavaCode());
- String dest = object.getId() + ".style." + pseudoClass + ".add";
- String destCode = TypeManager.getJavaCode(dest);
- if (compiler.haveProcessDataBinding()) {
- compiler.appendProcessDataBinding("else ");
- }
- compiler.appendProcessDataBinding("if ($dest.equals(" + destCode + ")) { if (" + pseudoClass + ") { "+ propertyCode + "} }");
- new DataSource(dest, pseudoClass, compiler).compile("new jaxx.runtime.DataBindingListener(" + compiler.getRootObject().getJavaCode() + ", " + destCode + ")");
- compiler.appendInitDataBindings("applyDataBinding("+ destCode + ");");
- } else
- throw new IllegalArgumentException("unrecognized pseudoclass: " + pseudoClass);
- }
-
-
- private void compilePseudoClassRemove(String pseudoClass, CompiledObject object, String propertyCode, JAXXCompiler compiler) throws CompilerException {
- if (pseudoClass.equals("mouseover")) {
- try {
- MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
- object.addEventHandler("style." + pseudoClass + ".remove", addMouseListener,
- ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mouseExited",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
- propertyCode, compiler);
- }
- catch (NoSuchMethodException e) {
- compiler.reportError("mouseover pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
- }
- } else if (pseudoClass.equals("mouseout")) {
- try {
- MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
- object.addEventHandler("style." + pseudoClass + ".remove", addMouseListener,
- ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mouseEntered",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
- propertyCode, compiler);
- }
- catch (NoSuchMethodException e) {
- compiler.reportError("mouseout pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
- }
- } else if (pseudoClass.equals("mousedown")) {
- try {
- MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
- object.addEventHandler("style." + pseudoClass + ".remove", addMouseListener,
- ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mouseReleased",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
- propertyCode, compiler);
- }
- catch (NoSuchMethodException e) {
- compiler.reportError("mousedown pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
- }
- } else if (pseudoClass.equals("mouseup")) {
- try {
- MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
- object.addEventHandler("style." + pseudoClass + ".remove", addMouseListener,
- ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mousePressed",
- new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
- propertyCode, compiler);
- }
- catch (NoSuchMethodException e) {
- compiler.reportError("mouseup pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
- }
- } else if (pseudoClass.startsWith("{")) {
- pseudoClass = pseudoClass.substring(1, pseudoClass.length() - 1).trim();
- pseudoClass = replaceObjectReferences(pseudoClass, object.getJavaCode());
- String dest = object.getId() + ".style." + pseudoClass + ".remove";
- String destCode = TypeManager.getJavaCode(dest);
- if (compiler.haveProcessDataBinding()) {
- compiler.appendProcessDataBinding("else ");
- }
- compiler.appendProcessDataBinding("if ($dest.equals(" + destCode + ")) { if (" + invert(pseudoClass) + ") { " + propertyCode + "} }");
- new DataSource(dest, pseudoClass, compiler).compile("new jaxx.runtime.DataBindingListener(" + compiler.getRootObject().getJavaCode() + ", " + destCode + ")");
- compiler.appendInitDataBindings("applyDataBinding(" + destCode + ");");
- } else
- throw new IllegalArgumentException("unrecognized pseudoclass: " + pseudoClass);
- }
-
-
- private String invert(String javaCode) {
- javaCode = javaCode.trim();
- if (javaCode.startsWith("!"))
- return javaCode.substring(1);
- else
- return "!(" + javaCode + ")";
- }
-
-
- private String unwrap(ClassDescriptor type, String valueCode) {
- if (type == ClassDescriptorLoader.getClassDescriptor(boolean.class))
- return "((java.lang.Boolean) " + valueCode + ").booleanValue()";
- else if (type == ClassDescriptorLoader.getClassDescriptor(byte.class))
- return "((java.lang.Byte) " + valueCode + ").byteValue()";
- else if (type == ClassDescriptorLoader.getClassDescriptor(short.class))
- return "((java.lang.Short) " + valueCode + ").shortValue()";
- else if (type == ClassDescriptorLoader.getClassDescriptor(int.class))
- return "((java.lang.Integer) " + valueCode + ").intValue()";
- else if (type == ClassDescriptorLoader.getClassDescriptor(long.class))
- return "((java.lang.Long) " + valueCode + ").longValue()";
- else if (type == ClassDescriptorLoader.getClassDescriptor(float.class))
- return "((java.lang.Float) " + valueCode + ").floatValue()";
- else if (type == ClassDescriptorLoader.getClassDescriptor(double.class))
- return "((java.lang.Double) " + valueCode + ").doubleValue()";
- else if (type == ClassDescriptorLoader.getClassDescriptor(char.class))
- return "((java.lang.Character) " + valueCode + ").charValue()";
- else
- return valueCode;
- }
-
-
- protected void applyPseudoClass(String pseudoClass, Map<String, String> properties,
- CompiledObject object, JAXXCompiler compiler, int priority) throws CompilerException {
- if (pseudoClass.indexOf("[") != -1)
- pseudoClass = pseudoClass.substring(0, pseudoClass.indexOf("["));
- final StringBuffer buffer = new StringBuffer();
- /*CompiledObject bufferObject = new CompiledObject(object.getId(), object.getJavaCode(), object.getObjectClass(), compiler, true) {
- public void appendInitializationCode(String code) {
- buffer.append(code);
- }
- public void registerDataBinding(String src, String property, String assignment, JAXXCompiler compiler) throws CompilerException {
- buffer.append(assignment);
- }
- };*/
-
- DefaultObjectHandler handler = TagManager.getTagHandler(object.getObjectClass());
- boolean valueDeclared = false;
- for (Map.Entry<String, String> e : properties.entrySet()) {
- String property = e.getKey();
- ClassDescriptor type = handler.getPropertyType(object, property, compiler);
- String dataBinding = compiler.processDataBindings(e.getValue(), type);
- String valueCode;
- if (dataBinding != null) {
- valueCode = "new jaxx.runtime.css.DataBinding(" + TypeManager.getJavaCode(object.getId() + "." + property + "." + priority) + ")";
- new DataBinding(dataBinding, object.getId() + "." + property + "." + priority, handler.getSetPropertyCode(object.getJavaCode(),
- property, "(" + JAXXCompiler.getCanonicalName(type) + ") " + dataBinding, compiler), compiler).compile(false);
- } else {
- try {
- Class typeClass = type != null ? ClassDescriptorLoader.getClass(type.getName(), type.getClassLoader()) : null;
- valueCode = TypeManager.getJavaCode(TypeManager.convertFromString(e.getValue(), typeClass));
- }
- catch (ClassNotFoundException ex) {
- compiler.reportError("could not find class " + type.getName());
- return;
- }
- }
- if (!valueDeclared) {
- buffer.append("java.lang.Object ");
- valueDeclared = true;
- }
- buffer.append("value = jaxx.runtime.css.Pseudoclasses.applyProperty(").append(compiler.getOutputClassName()).append(".this, ").append(object.getJavaCode()).append(", ").append(TypeManager.getJavaCode(property)).append(", ").append(valueCode).append(", jaxx.runtime.css.Pseudoclasses.wrap(").append(handler.getGetPropertyCode(object.getJavaCode(), property, compiler)).append("), ").append(priority).append(");").append(JAXXCompiler.getLineSeparator());
- buffer.append("if (!(value instanceof jaxx.runtime.css.DataBinding)) {").append(JAXXCompiler.getLineSeparator());
- String unwrappedValue = unwrap(type, "value");
- buffer.append(" ").append(handler.getSetPropertyCode(object.getJavaCode(), property, "(" + JAXXCompiler.getCanonicalName(type) +
- ") " + unwrappedValue, compiler)).append(JAXXCompiler.getLineSeparator());
- buffer.append("}").append(JAXXCompiler.getLineSeparator());
- }
-
- if (pseudoClass.equals("focused")) {
- pseudoClass = "{ object.hasFocus() }";
- } else if (pseudoClass.equals("unfocused")) {
- pseudoClass = "{ !object.hasFocus() }";
- } else if (pseudoClass.equals("enabled")) {
- pseudoClass = "{ object.isEnabled() }";
- } else if (pseudoClass.equals("disabled")) {
- pseudoClass = "{ !object.isEnabled() }";
- } else if (pseudoClass.equals("selected")) {
- pseudoClass = "{ object.isSelected() }";
- } else if (pseudoClass.equals("deselected")) {
- pseudoClass = "{ !object.isSelected() }";
- }
-
- compilePseudoClassAdd(pseudoClass, object, buffer.toString(), compiler);
-
- buffer.setLength(0);
- valueDeclared = false;
- for (Map.Entry<String, String> e : properties.entrySet()) {
- String property = e.getKey();
- ClassDescriptor type = handler.getPropertyType(object, property, compiler);
- String dataBinding = compiler.processDataBindings(e.getValue(), type);
- String valueCode;
- if (dataBinding != null) {
- valueCode = "new jaxx.runtime.css.DataBinding(" + TypeManager.getJavaCode(object.getId() + "." + property + "." + priority) + ")";
- new DataBinding(dataBinding, object.getId() + "." + property + "." + priority, handler.getSetPropertyCode(object.getJavaCode(),
- property, "(" + JAXXCompiler.getCanonicalName(type) + ") " + dataBinding, compiler), compiler).compile(false);
- } else {
- try {
- Class typeClass = type != null ? ClassDescriptorLoader.getClass(type.getName(), type.getClassLoader()) : null;
- valueCode = TypeManager.getJavaCode(TypeManager.convertFromString(e.getValue(), typeClass));
- }
- catch (ClassNotFoundException ex) {
- compiler.reportError("could not find class " + type.getName());
- return;
- }
- }
- if (!valueDeclared) {
- buffer.append("java.lang.Object ");
- valueDeclared = true;
- }
- buffer.append("value = jaxx.runtime.css.Pseudoclasses.removeProperty(").append(compiler.getOutputClassName()).append(".this, ").append(object.getJavaCode()).append(", ").append(TypeManager.getJavaCode(property)).append(", ").append(valueCode).append(", jaxx.runtime.css.Pseudoclasses.wrap(").append(handler.getGetPropertyCode(object.getJavaCode(), property, compiler)).append("), ").append(priority).append(");").append(JAXXCompiler.getLineSeparator());
- buffer.append("if (!(value instanceof jaxx.runtime.css.DataBinding)) {").append(JAXXCompiler.getLineSeparator());
- String unwrappedValue = unwrap(type, "value");
- buffer.append(" ").append(handler.getSetPropertyCode(object.getJavaCode(), property, "(" + JAXXCompiler.getCanonicalName(type) +
- ") " + unwrappedValue, compiler)).append(JAXXCompiler.getLineSeparator());
- buffer.append("}").append(JAXXCompiler.getLineSeparator());
- }
- compilePseudoClassRemove(pseudoClass, object, buffer.toString(), compiler);
- }
-
-
- public Map<String, String> getApplicableProperties(CompiledObject object) throws CompilerException {
- DefaultObjectHandler handler = TagManager.getTagHandler(object.getObjectClass());
- Map<String, String> result = null;
- for (Rule rule : rules) {
- int apply = rule.appliesTo(object);
- if (apply == Selector.ALWAYS_APPLIES || apply == Selector.ALWAYS_APPLIES_INHERIT_ONLY) {
- if (result == null)
- result = new HashMap<String, String>();
- for (Map.Entry<String, String> entry : rule.getProperties().entrySet()) {
- String property = entry.getKey();
- if (apply == Selector.ALWAYS_APPLIES || handler.isPropertyInherited(property)) {
- result.put(property, entry.getValue());
- }
- }
- }
- }
- return result;
- }
-
-
- public Rule[] getApplicablePseudoClasses(CompiledObject object) throws CompilerException {
- List<Rule> result = null;
- for (Rule rule : rules) {
- if (rule.appliesTo(object) == Selector.PSEUDOCLASS_APPLIES) {
- if (result == null) {
- result = new ArrayList<Rule>();
- }
- result.add(rule);
- }
- }
- return result != null ? result.toArray(new Rule[result.size()]) : null;
- }
-
@Override
public String toString() {
- return "Stylesheet" + Arrays.asList(rules);
+ return "Stylesheet" + java.util.Arrays.asList(rules);
}
}
\ No newline at end of file
Added: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/StylesheetHelper.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/StylesheetHelper.java (rev 0)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/css/StylesheetHelper.java 2008-12-28 15:44:40 UTC (rev 1097)
@@ -0,0 +1,564 @@
+package jaxx.css;
+
+import jaxx.CompilerException;
+import jaxx.compiler.CompiledObject;
+import jaxx.compiler.DataBinding;
+import jaxx.compiler.DataSource;
+import jaxx.compiler.JAXXCompiler;
+import jaxx.compiler.JAXXCompilerHelper;
+import jaxx.parser.JavaParser;
+import jaxx.parser.JavaParserTreeConstants;
+import jaxx.parser.SimpleNode;
+import jaxx.reflect.ClassDescriptor;
+import jaxx.reflect.ClassDescriptorLoader;
+import jaxx.reflect.MethodDescriptor;
+import jaxx.tags.DefaultObjectHandler;
+import jaxx.tags.TagManager;
+import jaxx.types.TypeManager;
+
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A helper class to compute {@link Stylesheet}, {@link Rule} and {@link Selector}
+ * and extract all the compiler logic from this class.
+ * <p/>
+ * In that way we can make the compiler as a single module and a runtime as another module.
+ *
+ * @author chemit
+ */
+public class StylesheetHelper {
+
+ public static void applyTo(CompiledObject object, JAXXCompiler compiler, Stylesheet stylesheet, Stylesheet overrides) throws CompilerException {
+ Map<String, String> overriddenProperties;
+ if (overrides != null) {
+ overriddenProperties = getApplicableProperties(overrides, object);
+ //overriddenProperties = overrides.getApplicableProperties(s,object);
+ } else {
+ overriddenProperties = null;
+ }
+
+ Map<String, String> properties = getApplicableProperties(stylesheet, object);
+ if (properties != null) {
+ if (overriddenProperties != null) {
+ properties.keySet().removeAll(overriddenProperties.keySet());
+ }
+ DefaultObjectHandler handler = TagManager.getTagHandler(object.getObjectClass());
+ for (Map.Entry<String, String> e : properties.entrySet()) {
+ String value = e.getValue();
+ if (value.equals(Rule.INLINE_ATTRIBUTE) || value.equals(Rule.DATA_BINDING)) {
+ continue;
+ }
+ handler.setAttribute(object, e.getKey(), e.getValue(), false, compiler);
+ }
+ }
+
+ Rule[] pseudoClasses = getApplicablePseudoClasses(stylesheet, object);
+ if (pseudoClasses != null) {
+ Map<String, Map<String, String>> combinedPseudoClasses = new LinkedHashMap<String, Map<String, String>>();
+ for (Rule pseudoClass1 : pseudoClasses) {
+ Selector[] selectors = pseudoClass1.getSelectors();
+ for (Selector selector : selectors) {
+ if (appliesTo(selector, object) == Selector.PSEUDOCLASS_APPLIES) {
+ properties = pseudoClass1.getProperties();
+ String pseudoClass = selector.getPseudoClass();
+ // TODO: overrides by downstream pseudoclasses are not handled
+ Map<String, String> combinedProperties = combinedPseudoClasses.get(pseudoClass);
+ if (combinedProperties == null) {
+ combinedProperties = new HashMap<String, String>();
+ combinedPseudoClasses.put(pseudoClass, combinedProperties);
+ }
+ combinedProperties.putAll(properties);
+ }
+ }
+ }
+
+ int count = 0;
+ for (Map.Entry<String, Map<String, String>> e : combinedPseudoClasses.entrySet()) {
+ applyPseudoClass(e.getKey(), e.getValue(), object, compiler, count++);
+ }
+ }
+ }
+
+ /**
+ * Replaces all references to the variable "object" with the actual object ID.
+ *
+ * @param code ?
+ * @param id ?
+ * @return ?
+ * @throws jaxx.CompilerException ?
+ */
+ public static String replaceObjectReferences(String code, String id) throws CompilerException {
+ JavaParser p = new JavaParser(new StringReader(code + ";"));
+ p.Expression();
+ jaxx.parser.SimpleNode node = p.popNode();
+ scanNode(node, id);
+ return node.getText();
+ }
+
+ public static void scanNode(SimpleNode node, String id) {
+ if (node.getId() == JavaParserTreeConstants.JJTNAME) {
+ String name = node.getText();
+ if (name.equals("object") || (name.indexOf(".") != -1 && name.substring(0, name.indexOf(".")).trim().equals("object"))) {
+ node.firstToken.image = id;
+ }
+ } else {
+ int count = node.jjtGetNumChildren();
+ for (int i = 0; i < count; i++) {
+ scanNode(node.getChild(i), id);
+ }
+ }
+ }
+
+ public static void compilePseudoClassAdd(String pseudoClass, CompiledObject object, String propertyCode, JAXXCompiler compiler) throws CompilerException {
+
+ if (pseudoClass.startsWith("{")) {
+ pseudoClass = pseudoClass.substring(1, pseudoClass.length() - 1).trim();
+ pseudoClass = replaceObjectReferences(pseudoClass, object.getJavaCode());
+ String dest = object.getId() + ".style." + pseudoClass + ".add";
+ String destCode = TypeManager.getJavaCode(dest);
+ if (compiler.haveProcessDataBinding()) {
+ compiler.appendProcessDataBinding("else ");
+ }
+ compiler.appendProcessDataBinding("if ($dest.equals(" + destCode + ")) { if (" + pseudoClass + ") { " + propertyCode + "} }");
+ new DataSource(dest, pseudoClass, compiler).compile("new jaxx.runtime.DataBindingListener(" + compiler.getRootObject().getJavaCode() + ", " + destCode + ")");
+ compiler.appendInitDataBindings("applyDataBinding(" + destCode + ");");
+ return;
+ }
+
+ MouseEventEnum constant = MouseEventEnum.valueOf(pseudoClass);
+
+ String property = null;
+ switch (constant) {
+ case mousedown:
+ property = "mousePressed";
+ break;
+ case mouseout:
+ property = "mouseExited";
+ break;
+ case mouseover:
+ property = "mouseEntered";
+ break;
+ case mouseup:
+ property = "mouseReleased";
+ break;
+ }
+
+ ClassDescriptor mouseListenerDescriptor = ClassDescriptorLoader.getClassDescriptor(MouseListener.class);
+ ClassDescriptor mouseEventDescriptor = ClassDescriptorLoader.getClassDescriptor(MouseEvent.class);
+
+ try {
+ MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener", mouseListenerDescriptor);
+ MethodDescriptor methodDescriptor = mouseListenerDescriptor.getMethodDescriptor(property, mouseEventDescriptor);
+ object.addEventHandler("style." + pseudoClass + ".add", addMouseListener, methodDescriptor, propertyCode, compiler);
+
+ } catch (NoSuchMethodException e) {
+ compiler.reportError("mouseover pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
+ }
+
+ /*if (pseudoClass.equals("mouseover")) {
+ try {
+ MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
+ object.addEventHandler("style." + pseudoClass + ".add", addMouseListener,
+ ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mouseEntered",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
+ propertyCode, compiler);
+ }
+ catch (NoSuchMethodException e) {
+ compiler.reportError("mouseover pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
+ }
+ } else if (pseudoClass.equals("mouseout")) {
+ try {
+ MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
+ object.addEventHandler("style." + pseudoClass + ".add", addMouseListener,
+ ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mouseExited",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
+ propertyCode, compiler);
+ compiler.appendInitDataBindings("{" + propertyCode + "}");
+ }
+ catch (NoSuchMethodException e) {
+ compiler.reportError("mouseout pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
+ }
+ } else if (pseudoClass.equals("mousedown")) {
+ try {
+ MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
+ object.addEventHandler("style." + pseudoClass + ".add", addMouseListener,
+ ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mousePressed",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
+ propertyCode, compiler);
+ }
+ catch (NoSuchMethodException e) {
+ compiler.reportError("mousedown pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
+ }
+ } else if (pseudoClass.equals("mouseup")) {
+ try {
+ MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
+ object.addEventHandler("style." + pseudoClass + ".add", addMouseListener,
+ ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mouseReleased",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
+ propertyCode, compiler);
+ compiler.appendInitDataBindings("{" + propertyCode + "}");
+ }
+ catch (NoSuchMethodException e) {
+ compiler.reportError("mouseup pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
+ }
+ } else if (pseudoClass.startsWith("{")) {
+ pseudoClass = pseudoClass.substring(1, pseudoClass.length() - 1).trim();
+ pseudoClass = replaceObjectReferences(pseudoClass, object.getJavaCode());
+ String dest = object.getId() + ".style." + pseudoClass + ".add";
+ String destCode = TypeManager.getJavaCode(dest);
+ if (compiler.haveProcessDataBinding()) {
+ compiler.appendProcessDataBinding("else ");
+ }
+ compiler.appendProcessDataBinding("if ($dest.equals(" + destCode + ")) { if (" + pseudoClass + ") { "+ propertyCode + "} }");
+ new DataSource(dest, pseudoClass, compiler).compile("new jaxx.runtime.DataBindingListener(" + compiler.getRootObject().getJavaCode() + ", " + destCode + ")");
+ compiler.appendInitDataBindings("applyDataBinding("+ destCode + ");");
+ } else
+ throw new IllegalArgumentException("unrecognized pseudoclass: " + pseudoClass);*/
+ }
+
+ public static void compilePseudoClassRemove(String pseudoClass, CompiledObject object, String propertyCode, JAXXCompiler compiler) throws CompilerException {
+ if (pseudoClass.startsWith("{")) {
+ pseudoClass = pseudoClass.substring(1, pseudoClass.length() - 1).trim();
+ pseudoClass = replaceObjectReferences(pseudoClass, object.getJavaCode());
+ String dest = object.getId() + ".style." + pseudoClass + ".remove";
+ String destCode = TypeManager.getJavaCode(dest);
+ if (compiler.haveProcessDataBinding()) {
+ compiler.appendProcessDataBinding("else ");
+ }
+ compiler.appendProcessDataBinding("if ($dest.equals(" + destCode + ")) { if (" + invert(pseudoClass) + ") { " + propertyCode + "} }");
+ new DataSource(dest, pseudoClass, compiler).compile("new jaxx.runtime.DataBindingListener(" + compiler.getRootObject().getJavaCode() + ", " + destCode + ")");
+ compiler.appendInitDataBindings("applyDataBinding(" + destCode + ");");
+ return;
+ }
+
+ MouseEventEnum constant = MouseEventEnum.valueOf(pseudoClass);
+
+ String property = null;
+ switch (constant) {
+ case mousedown:
+ property = "mousePressed";
+ break;
+ case mouseout:
+ property = "mouseReleased";
+ break;
+ case mouseover:
+ property = "mouseExited";
+ break;
+ case mouseup:
+ property = "mousePressed";
+ break;
+ }
+
+ ClassDescriptor mouseListenerDescriptor = ClassDescriptorLoader.getClassDescriptor(MouseListener.class);
+ ClassDescriptor mouseEventDescriptor = ClassDescriptorLoader.getClassDescriptor(MouseEvent.class);
+
+ try {
+ MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener", mouseListenerDescriptor);
+ MethodDescriptor methodDescriptor = mouseListenerDescriptor.getMethodDescriptor(property, mouseEventDescriptor);
+ object.addEventHandler("style." + pseudoClass + ".remove", addMouseListener, methodDescriptor, propertyCode, compiler);
+
+ } catch (NoSuchMethodException e) {
+ compiler.reportError("mouseover pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
+ }
+
+ /*if (pseudoClass.equals("mouseover")) {
+ try {
+ MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
+ object.addEventHandler("style." + pseudoClass + ".remove", addMouseListener,
+ ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mouseExited",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
+ propertyCode, compiler);
+ }
+ catch (NoSuchMethodException e) {
+ compiler.reportError("mouseover pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
+ }
+ } else if (pseudoClass.equals("mouseout")) {
+ try {
+ MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
+ object.addEventHandler("style." + pseudoClass + ".remove", addMouseListener,
+ ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mouseEntered",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
+ propertyCode, compiler);
+ }
+ catch (NoSuchMethodException e) {
+ compiler.reportError("mouseout pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
+ }
+ } else if (pseudoClass.equals("mousedown")) {
+ try {
+ MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
+ object.addEventHandler("style." + pseudoClass + ".remove", addMouseListener,
+ ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mouseReleased",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
+ propertyCode, compiler);
+ }
+ catch (NoSuchMethodException e) {
+ compiler.reportError("mousedown pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
+ }
+ } else if (pseudoClass.equals("mouseup")) {
+ try {
+ MethodDescriptor addMouseListener = object.getObjectClass().getMethodDescriptor("addMouseListener",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseListener.class)});
+ object.addEventHandler("style." + pseudoClass + ".remove", addMouseListener,
+ ClassDescriptorLoader.getClassDescriptor(MouseListener.class).getMethodDescriptor("mousePressed",
+ new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(MouseEvent.class)}),
+ propertyCode, compiler);
+ }
+ catch (NoSuchMethodException e) {
+ compiler.reportError("mouseup pseudoclass cannot be applied to object " + object.getObjectClass().getName() + " (no addMouseListener method)");
+ }
+ } else if (pseudoClass.startsWith("{")) {
+ pseudoClass = pseudoClass.substring(1, pseudoClass.length() - 1).trim();
+ pseudoClass = replaceObjectReferences(pseudoClass, object.getJavaCode());
+ String dest = object.getId() + ".style." + pseudoClass + ".remove";
+ String destCode = TypeManager.getJavaCode(dest);
+ if (compiler.haveProcessDataBinding()) {
+ compiler.appendProcessDataBinding("else ");
+ }
+ compiler.appendProcessDataBinding("if ($dest.equals(" + destCode + ")) { if (" + invert(pseudoClass) + ") { " + propertyCode + "} }");
+ new DataSource(dest, pseudoClass, compiler).compile("new jaxx.runtime.DataBindingListener(" + compiler.getRootObject().getJavaCode() + ", " + destCode + ")");
+ compiler.appendInitDataBindings("applyDataBinding(" + destCode + ");");
+ } else {
+ throw new IllegalArgumentException("unrecognized pseudoclass: " + pseudoClass);
+ }*/
+ }
+
+ public static String invert(String javaCode) {
+ javaCode = javaCode.trim();
+ return javaCode.startsWith("!") ? javaCode.substring(1) : "!(" + javaCode + ")";
+ }
+
+ public static String unwrap(ClassDescriptor type, String valueCode) {
+ if (type == ClassDescriptorLoader.getClassDescriptor(boolean.class)) {
+ return "((java.lang.Boolean) " + valueCode + ").booleanValue()";
+ } else if (type == ClassDescriptorLoader.getClassDescriptor(byte.class)) {
+ return "((java.lang.Byte) " + valueCode + ").byteValue()";
+ } else if (type == ClassDescriptorLoader.getClassDescriptor(short.class)) {
+ return "((java.lang.Short) " + valueCode + ").shortValue()";
+ } else if (type == ClassDescriptorLoader.getClassDescriptor(int.class)) {
+ return "((java.lang.Integer) " + valueCode + ").intValue()";
+ } else if (type == ClassDescriptorLoader.getClassDescriptor(long.class)) {
+ return "((java.lang.Long) " + valueCode + ").longValue()";
+ } else if (type == ClassDescriptorLoader.getClassDescriptor(float.class)) {
+ return "((java.lang.Float) " + valueCode + ").floatValue()";
+ } else if (type == ClassDescriptorLoader.getClassDescriptor(double.class)) {
+ return "((java.lang.Double) " + valueCode + ").doubleValue()";
+ } else if (type == ClassDescriptorLoader.getClassDescriptor(char.class)) {
+ return "((java.lang.Character) " + valueCode + ").charValue()";
+ } else {
+ return valueCode;
+ }
+ }
+
+ public static void applyPseudoClass(String pseudoClass, Map<String, String> properties,
+ CompiledObject object, JAXXCompiler compiler, int priority) throws CompilerException {
+ if (pseudoClass.indexOf("[") != -1) {
+ pseudoClass = pseudoClass.substring(0, pseudoClass.indexOf("["));
+ }
+ final StringBuffer buffer = new StringBuffer();
+ /*CompiledObject bufferObject = new CompiledObject(object.getId(), object.getJavaCode(), object.getObjectClass(), compiler, true) {
+ public void appendInitializationCode(String code) {
+ buffer.append(code);
+ }
+ public void registerDataBinding(String src, String property, String assignment, JAXXCompiler compiler) throws CompilerException {
+ buffer.append(assignment);
+ }
+ };*/
+
+ DefaultObjectHandler handler = TagManager.getTagHandler(object.getObjectClass());
+ boolean valueDeclared = false;
+ for (Map.Entry<String, String> e : properties.entrySet()) {
+ String property = e.getKey();
+ ClassDescriptor type = handler.getPropertyType(object, property, compiler);
+ String dataBinding = compiler.processDataBindings(e.getValue(), type);
+ String valueCode;
+ if (dataBinding != null) {
+ valueCode = "new jaxx.runtime.css.DataBinding(" + TypeManager.getJavaCode(object.getId() + "." + property + "." + priority) + ")";
+ new DataBinding(dataBinding, object.getId() + "." + property + "." + priority, handler.getSetPropertyCode(object.getJavaCode(),
+ property, "(" + JAXXCompilerHelper.getCanonicalName(type) + ") " + dataBinding, compiler), compiler).compile(false);
+ } else {
+ try {
+ Class typeClass = type != null ? ClassDescriptorLoader.getClass(type.getName(), type.getClassLoader()) : null;
+ valueCode = TypeManager.getJavaCode(TypeManager.convertFromString(e.getValue(), typeClass));
+ }
+ catch (ClassNotFoundException ex) {
+ compiler.reportError("could not find class " + type.getName());
+ return;
+ }
+ }
+ if (!valueDeclared) {
+ buffer.append("java.lang.Object ");
+ valueDeclared = true;
+ }
+ buffer.append("value = jaxx.runtime.css.Pseudoclasses.applyProperty(").append(compiler.getOutputClassName()).append(".this, ").append(object.getJavaCode()).append(", ").append(TypeManager.getJavaCode(property)).append(", ").append(valueCode).append(", jaxx.runtime.css.Pseudoclasses.wrap(").append(handler.getGetPropertyCode(object.getJavaCode(), property, compiler)).append("), ").append(priority).append(");").append(JAXXCompilerHelper.getLineSeparator());
+ buffer.append("if (!(value instanceof jaxx.runtime.css.DataBinding)) {").append(JAXXCompilerHelper.getLineSeparator());
+ String unwrappedValue = unwrap(type, "value");
+ buffer.append(" ").append(handler.getSetPropertyCode(object.getJavaCode(), property, "(" + JAXXCompilerHelper.getCanonicalName(type) +
+ ") " + unwrappedValue, compiler)).append(JAXXCompilerHelper.getLineSeparator());
+ buffer.append("}").append(JAXXCompilerHelper.getLineSeparator());
+ }
+
+ if (pseudoClass.equals("focused")) {
+ pseudoClass = "{ object.hasFocus() }";
+ } else if (pseudoClass.equals("unfocused")) {
+ pseudoClass = "{ !object.hasFocus() }";
+ } else if (pseudoClass.equals("enabled")) {
+ pseudoClass = "{ object.isEnabled() }";
+ } else if (pseudoClass.equals("disabled")) {
+ pseudoClass = "{ !object.isEnabled() }";
+ } else if (pseudoClass.equals("selected")) {
+ pseudoClass = "{ object.isSelected() }";
+ } else if (pseudoClass.equals("deselected")) {
+ pseudoClass = "{ !object.isSelected() }";
+ }
+
+ compilePseudoClassAdd(pseudoClass, object, buffer.toString(), compiler);
+
+ buffer.setLength(0);
+ valueDeclared = false;
+ for (Map.Entry<String, String> e : properties.entrySet()) {
+ String property = e.getKey();
+ ClassDescriptor type = handler.getPropertyType(object, property, compiler);
+ String dataBinding = compiler.processDataBindings(e.getValue(), type);
+ String valueCode;
+ if (dataBinding != null) {
+ valueCode = "new jaxx.runtime.css.DataBinding(" + TypeManager.getJavaCode(object.getId() + "." + property + "." + priority) + ")";
+ new DataBinding(dataBinding, object.getId() + "." + property + "." + priority, handler.getSetPropertyCode(object.getJavaCode(),
+ property, "(" + JAXXCompilerHelper.getCanonicalName(type) + ") " + dataBinding, compiler), compiler).compile(false);
+ } else {
+ try {
+ Class typeClass = type != null ? ClassDescriptorLoader.getClass(type.getName(), type.getClassLoader()) : null;
+ valueCode = TypeManager.getJavaCode(TypeManager.convertFromString(e.getValue(), typeClass));
+ }
+ catch (ClassNotFoundException ex) {
+ compiler.reportError("could not find class " + type.getName());
+ return;
+ }
+ }
+ if (!valueDeclared) {
+ buffer.append("java.lang.Object ");
+ valueDeclared = true;
+ }
+ buffer.append("value = jaxx.runtime.css.Pseudoclasses.removeProperty(").append(compiler.getOutputClassName()).append(".this, ").append(object.getJavaCode()).append(", ").append(TypeManager.getJavaCode(property)).append(", ").append(valueCode).append(", jaxx.runtime.css.Pseudoclasses.wrap(").append(handler.getGetPropertyCode(object.getJavaCode(), property, compiler)).append("), ").append(priority).append(");").append(JAXXCompilerHelper.getLineSeparator());
+ buffer.append("if (!(value instanceof jaxx.runtime.css.DataBinding)) {").append(JAXXCompilerHelper.getLineSeparator());
+ String unwrappedValue = unwrap(type, "value");
+ buffer.append(" ").append(handler.getSetPropertyCode(object.getJavaCode(), property, "(" + JAXXCompilerHelper.getCanonicalName(type) +
+ ") " + unwrappedValue, compiler)).append(JAXXCompilerHelper.getLineSeparator());
+ buffer.append("}").append(JAXXCompilerHelper.getLineSeparator());
+ }
+ compilePseudoClassRemove(pseudoClass, object, buffer.toString(), compiler);
+ }
+
+ public static Map<String, String> getApplicableProperties(Stylesheet s, CompiledObject object) throws CompilerException {
+ DefaultObjectHandler handler = TagManager.getTagHandler(object.getObjectClass());
+ Map<String, String> result = null;
+ for (Rule rule : s.getRules()) {
+ int apply = appliesTo(rule, object);
+ if (apply == Selector.ALWAYS_APPLIES || apply == Selector.ALWAYS_APPLIES_INHERIT_ONLY) {
+ if (result == null) {
+ result = new HashMap<String, String>();
+ }
+ for (Map.Entry<String, String> entry : rule.getProperties().entrySet()) {
+ String property = entry.getKey();
+ if (apply == Selector.ALWAYS_APPLIES || handler.isPropertyInherited(property)) {
+ result.put(property, entry.getValue());
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ public static Rule[] getApplicablePseudoClasses(Stylesheet s, CompiledObject object) throws CompilerException {
+ List<Rule> result = null;
+ for (Rule rule : s.getRules()) {
+ if (appliesTo(rule, object) == Selector.PSEUDOCLASS_APPLIES) {
+ if (result == null) {
+ result = new ArrayList<Rule>();
+ }
+ result.add(rule);
+ }
+ }
+ return result != null ? result.toArray(new Rule[result.size()]) : null;
+ }
+
+ public static Rule inlineAttribute(CompiledObject object, String propertyName, boolean dataBinding) {
+ Map<String, String> properties = new HashMap<String, String>();
+ properties.put(propertyName, dataBinding ? Rule.DATA_BINDING : Rule.INLINE_ATTRIBUTE);
+ return new Rule(new Selector[]{new Selector(null, null, null, object.getId(), true)}, properties);
+ }
+
+ public static int appliesTo(Rule rule, CompiledObject object) throws CompilerException {
+ int appliesTo = Selector.NEVER_APPLIES;
+ for (Selector selector : rule.getSelectors()) {
+ appliesTo = Math.max(appliesTo(selector, object), appliesTo);
+ if (appliesTo == Selector.ALWAYS_APPLIES || appliesTo == Selector.ALWAYS_APPLIES_INHERIT_ONLY) {
+ break;
+ }
+ }
+ return appliesTo;
+ }
+
+ public static int appliesTo(Selector selector, CompiledObject object) {
+ boolean inheritOnly = false;
+ CompiledObject parent = object;
+ String javaClassName = selector.getJavaClassName();
+ String styleClass = selector.getStyleClass();
+ String pseudoClass = selector.getPseudoClass();
+ String id = selector.getId();
+
+ while (parent != null) {
+ boolean classMatch = (javaClassName == null);
+ if (!classMatch) {
+ ClassDescriptor javaClass = parent.getObjectClass();
+ do {
+ String name = javaClass.getName();
+ if (name.equals(javaClassName) || name.substring(name.lastIndexOf(".") + 1).equals(javaClassName)) {
+ classMatch = true;
+ break;
+ }
+ javaClass = javaClass.getSuperclass();
+ }
+ while (javaClass != null);
+ }
+
+ boolean styleClassMatch = (styleClass == null || styleClass.equals(parent.getStyleClass()));
+
+ String objectId = parent.getId();
+ objectId = objectId.substring(objectId.lastIndexOf(".") + 1);
+ boolean idMatch = (id == null || (' ' + objectId + ' ').indexOf(' ' + id + ' ') > -1);
+
+ if (classMatch && styleClassMatch && idMatch) {
+ if (pseudoClass != null) {
+ return inheritOnly ? Selector.PSEUDOCLASS_APPLIES_INHERIT_ONLY : Selector.PSEUDOCLASS_APPLIES;
+ } else {
+ return inheritOnly ? Selector.ALWAYS_APPLIES_INHERIT_ONLY : Selector.ALWAYS_APPLIES;
+ }
+ }
+
+ parent = parent.getParent();
+ inheritOnly = true;
+ }
+ return Selector.NEVER_APPLIES;
+ }
+
+ public enum MouseEventEnum {
+ mouseover,
+ mouseout,
+ mousedown,
+ mouseup
+ }
+}
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/tags/DefaultObjectHandler.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/tags/DefaultObjectHandler.java 2008-12-28 15:44:10 UTC (rev 1096)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/tags/DefaultObjectHandler.java 2008-12-28 15:44:40 UTC (rev 1097)
@@ -11,6 +11,7 @@
import jaxx.compiler.JavaArgument;
import jaxx.compiler.JavaMethod;
import jaxx.css.Stylesheet;
+import jaxx.css.StylesheetHelper;
import jaxx.introspection.JAXXBeanInfo;
import jaxx.introspection.JAXXEventSetDescriptor;
import jaxx.introspection.JAXXIntrospector;
@@ -328,8 +329,8 @@
if (propertyName != null) {
try {
// check for property-specific addPropertyChangeListener method
- getBeanClass().getMethodDescriptor("addPropertyChangeListener", new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(String.class),
- ClassDescriptorLoader.getClassDescriptor(PropertyChangeListener.class)});
+ getBeanClass().getMethodDescriptor("addPropertyChangeListener", ClassDescriptorLoader.getClassDescriptor(String.class),
+ ClassDescriptorLoader.getClassDescriptor(PropertyChangeListener.class));
return objectCode + ".addPropertyChangeListener(\"" + propertyName + "\", " + propertyChangeListenerCode + ");\n";
} catch (NoSuchMethodException e) {
// no property-specific method, use general one
@@ -359,7 +360,7 @@
}
try {
String modelMemberName = eventInfo.modelName != null ? "get" + JAXXCompiler.capitalize(eventInfo.modelName) : null;
- String modelClassName = modelMemberName != null ? getBeanClass().getMethodDescriptor(modelMemberName, new ClassDescriptor[0]).getReturnType().getName() : JAXXCompiler.getCanonicalName(getBeanClass());
+ String modelClassName = modelMemberName != null ? getBeanClass().getMethodDescriptor(modelMemberName).getReturnType().getName() : JAXXCompiler.getCanonicalName(getBeanClass());
String code = objectCode + (eventInfo.modelName != null ? "." + modelMemberName + "()" : "");
result.append("((").append(modelClassName).append(") $bindingSources.remove(\"").append(code).append("\")).").append(eventInfo.removeMethod).append("((").append(JAXXCompiler.getCanonicalName(eventInfo.listenerClass)).append(") jaxx.runtime.Util.getEventListener(").append(JAXXCompiler.getCanonicalName(eventInfo.listenerClass)).append(".class, ").append(compiler.getRootObject().getJavaCode()).append(", ").append(TypeManager.getJavaCode(methodName)).append("));\n");
if (eventInfo.modelName != null) {
@@ -389,8 +390,8 @@
if (propertyName != null) {
try {
// check for property-specific removePropertyChangeListener method
- getBeanClass().getMethodDescriptor("removePropertyChangeListener", new ClassDescriptor[]{ClassDescriptorLoader.getClassDescriptor(String.class),
- ClassDescriptorLoader.getClassDescriptor(PropertyChangeListener.class)});
+ getBeanClass().getMethodDescriptor("removePropertyChangeListener", ClassDescriptorLoader.getClassDescriptor(String.class),
+ ClassDescriptorLoader.getClassDescriptor(PropertyChangeListener.class));
return objectCode + ".removePropertyChangeListener(\"" + propertyName + "\", " + propertyChangeListenerCode + ");\n";
} catch (NoSuchMethodException e) {
// no property-specific method, use general one
@@ -865,7 +866,7 @@
object.appendInitializationCode(child.getInitializationCode(compiler));
}
} else if (stylesheet != null) {
- stylesheet.applyTo(object, compiler, overrides);
+ StylesheetHelper.applyTo(object, compiler,stylesheet, overrides);
}
}
catch (ClassNotFoundException e) {
1
0
[Buix-commits] r1096 - lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/reflect
by tchemit@users.labs.libre-entreprise.org 28 Dec '08
by tchemit@users.labs.libre-entreprise.org 28 Dec '08
28 Dec '08
Author: tchemit
Date: 2008-12-28 15:44:10 +0000 (Sun, 28 Dec 2008)
New Revision: 1096
Modified:
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/reflect/ClassDescriptor.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/reflect/ClassDescriptorLoader.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/reflect/JavaFileParser.java
Log:
rgenerify ClassDescriptor
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/reflect/ClassDescriptor.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/reflect/ClassDescriptor.java 2008-12-28 12:04:05 UTC (rev 1095)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/reflect/ClassDescriptor.java 2008-12-28 15:44:10 UTC (rev 1096)
@@ -105,9 +105,11 @@
}
- public MethodDescriptor getMethodDescriptor(String name, ClassDescriptor[] parameterTypes) throws NoSuchMethodException {
+ public MethodDescriptor getMethodDescriptor(String name, ClassDescriptor... parameterTypes) throws NoSuchMethodException {
for (MethodDescriptor methodDescriptor : methodDescriptors) {
- if (methodDescriptor.getName().equals(name) && Arrays.equals(methodDescriptor.getParameterTypes(), parameterTypes)) {
+ if (methodDescriptor.getName().equals(name)
+ && methodDescriptor.getParameterTypes().length == parameterTypes.length
+ && Arrays.equals(methodDescriptor.getParameterTypes(), parameterTypes)) {
return methodDescriptor;
}
}
@@ -115,7 +117,7 @@
}
- public abstract MethodDescriptor getDeclaredMethodDescriptor(String name, ClassDescriptor[] parameterTypes) throws NoSuchMethodException;
+ public abstract MethodDescriptor getDeclaredMethodDescriptor(String name, ClassDescriptor... parameterTypes) throws NoSuchMethodException;
public FieldDescriptor[] getFieldDescriptors() {
@@ -147,10 +149,11 @@
return true;
}
ClassDescriptor[] interfaces = descriptor.getInterfaces();
- for (ClassDescriptor anInterface : interfaces)
+ for (ClassDescriptor anInterface : interfaces) {
if (anInterface == this) {
return true;
}
+ }
descriptor = descriptor.getSuperclass();
}
return false;
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/reflect/ClassDescriptorLoader.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/reflect/ClassDescriptorLoader.java 2008-12-28 12:04:05 UTC (rev 1095)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/reflect/ClassDescriptorLoader.java 2008-12-28 15:44:10 UTC (rev 1096)
@@ -288,7 +288,7 @@
}
- public MethodDescriptor getDeclaredMethodDescriptor(String name, ClassDescriptor[] parameterTypes) throws NoSuchMethodException {
+ public MethodDescriptor getDeclaredMethodDescriptor(String name, ClassDescriptor... parameterTypes) throws NoSuchMethodException {
throw new NoSuchMethodException(name);
}
@@ -331,7 +331,7 @@
return createFieldDescriptor(javaClass.getDeclaredField(name), javaClass.getClassLoader());
}
- public MethodDescriptor getDeclaredMethodDescriptor(String name, ClassDescriptor[] parameterTypes) throws NoSuchMethodException {
+ public MethodDescriptor getDeclaredMethodDescriptor(String name, ClassDescriptor... parameterTypes) throws NoSuchMethodException {
try {
Class[] parameterTypeClasses = new Class[parameterTypes.length];
for (int i = 0; i < parameterTypes.length; i++) {
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/reflect/JavaFileParser.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/reflect/JavaFileParser.java 2008-12-28 12:04:05 UTC (rev 1095)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/reflect/JavaFileParser.java 2008-12-28 15:44:10 UTC (rev 1096)
@@ -84,7 +84,7 @@
throw new NoSuchFieldException(name);
}
- public MethodDescriptor getDeclaredMethodDescriptor(String name, ClassDescriptor[] parameterTypes) throws NoSuchMethodException {
+ public MethodDescriptor getDeclaredMethodDescriptor(String name, ClassDescriptor... parameterTypes) throws NoSuchMethodException {
throw new NoSuchMethodException(name);
}
};
1
0
[Buix-commits] r1095 - lutinjaxx/trunk/jaxx-example/Components
by tchemit@users.labs.libre-entreprise.org 28 Dec '08
by tchemit@users.labs.libre-entreprise.org 28 Dec '08
28 Dec '08
Author: tchemit
Date: 2008-12-28 12:04:05 +0000 (Sun, 28 Dec 2008)
New Revision: 1095
Modified:
lutinjaxx/trunk/jaxx-example/Components/changelog.txt
Log:
resources were missing
Modified: lutinjaxx/trunk/jaxx-example/Components/changelog.txt
===================================================================
--- lutinjaxx/trunk/jaxx-example/Components/changelog.txt 2008-12-28 12:02:20 UTC (rev 1094)
+++ lutinjaxx/trunk/jaxx-example/Components/changelog.txt 2008-12-28 12:04:05 UTC (rev 1095)
@@ -1,2 +1,5 @@
+0.8 chemit 20081228
+ * 20081228 [chemit] resources were missing
+
0.7 chemit 200812??
* 20081207 [chemit] use lutinproject 3.1
\ No newline at end of file
1
0
[Buix-commits] r1094 - in lutinjaxx/trunk/jaxx-example/Components: . src/main src/main/java/examples/Components src/main/resources src/main/resources/examples src/main/resources/examples/Components
by tchemit@users.labs.libre-entreprise.org 28 Dec '08
by tchemit@users.labs.libre-entreprise.org 28 Dec '08
28 Dec '08
Author: tchemit
Date: 2008-12-28 12:02:20 +0000 (Sun, 28 Dec 2008)
New Revision: 1094
Added:
lutinjaxx/trunk/jaxx-example/Components/src/main/resources/
lutinjaxx/trunk/jaxx-example/Components/src/main/resources/examples/
lutinjaxx/trunk/jaxx-example/Components/src/main/resources/examples/Components/
lutinjaxx/trunk/jaxx-example/Components/src/main/resources/examples/Components/images/
Removed:
lutinjaxx/trunk/jaxx-example/Components/src/main/java/examples/Components/images/
Modified:
lutinjaxx/trunk/jaxx-example/Components/pom.xml
Log:
resources were missing
Modified: lutinjaxx/trunk/jaxx-example/Components/pom.xml
===================================================================
--- lutinjaxx/trunk/jaxx-example/Components/pom.xml 2008-12-27 15:56:43 UTC (rev 1093)
+++ lutinjaxx/trunk/jaxx-example/Components/pom.xml 2008-12-28 12:02:20 UTC (rev 1094)
@@ -35,6 +35,12 @@
<include>**/*.jaxx</include>
</includes>
</resource>
+ <resource>
+ <directory>src/main/resources</directory>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
</resources>
</build>
<!-- ************************************************************* -->
Copied: lutinjaxx/trunk/jaxx-example/Components/src/main/resources/examples/Components/images (from rev 1092, lutinjaxx/trunk/jaxx-example/Components/src/main/java/examples/Components/images)
1
0
[Buix-commits] r1093 - lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/validator
by tchemit@users.labs.libre-entreprise.org 27 Dec '08
by tchemit@users.labs.libre-entreprise.org 27 Dec '08
27 Dec '08
Author: tchemit
Date: 2008-12-27 15:56:43 +0000 (Sat, 27 Dec 2008)
New Revision: 1093
Modified:
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/validator/ErrorTableMouseListener.java
Log:
prefer to dispatch the entry of error instead of onyl the error name (in thah way we have all informations in once...)
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/validator/ErrorTableMouseListener.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/validator/ErrorTableMouseListener.java 2008-12-27 14:19:59 UTC (rev 1092)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/validator/ErrorTableMouseListener.java 2008-12-27 15:56:43 UTC (rev 1093)
@@ -43,7 +43,7 @@
}
JComponent component = entry.getComponent();
if (component != null) {
- pcs.firePropertyChange(HIGHLIGHT_ERROR_PROPERTY, null, entry.getError());
+ pcs.firePropertyChange(HIGHLIGHT_ERROR_PROPERTY, null, entry);
if (component.isVisible()) {
component.requestFocus();
}
1
0
[Buix-commits] r1092 - in lutinjaxx/trunk/jaxx-core: . src/main/java/jaxx/runtime src/main/java/jaxx/runtime/swing src/main/java/jaxx/runtime/validator
by tchemit@users.labs.libre-entreprise.org 27 Dec '08
by tchemit@users.labs.libre-entreprise.org 27 Dec '08
27 Dec '08
Author: tchemit
Date: 2008-12-27 14:19:59 +0000 (Sat, 27 Dec 2008)
New Revision: 1092
Modified:
lutinjaxx/trunk/jaxx-core/changelog.txt
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/Util.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/Utils.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/validator/ErrorTableMouseListener.java
Log:
add PCS on ValidatorErrorTable to be used by table validation
Modified: lutinjaxx/trunk/jaxx-core/changelog.txt
===================================================================
--- lutinjaxx/trunk/jaxx-core/changelog.txt 2008-12-23 10:35:41 UTC (rev 1091)
+++ lutinjaxx/trunk/jaxx-core/changelog.txt 2008-12-27 14:19:59 UTC (rev 1092)
@@ -1,4 +1,5 @@
0.8 ??? 2009????
+ * 20081227 [chemit] - add PCS on ValidatorErrorTable to be used by table validation
* 20081218 [chemit] - improve generation of methods
* 20081214 [chemit] - can now in validation, put error with args (all args must be separated by a ##)
- improve event naming : replace the $evXXX by doMEthodName__on__field (except with optimize option)
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/Util.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/Util.java 2008-12-23 10:35:41 UTC (rev 1091)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/Util.java 2008-12-27 14:19:59 UTC (rev 1092)
@@ -415,6 +415,17 @@
table.addMouseListener(new ErrorTableMouseListener());
}
+ public static ErrorTableMouseListener getErrorTableMouseListener(JTable table) {
+ if (table != null) {
+ for (MouseListener listener : table.getMouseListeners()) {
+ if (listener instanceof ErrorTableMouseListener) {
+ return (ErrorTableMouseListener) listener;
+ }
+ }
+ }
+ return null;
+ }
+
/**
* Compute the string representation of an object.
* <p/>
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/Utils.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/Utils.java 2008-12-23 10:35:41 UTC (rev 1091)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/Utils.java 2008-12-27 14:19:59 UTC (rev 1092)
@@ -126,4 +126,7 @@
column.setCellRenderer(editor);
}
+ public static void setI18nTableHeaderRenderer(JTable table, String... libelles) {
+ table.getTableHeader().setDefaultRenderer(new I18nTableCellRenderer(table.getTableHeader().getDefaultRenderer(), libelles));
+ }
}
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/validator/ErrorTableMouseListener.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/validator/ErrorTableMouseListener.java 2008-12-23 10:35:41 UTC (rev 1091)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/validator/ErrorTableMouseListener.java 2008-12-27 14:19:59 UTC (rev 1092)
@@ -7,6 +7,8 @@
import javax.swing.JTable;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
/**
* A mouse listener to put on a {@link javax.swing.JList} with a {@link jaxx.runtime.validator.BeanValidatorErrorListModel} as a model.
@@ -18,8 +20,17 @@
public class ErrorTableMouseListener extends MouseAdapter {
/** to use log facility, just put in your code: log.info(\"...\"); */
- static private Log log = LogFactory.getLog(ErrorTableMouseListener.class);
+ private static Log log = LogFactory.getLog(ErrorTableMouseListener.class);
+ public static final String HIGHLIGHT_ERROR_PROPERTY = "highlightError";
+
+ /** delgate property change support */
+ protected PropertyChangeSupport pcs;
+
+ public ErrorTableMouseListener() {
+ pcs = new PropertyChangeSupport(this);
+ }
+
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
@@ -32,7 +43,10 @@
}
JComponent component = entry.getComponent();
if (component != null) {
- component.requestFocus();
+ pcs.firePropertyChange(HIGHLIGHT_ERROR_PROPERTY, null, entry.getError());
+ if (component.isVisible()) {
+ component.requestFocus();
+ }
}
}
}
@@ -59,4 +73,20 @@
return entry;
}
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
+ pcs.addPropertyChangeListener(listener);
+ }
+
+ public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
+ pcs.addPropertyChangeListener(propertyName, listener);
+ }
+
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
+ pcs.removePropertyChangeListener(listener);
+ }
+
+ public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
+ pcs.removePropertyChangeListener(propertyName, listener);
+ }
+
}
\ No newline at end of file
1
0
[Buix-commits] r1091 - in lutinjaxx/trunk/jaxx-core/src: main/java/jaxx/runtime main/java/jaxx/runtime/swing test/java/jaxx/runtime
by tchemit@users.labs.libre-entreprise.org 23 Dec '08
by tchemit@users.labs.libre-entreprise.org 23 Dec '08
23 Dec '08
Author: tchemit
Date: 2008-12-23 10:35:41 +0000 (Tue, 23 Dec 2008)
New Revision: 1091
Added:
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/DecoratorTableCellRenderer.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/I18nTableCellRenderer.java
Removed:
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/I18nTableCellHeaderRenderer.java
Modified:
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/DefaultJAXXContext.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/JXPathDecorator.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/MultiJXPathDecorator.java
lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/Utils.java
lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/JXPathDecoratorTest.java
lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/MultiJXPathDecoratorTest.java
Log:
- fix parent context search bug : if a nmae is given, use it.
- improve comparator in JXPathDecorator, no more redondant datas
- make works I18nCellRenderer when the position of column has changed
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/DefaultJAXXContext.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/DefaultJAXXContext.java 2008-12-23 10:31:56 UTC (rev 1090)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/DefaultJAXXContext.java 2008-12-23 10:35:41 UTC (rev 1091)
@@ -50,7 +50,7 @@
}
public <T> void setContextValue(T o, String name) {
- if (PARENT_CONTEXT_ENTRY.accept2(o.getClass(), null)) {
+ if (name == null && PARENT_CONTEXT_ENTRY.accept2(o.getClass(), null)) {
setParentContext((JAXXContext) o);
return;
}
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/JXPathDecorator.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/JXPathDecorator.java 2008-12-23 10:31:56 UTC (rev 1090)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/JXPathDecorator.java 2008-12-23 10:35:41 UTC (rev 1091)
@@ -1,18 +1,16 @@
package jaxx.runtime;
-import org.apache.commons.beanutils.MethodUtils;
-import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.jxpath.JXPathContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import java.beans.PropertyDescriptor;
-import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* JXPath decorator based on {@link String#format(String, Object[])} method.
@@ -67,11 +65,55 @@
* @param datas the list of data to sort
* @param pos the index of context to used in decorator to obtain sorted property.
*/
- public static void sort(JXPathDecorator decorator, List<?> datas, int pos) {
- Collections.sort(datas, decorator.getComparator(pos));
+ public static <O> void sort(JXPathDecorator<O> decorator, List<O> datas, int pos) {
+ Comparator<O> c = decorator.getComparator(pos);
+ boolean cachedComparator = c instanceof JXPathComparator;
+ try {
+ if (cachedComparator) {
+ ((JXPathComparator<O>) c).init(decorator, datas);
+ }
+ Collections.sort(datas, c);
+ } finally {
+ if (cachedComparator) {
+ ((JXPathComparator) c).clear();
+ }
+ }
}
- protected static class Context implements Serializable {
+ public static class JXPathComparator<O> implements Comparator<O> {
+
+ protected Map<O, Comparable<Comparable>> valueCache;
+
+ private final String expression;
+
+ public JXPathComparator(String expression) {
+ this.expression = expression;
+ this.valueCache = new HashMap<O, Comparable<Comparable>>();
+ }
+
+ @Override
+ public int compare(O o1, O o2) {
+ Comparable<Comparable> c1 = valueCache.get(o1);
+ Comparable<Comparable> c2 = valueCache.get(o2);
+ return c1.compareTo(c2);
+ }
+
+ public void clear() {
+ valueCache.clear();
+ }
+
+ public void init(JXPathDecorator<O> decorator, List<O> datas) {
+ clear();
+ for (O data : datas) {
+ JXPathContext jxcontext = JXPathContext.newContext(data);
+ Comparable<Comparable> key = decorator.getTokenValue(jxcontext, expression);
+ valueCache.put(data, key);
+ }
+ }
+ }
+
+ public static class Context<O> implements java.io.Serializable {
+
/**
* expression to format using {@link String#format(String, Object[])}, all variables are compute
* using using the jxpath tokens.
@@ -81,7 +123,7 @@
/** list of jxpath tokens to apply on expression */
protected String[] tokens;
- protected transient Comparator comparator;
+ protected transient Comparator<O> comparator;
private static final long serialVersionUID = 1L;
@@ -94,62 +136,15 @@
return tokens[0];
}
- public Comparator getComparator(JXPathDecorator decorator, int pos) {
+ public Comparator<O> getComparator(int pos) {
if (comparator == null) {
-
- final String property = tokens[pos];
-
- Class<?> type = getType(decorator, pos);
-
- // does not work with javassist, a shame...
- //Comparator<?> comparator = new BeanComparator(property);
-
- if (Number.class.isAssignableFrom(type) || Comparable.class.isAssignableFrom(type)) {
- comparator = new Comparator() {
- public int compare(Object o1, Object o2) {
- Comparable c1 = getValue(o1);
- Comparable c2 = getValue(o2);
- return c1.compareTo(c2);
- }
-
- public Comparable<Comparable> getValue(Object o) {
- try {
- Object r = PropertyUtils.getProperty(o, property);
- return (Comparable) r;
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- };
- }
- if (comparator == null) {
- throw new IllegalStateException("could not find comparator for type " + type);
- }
- //todo fixme add a default comparator basedon toString() comparator ?
- return comparator;
+ comparator = new JXPathComparator<O>(tokens[pos]);
}
return comparator;
}
- protected Class<?> getType(JXPathDecorator decorator, int pos) {
- ensureTokenIndex(decorator, pos);
-
- String property = getFirstProperty();
-
- if (property == null) {
- throw new NullPointerException("could not find property in " + this);
- }
-
- for (PropertyDescriptor descriptor : decorator.getDescriptors()) {
- if (property.equals(descriptor.getName())) {
- Class<?> type = descriptor.getReadMethod().getReturnType();
- if (type.isPrimitive()) {
- type = MethodUtils.getPrimitiveWrapper(type);
- }
- return type;
- }
- }
- throw new IllegalStateException("could not find read method for property " + property);
+ public void setComparator(Comparator<O> comparator) {
+ this.comparator = comparator;
}
@Override
@@ -159,7 +154,7 @@
}
/** the computed context of the decorator */
- protected Context context;
+ protected Context<O> context;
/** nb jxpath tokens to compute */
protected int nbToken;
@@ -167,9 +162,6 @@
/** the initial expression used to compute the decorator context. */
protected String initialExpression;
- /** cache of descriptors of the internal class (used for sorting) */
- protected transient PropertyDescriptor[] descriptors;
-
public String toString(Object bean) {
if (bean == null) {
return null;
@@ -177,11 +169,17 @@
JXPathContext jxcontext = JXPathContext.newContext(bean);
Object[] args = new Object[nbToken];
for (int i = 0; i < nbToken; i++) {
- args[i] = jxcontext.getValue(context.tokens[i]);
+ args[i] = getTokenValue(jxcontext, context.tokens[i]);
}
return String.format(context.expression, args);
}
+ @SuppressWarnings({"unchecked"})
+ protected Comparable<Comparable> getTokenValue(JXPathContext jxcontext, String token) {
+ // assume all values are comparable
+ return (Comparable<Comparable>) jxcontext.getValue(token);
+ }
+
public String getProperty(int pos) {
return getTokens()[pos];
}
@@ -207,14 +205,7 @@
return super.toString() + "<" + context + ">";
}
- public PropertyDescriptor[] getDescriptors() {
- if (descriptors == null) {
- descriptors = PropertyUtils.getPropertyDescriptors(internalClass);
- }
- return descriptors;
- }
-
- public void setContext(Context context) {
+ public void setContext(Context<O> context) {
this.context = context;
this.nbToken = context.tokens.length;
// always reset comparator
@@ -224,11 +215,11 @@
}
}
- protected JXPathDecorator(Class<O> internalClass, String expression, boolean creatContext) throws IllegalArgumentException, NullPointerException {
+ public JXPathDecorator(Class<O> internalClass, String expression, boolean creatContext) throws IllegalArgumentException, NullPointerException {
super(internalClass);
this.initialExpression = expression;
if (creatContext) {
- setContext(createInitialContext(expression));
+ setContext(JXPathDecorator.<O>createInitialContext(expression));
if (log.isDebugEnabled()) {
log.debug(expression + " --> " + this.context);
}
@@ -238,10 +229,10 @@
@SuppressWarnings({"unchecked"})
protected Comparator<O> getComparator(int pos) {
ensureTokenIndex(this, pos);
- return context.getComparator(this, pos);
+ return context.getComparator(pos);
}
- protected static Context createInitialContext(String expression) {
+ public static <O> Context<O> createInitialContext(String expression) {
List<String> lTokens = new ArrayList<String>();
StringBuilder buffer = new StringBuilder();
int size = expression.length();
@@ -271,7 +262,7 @@
// suffix after end jxpath (or all expression if no jxpath)
buffer.append(expression.substring(end + 1));
}
- return new Context(buffer.toString(), lTokens.toArray(new String[lTokens.size()]));
+ return new Context<O>(buffer.toString(), lTokens.toArray(new String[lTokens.size()]));
}
protected static void ensureTokenIndex(JXPathDecorator decorator, int pos) {
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/MultiJXPathDecorator.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/MultiJXPathDecorator.java 2008-12-23 10:31:56 UTC (rev 1090)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/MultiJXPathDecorator.java 2008-12-23 10:35:41 UTC (rev 1091)
@@ -35,19 +35,19 @@
String separatorReplacement)
throws IllegalArgumentException, NullPointerException {
- Context[] contexts = createInitialContexts(expression, separator, separatorReplacement);
+ Context<O>[] contexts = createInitialContexts(expression, separator, separatorReplacement);
return new MultiJXPathDecorator<O>(internalClass, expression, separator, separatorReplacement, contexts);
}
- protected Context[] contexts;
+ protected Context<O>[] contexts;
protected String separator;
protected String separatorReplacement;
- protected MultiJXPathDecorator(Class<O> internalClass, String expression,
- String separator, String separatorReplacement,
- Context[] contexts) throws IllegalArgumentException, NullPointerException {
+ public MultiJXPathDecorator(Class<O> internalClass, String expression,
+ String separator, String separatorReplacement,
+ Context<O>[] contexts) throws IllegalArgumentException, NullPointerException {
super(internalClass, expression, false);
this.separator = separator;
this.separatorReplacement = separatorReplacement;
@@ -80,13 +80,16 @@
@Override
protected Comparator<O> getComparator(int pos) {
ensureContextIndex(this, pos);
- return contexts[pos].getComparator(this, 0);
+ Context<O> context1 = contexts[pos];
+ return context1.getComparator(0);
}
- protected static Context[] createInitialContexts(String expression, String separator, String separatorReplacement) {
+ public static <O> Context<O>[] createInitialContexts(String expression, String separator, String separatorReplacement) {
int sep = expression.indexOf(separator);
if (sep == -1) {
- return new Context[]{createInitialContext(expression)};
+ Context<O>[] result = MultiJXPathDecorator.newInstance(1);
+ result[0] = createInitialContext(expression);
+ return result;
}
List<String> tokens = new ArrayList<String>();
@@ -96,7 +99,7 @@
}
int nbTokens = tokens.size();
- Context[] contexts = new Context[nbTokens];
+ Context<O>[] contexts = newInstance(nbTokens);
for (int i = 0; i < nbTokens; i++) {
StringBuilder buffer = new StringBuilder(expression.length());
for (int j = 0; j < nbTokens; j++) {
@@ -116,4 +119,10 @@
}
}
+ @SuppressWarnings({"unchecked"})
+ protected static <O> Context<O>[] newInstance(int size) {
+ // fixme how to instanciate a typed array with no checking warning ?
+ return new Context[size];
+ }
+
}
\ No newline at end of file
Copied: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/DecoratorTableCellRenderer.java (from rev 1060, lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/I18nTableCellHeaderRenderer.java)
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/DecoratorTableCellRenderer.java (rev 0)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/DecoratorTableCellRenderer.java 2008-12-23 10:35:41 UTC (rev 1091)
@@ -0,0 +1,33 @@
+package jaxx.runtime.swing;
+
+import jaxx.runtime.Decorator;
+
+import javax.swing.JTable;
+import javax.swing.table.TableCellRenderer;
+import java.awt.Component;
+
+/**
+ * A simple TableCellRenderer using a delegate TableCellRenderer to render everything elese thant the text :
+ * the text is I18nalize.
+ *
+ * @author chemit
+ */
+public class DecoratorTableCellRenderer implements TableCellRenderer {
+
+ /** the delegate cell renderer */
+ protected TableCellRenderer delegate;
+
+ protected Decorator decorator;
+
+ public DecoratorTableCellRenderer(TableCellRenderer delegate, Decorator decorator) {
+ this.delegate = delegate;
+ this.decorator = decorator;
+ }
+
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasfocus, int row, int column) {
+ if (value != null) {
+ value = decorator.toString(value);
+ }
+ return delegate.getTableCellRendererComponent(table, value, isSelected, hasfocus, row, column);
+ }
+}
\ No newline at end of file
Property changes on: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/DecoratorTableCellRenderer.java
___________________________________________________________________
Name: svn:mergeinfo
+
Deleted: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/I18nTableCellHeaderRenderer.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/I18nTableCellHeaderRenderer.java 2008-12-23 10:31:56 UTC (rev 1090)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/I18nTableCellHeaderRenderer.java 2008-12-23 10:35:41 UTC (rev 1091)
@@ -1,38 +0,0 @@
-package jaxx.runtime.swing;
-
-import static org.codelutin.i18n.I18n._;
-
-import javax.swing.JLabel;
-import javax.swing.JTable;
-import javax.swing.table.TableCellRenderer;
-import java.awt.Component;
-
-/**
- * A simple TableCellRenderer using a delegate TableCellRenderer to render everything elese thant the text :
- * the text is I18nalize.
- *
- * @author chemit
- */
-public class I18nTableCellHeaderRenderer implements TableCellRenderer {
-
- /** the libelles to display */
- protected final String[] keys;
-
- /** the delegate cell renderer */
- protected TableCellRenderer delegate;
-
- public I18nTableCellHeaderRenderer(TableCellRenderer delegate, String... keys) {
- this.delegate = delegate;
- this.keys = keys;
- }
-
- public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasfocus, int row, int column) {
- if (column > keys.length) {
- throw new IndexOutOfBoundsException("colum can not be greater than " + keys.length);
- }
- JLabel rendererComponent = (JLabel) delegate.getTableCellRendererComponent(table, value, isSelected, hasfocus, row, column);
-
- rendererComponent.setText(_(keys[column]));
- return rendererComponent;
- }
-}
Copied: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/I18nTableCellRenderer.java (from rev 1060, lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/I18nTableCellHeaderRenderer.java)
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/I18nTableCellRenderer.java (rev 0)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/I18nTableCellRenderer.java 2008-12-23 10:35:41 UTC (rev 1091)
@@ -0,0 +1,42 @@
+package jaxx.runtime.swing;
+
+import static org.codelutin.i18n.I18n._;
+
+import javax.swing.JTable;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumn;
+import java.awt.Component;
+
+/**
+ * A simple TableCellRenderer using a delegate TableCellRenderer to render everything elese thant the text :
+ * the text is I18nalize.
+ *
+ * @author chemit
+ */
+public class I18nTableCellRenderer implements TableCellRenderer {
+
+ /** the libelles to display */
+ protected final String[] keys;
+
+ /** the delegate cell renderer */
+ protected TableCellRenderer delegate;
+
+ public I18nTableCellRenderer(TableCellRenderer delegate, String... keys) {
+ this.delegate = delegate;
+ this.keys = keys;
+ }
+
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasfocus, int row, int column) {
+ if (column > keys.length) {
+ throw new IndexOutOfBoundsException("colum can not be greater than " + keys.length);
+ }
+ TableColumn col = table.getColumn(table.getColumnName(column));
+ value = _(keys[col.getModelIndex()]);
+ return delegate.getTableCellRendererComponent(table, value, isSelected, hasfocus, row, column);
+
+ /*JLabel rendererComponent = (JLabel) delegate.getTableCellRendererComponent(table, value, isSelected, hasfocus, row, column);
+
+ rendererComponent.setText(_(keys[column]));
+ return rendererComponent;*/
+ }
+}
Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/Utils.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/Utils.java 2008-12-23 10:31:56 UTC (rev 1090)
+++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/swing/Utils.java 2008-12-23 10:35:41 UTC (rev 1091)
@@ -7,7 +7,11 @@
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
+import javax.swing.JTable;
import javax.swing.SwingUtilities;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumn;
import javax.swing.text.AbstractDocument;
import javax.swing.text.JTextComponent;
import java.lang.reflect.Field;
@@ -104,4 +108,22 @@
model.setSelectedItem(select);
}
+ public static void fixTableColumnWidth(JTable table, int columnIndex, int width) {
+ TableColumn column = table.getColumnModel().getColumn(columnIndex);
+ column.setMaxWidth(width);
+ column.setMinWidth(width);
+ column.setWidth(width);
+ column.setPreferredWidth(width);
+ }
+
+ public static void setTableColumnEditor(JTable table, int columnIndex, TableCellEditor editor) {
+ TableColumn column = table.getColumnModel().getColumn(columnIndex);
+ column.setCellEditor(editor);
+ }
+
+ public static void setTableColumnRenderer(JTable table, int columnIndex, TableCellRenderer editor) {
+ TableColumn column = table.getColumnModel().getColumn(columnIndex);
+ column.setCellRenderer(editor);
+ }
+
}
Modified: lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/JXPathDecoratorTest.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/JXPathDecoratorTest.java 2008-12-23 10:31:56 UTC (rev 1090)
+++ lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/JXPathDecoratorTest.java 2008-12-23 10:35:41 UTC (rev 1091)
@@ -1,9 +1,15 @@
package jaxx.runtime;
+import jaxx.runtime.JXPathDecorator.Context;
import org.junit.After;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
/** @author chemit */
public class JXPathDecoratorTest {
@@ -76,6 +82,67 @@
assertDecoratorInternal();
}
+ public static class Data {
+ int pos;
+ String name;
+
+ protected static List<Data> generate(int nb) {
+ List<Data> datas = new ArrayList<Data>(nb);
+ for (int i = 0; i < nb; i++) {
+ datas.add(new Data(i, "name_" + (nb - i)));
+ }
+ return datas;
+ }
+
+ Data(int pos, String name) {
+ this.pos = pos;
+ this.name = name;
+ }
+
+ public int getPos() {
+ return pos;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String toString() {
+ return "Data{pos=" + pos + ", name='" + name + '\'' + '}';
+ }
+ }
+
+ @Test
+ public void testSort() throws Exception {
+
+ List<Data> datas = Data.generate(10);
+ JXPathDecorator<Data> decorator = JXPathDecorator.newDecorator(Data.class, "${pos}$d ${name}$s");
+
+ List<Data> sortData = new ArrayList<Data>(datas);
+ JXPathDecorator.sort(decorator, sortData, 0);
+ for (int i = 0; i < datas.size(); i++) {
+ Data data = datas.get(i);
+ Data sData = sortData.get(i);
+ assertEquals(data, sData);
+ }
+ Collections.sort(datas, new Comparator<Data>() {
+ @Override
+ public int compare(Data o1, Data o2) {
+ return o1.name.compareTo(o2.name);
+ }
+ });
+ Context<Data> context = decorator.context;
+ context.setComparator(null);
+ JXPathDecorator.sort(decorator, sortData, 1);
+ for (int i = 0; i < datas.size(); i++) {
+ Data data = datas.get(i);
+ Data sData = sortData.get(i);
+ assertEquals(data, sData);
+ }
+ }
+
+
public void assertDecoratorInternal(String... tokens) {
assertTokens(tokens);
expected = String.format(decorator.getExpression(), decorator.getExpression(), decorator.getNbToken());
Modified: lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/MultiJXPathDecoratorTest.java
===================================================================
--- lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/MultiJXPathDecoratorTest.java 2008-12-23 10:31:56 UTC (rev 1090)
+++ lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/MultiJXPathDecoratorTest.java 2008-12-23 10:35:41 UTC (rev 1091)
@@ -1,9 +1,15 @@
package jaxx.runtime;
+import jaxx.runtime.JXPathDecoratorTest.Data;
import org.junit.After;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
/** @author chemit */
public class MultiJXPathDecoratorTest {
@@ -128,6 +134,35 @@
assertEquals(expected, result);
}
+ @Test
+ public void testSort() throws Exception {
+
+ List<Data> datas = Data.generate(10);
+
+ MultiJXPathDecorator<Data> decorator = MultiJXPathDecorator.newDecorator(Data.class, "${pos}$d-${name}$s", "-");
+
+ List<Data> sortData = new ArrayList<Data>(datas);
+ JXPathDecorator.sort(decorator, sortData, 0);
+ for (int i = 0; i < datas.size(); i++) {
+ Data data = datas.get(i);
+ Data sData = sortData.get(i);
+ assertEquals(data, sData);
+ }
+ Collections.sort(datas, new Comparator<Data>() {
+ @Override
+ public int compare(Data o1, Data o2) {
+ return o1.name.compareTo(o2.name);
+ }
+ });
+ decorator.setContextIndex(1);
+ JXPathDecorator.sort(decorator, sortData, 1);
+ for (int i = 0; i < datas.size(); i++) {
+ Data data = datas.get(i);
+ Data sData = sortData.get(i);
+ assertEquals(data, sData);
+ }
+ }
+
public void assertDecoratorInternal(String... tokens) {
assertTokens(tokens);
expected = String.format(decorator.getExpression(), decorator.getExpression(), decorator.getNbToken());
1
0