r1819 - in trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation: . tree treetable
Author: sletellier Date: 2010-03-30 14:52:36 +0200 (Tue, 30 Mar 2010) New Revision: 1819 Log: Try to find an implementation to sort nodes when they are inserted. This method work fine when sort by rederer, but not with owns comparators. This commit it just to keep a trace : before release, revert or fix it ;) Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/AbstractNavigationModelBuilder.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/tree/NavigationTreeModelBuilder.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/treetable/NavigationTreeTableModelBuilder.java Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/AbstractNavigationModelBuilder.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/AbstractNavigationModelBuilder.java 2010-03-30 12:44:07 UTC (rev 1818) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/AbstractNavigationModelBuilder.java 2010-03-30 12:52:36 UTC (rev 1819) @@ -21,13 +21,14 @@ package jaxx.runtime.swing.navigation; import jaxx.runtime.JAXXAction; +import jaxx.runtime.JAXXContext; import jaxx.runtime.JAXXObject; import jaxx.runtime.context.JAXXContextEntryDef; import jaxx.runtime.decorator.Decorator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import java.util.Enumeration; +import java.util.*; /** * Interface to create a builder, this object is design to build a {@link @@ -56,6 +57,12 @@ /** [optional] default action class */ protected Class<? extends JAXXAction> defaultUIHandlerClass; + protected Comparator<NavigationNode> rendererComparator; + + protected boolean useRendererComparator; + + protected List<JAXXComparator<?>> comparators; + public AbstractNavigationModelBuilder( Class<? extends JAXXObject> defaultUIClass, Class<? extends JAXXAction> defaultUIHandlerClass, @@ -65,6 +72,52 @@ this.model = model; } + public AbstractNavigationModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + NavigationModel<E> model, + boolean useRendererComparator) { + this.defaultUIClass = defaultUIClass; + this.defaultUIHandlerClass = defaultUIHandlerClass; + this.model = model; + this.useRendererComparator = useRendererComparator; + } + + public AbstractNavigationModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + NavigationModel<E> model, + JAXXContext context, + JAXXComparator<?> comparator) { + this.defaultUIClass = defaultUIClass; + this.defaultUIHandlerClass = defaultUIHandlerClass; + this.model = model; + this.comparators = new ArrayList<JAXXComparator<?>>(); + comparators.add(comparator); + } + + public AbstractNavigationModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + NavigationModel<E> model, + List<JAXXComparator<?>> comparators) { + this.defaultUIClass = defaultUIClass; + this.defaultUIHandlerClass = defaultUIHandlerClass; + this.model = model; + this.comparators = comparators; + } + + public AbstractNavigationModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + NavigationModel<E> model, + JAXXComparator<?> ... comparators) { + this.defaultUIClass = defaultUIClass; + this.defaultUIHandlerClass = defaultUIHandlerClass; + this.model = model; + this.comparators = Arrays.asList(comparators); + } + @Override public NavigationModel<E> getModel() { return model; @@ -262,10 +315,115 @@ if (parentNode == null) { model.setRoot(node); } else { - parentNode.add(node); + boolean useExternalComparators = + (comparators != null && !comparators.isEmpty()); + if (!useRendererComparator && !useExternalComparators){ + parentNode.add(node); + } else { + Enumeration<? extends E> childEnum = parentNode.children(); + + List<E> children = Collections.list((Enumeration<E>) childEnum); + + if (children.isEmpty()){ + parentNode.add(node); + } else { + children.add(node); + + if (useExternalComparators){ + children = sortWithComparators(children); + } else { + Collections.sort(children, getRendererComparator()); + } + int i = children.indexOf(node); + + if (log.isDebugEnabled()){ + log.debug("Use external comparator : " + useExternalComparators + + " adding child " + (node.getFullPath()) + + " to parent " + (parentNode.getFullPath()) + + " at " + i); + } + + parentNode.insert(node, i); + } + } } model.nodeStructureChanged(parentNode == null ? node : parentNode); return node; } + // Try to find a solution to sort node with comparator + // This one don't work, i think new nodes dont have bean + protected List<E> sortWithComparators(List<E> children) { + for (JAXXComparator<?> comparator : comparators){ + Class<? extends Object> beanType = children.get(0).getBean(model.getContext()).getClass(); + if (comparator.getClazz() + .isAssignableFrom(beanType)){ + List<E> result = sortWithComparator(children, comparator); + if (result != null){ + return result; + } + } + } + return children; + } + + protected <T> List<E> sortWithComparator( + List<E> children, + JAXXComparator<T> comparator) { + + Map<T, E> toSort = new HashMap<T, E>(); + + List<T> beans = new ArrayList<T>(); + + // Extract beans + int cnt = 0; + for (E child : children){ + Object o = child.getBean(model.getContext()); + T casted = (T) o; + beans.add(casted); + toSort.put(casted, child); + if (log.isDebugEnabled()){ + log.debug("Will sort : " + ++cnt + " - " + (casted == null ? "null" : casted.toString())); + } + } + + // Sort beans + Collections.sort(beans, comparator); + + // Retrieve sorted nodes + children.clear(); + cnt = 0; + for (T bean : beans){ + E retrieveNode = toSort.get(bean); + if (log.isDebugEnabled()){ + log.debug("Retrieve sorted bean : " + + ++cnt + " - " + (bean == null ? "null" : bean.toString())); + } + children.add(retrieveNode); + } + return children; + } + + protected Comparator<NavigationNode> getRendererComparator(){ + if (rendererComparator == null){ + rendererComparator = new Comparator<NavigationNode>() { + + @Override + public int compare(NavigationNode o1, NavigationNode o2) { + String label1 = o1.getRenderer().toString(); + String label2 = o2.getRenderer().toString(); + if (label1 == null || label2 == null){ + return 0; + } + return label1.compareTo(label2); + } + }; + } + return rendererComparator; + } + + public interface JAXXComparator<T> extends Comparator<T>{ + + Class<T> getClazz(); + } } Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/tree/NavigationTreeModelBuilder.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/tree/NavigationTreeModelBuilder.java 2010-03-30 12:44:07 UTC (rev 1818) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/tree/NavigationTreeModelBuilder.java 2010-03-30 12:52:36 UTC (rev 1819) @@ -29,6 +29,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.Comparator; +import java.util.List; + /** * This object is design to build a {@link NavigationTreeModel}. * @@ -54,12 +57,96 @@ } public NavigationTreeModelBuilder( + String pathSeparator, + JAXXContext context, Class<? extends JAXXObject> defaultUIClass, Class<? extends JAXXAction> defaultUIHandlerClass, + boolean useRendererComparator) { + this(defaultUIClass, + defaultUIHandlerClass, + new NavigationTreeModel(pathSeparator, context), + useRendererComparator + ); + } + + public NavigationTreeModelBuilder( + String pathSeparator, + JAXXContext context, + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + JAXXComparator<?> comparator) { + this(defaultUIClass, + defaultUIHandlerClass, + new NavigationTreeModel(pathSeparator, context), + comparator + ); + } + + public NavigationTreeModelBuilder( + String pathSeparator, + JAXXContext context, + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + List<JAXXComparator<?>> comparators) { + this(defaultUIClass, + defaultUIHandlerClass, + new NavigationTreeModel(pathSeparator, context), + comparators + ); + } + + public NavigationTreeModelBuilder( + String pathSeparator, + JAXXContext context, + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + JAXXComparator<?> ... comparators) { + this(defaultUIClass, + defaultUIHandlerClass, + new NavigationTreeModel(pathSeparator, context), + comparators + ); + } + + public NavigationTreeModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, NavigationTreeModel model) { super(defaultUIClass, defaultUIHandlerClass, model); } + public NavigationTreeModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + NavigationTreeModel model, + boolean useRendererComparator) { + super(defaultUIClass, defaultUIHandlerClass, model, useRendererComparator); + } + + public NavigationTreeModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + NavigationTreeModel model, + JAXXComparator<?> comparator) { + super(defaultUIClass, defaultUIHandlerClass, model, comparator); + } + + public NavigationTreeModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + NavigationTreeModel model, + List<JAXXComparator<?>> comparators) { + super(defaultUIClass, defaultUIHandlerClass, model, comparators); + } + + public NavigationTreeModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + NavigationTreeModel model, + JAXXComparator<?> ... comparators) { + super(defaultUIClass, defaultUIHandlerClass, model, comparators); + } + @Override public NavigationTreeNode createNavigationNode( String pathSeparator, Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/treetable/NavigationTreeTableModelBuilder.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/treetable/NavigationTreeTableModelBuilder.java 2010-03-30 12:44:07 UTC (rev 1818) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/treetable/NavigationTreeTableModelBuilder.java 2010-03-30 12:52:36 UTC (rev 1819) @@ -5,12 +5,13 @@ import jaxx.runtime.JAXXObject; import jaxx.runtime.context.JAXXContextEntryDef; import jaxx.runtime.swing.navigation.AbstractNavigationModelBuilder; +import jaxx.runtime.swing.navigation.NavigationModel; +import jaxx.runtime.swing.navigation.NavigationNode; -import java.util.List; +import java.util.*; public class NavigationTreeTableModelBuilder extends AbstractNavigationModelBuilder<NavigationTreeTableNode> { - public NavigationTreeTableModelBuilder( String pathSeparator, JAXXContext context, @@ -24,12 +25,100 @@ } public NavigationTreeTableModelBuilder( + String pathSeparator, + JAXXContext context, Class<? extends JAXXObject> defaultUIClass, Class<? extends JAXXAction> defaultUIHandlerClass, + List<String> columnsName, + boolean useRendererComparator) { + this(defaultUIClass, + defaultUIHandlerClass, + new NavigationTreeTableModel(pathSeparator, context, columnsName), + useRendererComparator + ); + } + + public NavigationTreeTableModelBuilder( + String pathSeparator, + JAXXContext context, + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + List<String> columnsName, + JAXXComparator<?> comparator) { + this(defaultUIClass, + defaultUIHandlerClass, + new NavigationTreeTableModel(pathSeparator, context, columnsName), + comparator + ); + } + + public NavigationTreeTableModelBuilder( + String pathSeparator, + JAXXContext context, + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + List<String> columnsName, + List<JAXXComparator<?>> comparators) { + this(defaultUIClass, + defaultUIHandlerClass, + new NavigationTreeTableModel(pathSeparator, context, columnsName), + comparators + ); + } + + public NavigationTreeTableModelBuilder( + String pathSeparator, + JAXXContext context, + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + List<String> columnsName, + JAXXComparator<?> ... comparators) { + this(defaultUIClass, + defaultUIHandlerClass, + new NavigationTreeTableModel(pathSeparator, context, columnsName), + comparators + ); + } + + public NavigationTreeTableModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, NavigationTreeTableModel model) { super(defaultUIClass, defaultUIHandlerClass, model); } + public NavigationTreeTableModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + NavigationTreeTableModel model, + boolean useRendererComparator) { + super(defaultUIClass, defaultUIHandlerClass, model, useRendererComparator); + } + + public NavigationTreeTableModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + NavigationTreeTableModel model, + JAXXComparator<?> comparator) { + super(defaultUIClass, defaultUIHandlerClass, model, comparator); + } + + public NavigationTreeTableModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + NavigationTreeTableModel model, + List<JAXXComparator<?>> comparators) { + super(defaultUIClass, defaultUIHandlerClass, model, comparators); + } + + public NavigationTreeTableModelBuilder( + Class<? extends JAXXObject> defaultUIClass, + Class<? extends JAXXAction> defaultUIHandlerClass, + NavigationTreeTableModel model, + JAXXComparator<?>... comparators) { + super(defaultUIClass, defaultUIHandlerClass, model, comparators); + } + @Override public NavigationTreeTableNode createNavigationNode( String pathSeparator,
participants (1)
-
sletellier@users.nuiton.org