r1813 - trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation
Author: tchemit Date: 2010-03-26 15:57:07 +0100 (Fri, 26 Mar 2010) New Revision: 1813 Log: improve Navigation model Added: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/NavigationTreeNodeModel.java Removed: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/NavigationTreeNodeModel.java Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/AbstractNavigationModel.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/NavigationTreeTableModel.java Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/AbstractNavigationModel.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/AbstractNavigationModel.java 2010-03-26 12:32:10 UTC (rev 1812) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/AbstractNavigationModel.java 2010-03-26 14:57:07 UTC (rev 1813) @@ -24,10 +24,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.MutableTreeNode; -import javax.swing.tree.TreeNode; -import java.lang.reflect.Array; +import javax.swing.event.TreeModelListener; +import javax.swing.tree.TreeModel; +import javax.swing.tree.TreePath; import java.util.Enumeration; import java.util.StringTokenizer; import java.util.regex.Matcher; @@ -41,13 +40,16 @@ * @param <E> the type of nodes in model * @since 2.0.1 */ -public abstract class AbstractNavigationModel<E extends NavigationNode<E>> extends DefaultTreeModel implements NavigationModel<E> { +public abstract class AbstractNavigationModel<E extends NavigationNode<E>> implements NavigationModel<E> { +//public abstract class AbstractNavigationModel<E extends NavigationNode<E>> extends DefaultTreeModel implements NavigationModel<E> { - static private final long serialVersionUID = 1L; +// static private final long serialVersionUID = 1L; /** Logger */ static private final Log log = LogFactory.getLog(NavigationTreeNodeModel.class); + final TreeModel delegate; + /** * The path separator used to build the {@link NavigationTreeNode#fullPath}. * @@ -59,50 +61,45 @@ /** Context to retrieve beans */ private JAXXContext context; - public AbstractNavigationModel(String pathSeparator, JAXXContext context) { - super(null); + public AbstractNavigationModel(TreeModel delegate, String pathSeparator, JAXXContext context) { this.pathSeparator = pathSeparator; this.context = context; + this.delegate = delegate; } @Override - public E getRoot() { - return (E) super.getRoot(); + public final E getRoot() { + return (E) getDelegate().getRoot(); } @Override - public void setRoot(E root) { - setRoot((TreeNode) root); - } - - @Override - public E findNode(String path) { + public final E findNode(String path) { return findNode(getRoot(), path, (Pattern) null); } @Override - public E findNode(String path, String regex) { + public final E findNode(String path, String regex) { return findNode(getRoot(), path, regex); } @Override - public E findNode(String path, Pattern regex) { + public final E findNode(String path, Pattern regex) { return findNode(getRoot(), path, regex); } @Override - public E findNode(E root, String path) { + public final E findNode(E root, String path) { return findNode(root, path, (Pattern) null); } @Override - public E findNode(E root, String path, String regex) { + public final E findNode(E root, String path, String regex) { return findNode(root, path, regex == null ? null : Pattern.compile(regex)); } @Override - public E findNode(E root, String path, Pattern regex) { + public final E findNode(E root, String path, Pattern regex) { if (regex != null) { Matcher matcher = regex.matcher(path); if (!matcher.matches() || matcher.groupCount() < 1) { @@ -134,8 +131,17 @@ return context; } + public TreeModel getDelegate() { + return delegate; + } + @Override - public Object getBean(String navigationPath) { + public final String getPathSeparator() { + return pathSeparator; + } + + @Override + public final Object getBean(String navigationPath) { Object result; E node = findNode(navigationPath, (Pattern) null); result = getBean(node); @@ -143,7 +149,7 @@ } @Override - public Object getBean(E node) { + public final Object getBean(E node) { if (node == null) { return null; //fixme should throw a NPE exception @@ -153,43 +159,18 @@ } @Override - public void nodeChanged(E node) { + public final void nodeChanged(E node) { nodeChanged(node, false); if (log.isDebugEnabled()) { log.debug(node); } } - @Override - public void nodeStructureChanged(E node) { - E n = node; - //TC-20091004 never launch a deep reload - reload(n, true); - nodeStructureChanged((TreeNode) node); - if (log.isDebugEnabled()) { - log.debug(node); - } - } - - @Override - public void nodeChanged(E node, boolean deep) { - - E n = node; - //TC-20091004 never launch a deep clean, since we do a deep nodeChanged. - reload(n, deep); - nodeChanged((TreeNode) node); - } - - @Override - public String getPathSeparator() { - return pathSeparator; - } - - protected void reload(E node) { + protected final void reload(E node) { reload(node, false); } - protected void reload(E node, boolean deep) { + protected final void reload(E node, boolean deep) { if (node == null) { return; } @@ -204,16 +185,42 @@ } } + //-------------------------------------------------------------------------- + // TreeModel implementation + //-------------------------------------------------------------------------- + @Override - public E[] getPathToRoot(E aNode) { - TreeNode[] treeNodes = getPathToRoot((TreeNode) aNode); - E[] result = (E[]) Array.newInstance(aNode.getClass(), treeNodes.length); - System.arraycopy(treeNodes, 0, result, 0, treeNodes.length); - return result; + public final Object getChild(Object parent, int index) { + return getDelegate().getChild(parent, index); } @Override - public void removeNodeFromParent(E node) { - removeNodeFromParent((MutableTreeNode) node); + public final int getChildCount(Object parent) { + return getDelegate().getChildCount(parent); } + + @Override + public final boolean isLeaf(Object node) { + return getDelegate().isLeaf(node); + } + + @Override + public final void valueForPathChanged(TreePath path, Object newValue) { + getDelegate().valueForPathChanged(path, newValue); + } + + @Override + public final int getIndexOfChild(Object parent, Object child) { + return getDelegate().getIndexOfChild(parent, child); + } + + @Override + public final void addTreeModelListener(TreeModelListener l) { + getDelegate().addTreeModelListener(l); + } + + @Override + public final void removeTreeModelListener(TreeModelListener l) { + getDelegate().removeTreeModelListener(l); + } } Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/NavigationTreeNodeModel.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/NavigationTreeNodeModel.java 2010-03-26 12:32:10 UTC (rev 1812) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/NavigationTreeNodeModel.java 2010-03-26 14:57:07 UTC (rev 1813) @@ -1,40 +0,0 @@ -/* - * *##% - * JAXX Runtime - * Copyright (C) 2008 - 2009 CodeLutin - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * ##%* - */ -package jaxx.runtime.swing.navigation; - -import jaxx.runtime.JAXXContext; - -/** - * Model of the tree used for a navigation tree. - * <p/> - * Il est composé de {@link NavigationTreeNode} - * - * @author chemit - * @since 1.7.2 - */ -public class NavigationTreeNodeModel extends AbstractNavigationModel<NavigationTreeNode> { - - private static final long serialVersionUID = 1L; - - public NavigationTreeNodeModel(String pathSeparator, JAXXContext context) { - super(pathSeparator, context); - } -} Added: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/NavigationTreeNodeModel.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/NavigationTreeNodeModel.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/NavigationTreeNodeModel.java 2010-03-26 14:57:07 UTC (rev 1813) @@ -0,0 +1,99 @@ +/* + * *##% + * JAXX Runtime + * Copyright (C) 2008 - 2009 CodeLutin + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * ##%* + */ +package jaxx.runtime.swing.navigation; + +import jaxx.runtime.JAXXContext; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeModel; +import javax.swing.tree.TreeNode; + +/** + * Model of the tree used for a navigation tree. + * <p/> + * Il est composé de {@link NavigationTreeNode} + * + * @author chemit + * @since 1.7.2 + */ +public class NavigationTreeNodeModel extends AbstractNavigationModel<NavigationTreeNode> implements TreeModel { + + /** Logger */ + private static final Log log = + LogFactory.getLog(NavigationTreeNodeModel.class); + +// private static final long serialVersionUID = 1L; + + public NavigationTreeNodeModel(String pathSeparator, JAXXContext context) { + super(new DefaultTreeModel(null), pathSeparator, context); + } +// +// @Override +// public NavigationTreeNode getRoot() { +// return (NavigationTreeNode) delegate.getRoot(); +// } + + @Override + public void setRoot(NavigationTreeNode root) { + getDelegate().setRoot(root); + } + + public DefaultTreeModel getDelegate() { + return (DefaultTreeModel) delegate; + } + + @Override + public NavigationTreeNode[] getPathToRoot(NavigationTreeNode aNode) { + TreeNode[] treeNodes = getDelegate().getPathToRoot(aNode); + NavigationTreeNode[] result = new NavigationTreeNode[treeNodes.length]; + System.arraycopy(treeNodes, 0, result, 0, treeNodes.length); + return result; + } + + @Override + public void removeNodeFromParent(NavigationTreeNode node) { + getDelegate().removeNodeFromParent(node); + } + + @Override + public void nodeStructureChanged(NavigationTreeNode node) { + NavigationTreeNode n = node; + //TC-20091004 never launch a deep reload + reload(n, true); + getDelegate().nodeStructureChanged(node); + if (log.isDebugEnabled()) { + log.debug(node); + } + } + + @Override + public void nodeChanged(NavigationTreeNode node, boolean deep) { + + NavigationTreeNode n = node; + //TC-20091004 never launch a deep clean, since we do a deep nodeChanged. + reload(n, deep); + getDelegate().nodeChanged(node); + } + + +} Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/NavigationTreeNodeModel.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/NavigationTreeTableModel.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/NavigationTreeTableModel.java 2010-03-26 12:32:10 UTC (rev 1812) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/navigation/NavigationTreeTableModel.java 2010-03-26 14:57:07 UTC (rev 1813) @@ -25,14 +25,11 @@ import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.tree.TreeModelSupport; import org.jdesktop.swingx.treetable.DefaultTreeTableModel; +import org.jdesktop.swingx.treetable.TreeTableModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; -import java.util.Enumeration; import java.util.List; -import java.util.StringTokenizer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * Model of the tree table used for a navigation tree table. @@ -44,51 +41,67 @@ * @author sletellier * @since 2.0.0 */ -public class NavigationTreeTableModel extends DefaultTreeTableModel implements NavigationModel<NavigationTreeTableNode> { +public class NavigationTreeTableModel extends AbstractNavigationModel<NavigationTreeTableNode> implements TreeTableModel { - static private final long serialVersionUID = 1L; +// static private final long serialVersionUID = 1L; /** Logger */ static private final Log log = LogFactory.getLog(NavigationTreeTableModel.class); - /** - * The path separator used to build the {@link NavigationTreeNode#fullPath}. - * - * @see NavigationTreeNode#getNodePath() - * @see NavigationTreeNode#getFullPath() - */ - protected final String pathSeparator; + public static class MyDefaultTreeTableModel extends DefaultTreeTableModel { - /** Context to retrieve beans */ - private JAXXContext context; + public TreeModelSupport getModelSupport() { + return modelSupport; + } + } +// /** +// * The path separator used to build the {@link NavigationTreeNode#fullPath}. +// * +// * @see NavigationTreeNode#getNodePath() +// * @see NavigationTreeNode#getFullPath() +// */ +// protected final String pathSeparator; +// +// /** Context to retrieve beans */ +// private JAXXContext context; + protected List<String> columnsName; public NavigationTreeTableModel(String pathSeparator, JAXXContext context, List<String> columnsName) { - super(null); - this.pathSeparator = pathSeparator; - this.context = context; + super(new MyDefaultTreeTableModel(), pathSeparator, context); +// this.pathSeparator = pathSeparator; +// this.context = context; this.columnsName = columnsName; } - @Override - public NavigationTreeTableNode getRoot() { - return (NavigationTreeTableNode) super.root; + + public MyDefaultTreeTableModel getDelegate() { + return (MyDefaultTreeTableModel) delegate; } +// @Override +// public NavigationTreeTableNode getRoot() { +// return (NavigationTreeTableNode) getDelegate().getRoot(); +// } + @Override public NavigationTreeTableNode[] getPathToRoot(NavigationTreeTableNode aNode) { if (aNode == null) { return null; } - return (NavigationTreeTableNode[]) super.getPathToRoot(aNode); + TreeNode[] treeNodes = getDelegate().getPathToRoot(aNode); + NavigationTreeTableNode[] result = new NavigationTreeTableNode[treeNodes.length]; + System.arraycopy(treeNodes, 0, result, 0, treeNodes.length); + return result; } @Override public void setRoot(NavigationTreeTableNode root) { - this.root = root; + getDelegate().setRoot(root); +// this.root = root; getModelSupport().fireNewRoot(); } @@ -107,127 +120,126 @@ int index = parent.getIndex(node); node.removeFromParent(); - - modelSupport.fireChildRemoved(new TreePath(getPathToRoot(parent)), - index, node); + getModelSupport().fireChildRemoved(new TreePath(getPathToRoot(parent)), + index, node); } - @Override - public NavigationTreeTableNode findNode(String path) { - return findNode(getRoot(), path, (Pattern) null); - } +// @Override +// public NavigationTreeTableNode findNode(String path) { +// return findNode(getRoot(), path, (Pattern) null); +// } +// +// @Override +// public NavigationTreeTableNode findNode(String path, String regex) { +// return findNode(getRoot(), path, regex); +// } +// +// @Override +// public NavigationTreeTableNode findNode(String path, Pattern regex) { +// return findNode(getRoot(), path, regex); +// } +// +// @Override +// public NavigationTreeTableNode findNode(NavigationTreeTableNode root, +// String path) { +// return findNode(root, path, (Pattern) null); +// } +// +// @Override +// public NavigationTreeTableNode findNode(NavigationTreeTableNode root, +// String path, +// String regex) { +// return findNode(root, path, regex == null ? +// null : Pattern.compile(regex)); +// } +// +// @Override +// public NavigationTreeTableNode findNode(NavigationTreeTableNode root, +// String path, +// Pattern regex) { +// if (regex != null) { +// Matcher matcher = regex.matcher(path); +// if (!matcher.matches() || matcher.groupCount() < 1) { +// log.warn("no matching regex " + regex + " to " + path); +// return null; +// } +// path = matcher.group(1); +// if (log.isDebugEnabled()) { +// log.debug("matching regex " + regex + " : " + path); +// } +// } +// StringTokenizer stk = new StringTokenizer(path, pathSeparator); +// NavigationTreeTableNode result = root; +// // pas the first token (matches the root node) +// if (root.isRoot() && stk.hasMoreTokens()) { +// String rootPath = stk.nextToken(); +// if (!rootPath.equals(root.getNodePath())) { +// return null; +// } +// } +// while (stk.hasMoreTokens()) { +// result = result.getChild(stk.nextToken()); +// } +// return result; +// } +// +// @Override +// public JAXXContext getContext() { +// return context; +// } +// +// @Override +// public Object getBean(String navigationPath) { +// Object result; +// NavigationTreeTableNode node = findNode(navigationPath, (Pattern) null); +// result = getBean(node); +// return result; +// } +// +// @Override +// public Object getBean(NavigationTreeTableNode node) { +// if (node == null) { +// return null; +// //fixme should throw a NPE exception +// //throw new NullPointerException("node can not be null"); +// } +// return node.getBean(getContext()); +// } - @Override - public NavigationTreeTableNode findNode(String path, String regex) { - return findNode(getRoot(), path, regex); - } - @Override - public NavigationTreeTableNode findNode(String path, Pattern regex) { - return findNode(getRoot(), path, regex); - } - - @Override - public NavigationTreeTableNode findNode(NavigationTreeTableNode root, - String path) { - return findNode(root, path, (Pattern) null); - } - - @Override - public NavigationTreeTableNode findNode(NavigationTreeTableNode root, - String path, - String regex) { - return findNode(root, path, regex == null ? - null : Pattern.compile(regex)); - } - - @Override - public NavigationTreeTableNode findNode(NavigationTreeTableNode root, - String path, - Pattern regex) { - if (regex != null) { - Matcher matcher = regex.matcher(path); - if (!matcher.matches() || matcher.groupCount() < 1) { - log.warn("no matching regex " + regex + " to " + path); - return null; - } - path = matcher.group(1); - if (log.isDebugEnabled()) { - log.debug("matching regex " + regex + " : " + path); - } - } - StringTokenizer stk = new StringTokenizer(path, pathSeparator); - NavigationTreeTableNode result = root; - // pas the first token (matches the root node) - if (root.isRoot() && stk.hasMoreTokens()) { - String rootPath = stk.nextToken(); - if (!rootPath.equals(root.getNodePath())) { - return null; - } - } - while (stk.hasMoreTokens()) { - result = result.getChild(stk.nextToken()); - } - return result; - } - - @Override - public JAXXContext getContext() { - return context; - } - - @Override - public Object getBean(String navigationPath) { - Object result; - NavigationTreeTableNode node = findNode(navigationPath, (Pattern) null); - result = getBean(node); - return result; - } - - @Override - public Object getBean(NavigationTreeTableNode node) { - if (node == null) { - return null; - //fixme should throw a NPE exception - //throw new NullPointerException("node can not be null"); - } - return node.getBean(getContext()); - } - - /** * Accessor to tree model support. * * @return tree model support */ protected TreeModelSupport getModelSupport() { - return modelSupport; + return getDelegate().getModelSupport(); } - @Override - public void nodeChanged(NavigationTreeTableNode node) { - if (node != null) { - NavigationTreeTableNode parent = node.getParent(); - NavigationTreeTableNode[] treeNodes = getPathToRoot(parent); - if (treeNodes != null) { - modelSupport.fireChildChanged( - new TreePath(treeNodes), parent.getIndex(node), node); - } else { - log.error("[Node changed] Path to root is null !"); - } - reload((NavigationTreeTableNode) node, true); - } else { - log.error("Node is null !"); - } - } +// @Override +// public void nodeChanged(NavigationTreeTableNode node) { +// if (node != null) { +// NavigationTreeTableNode parent = node.getParent(); +// NavigationTreeTableNode[] treeNodes = getPathToRoot(parent); +// if (treeNodes != null) { +// getModelSupport().fireChildChanged( +// new TreePath(treeNodes), parent.getIndex(node), node); +// } else { +// log.error("[Node changed] Path to root is null !"); +// } +// reload((NavigationTreeTableNode) node, true); +// } else { +// log.error("Node is null !"); +// } +// } @Override public void nodeStructureChanged(NavigationTreeTableNode node) { if (node != null) { - NavigationTreeTableNode parent = node.getParent(); + NavigationTreeTableNode parent = node.getParent(); TreeNode[] treeNodes = getPathToRoot(parent); if (treeNodes != null) { - modelSupport.fireTreeStructureChanged(new TreePath(treeNodes)); + getModelSupport().fireTreeStructureChanged(new TreePath(treeNodes)); } else { log.error("[Node structure changed] Path to root is null !"); } @@ -243,7 +255,7 @@ NavigationTreeTableNode parent = node.getParent(); TreeNode[] treeNodes = getPathToRoot(parent); if (treeNodes != null) { - modelSupport.fireChildChanged( + getModelSupport().fireChildChanged( new TreePath(treeNodes), parent.getIndex(node), node); } else { log.error("[Node changed] Path to root is null !"); @@ -253,10 +265,15 @@ log.error("Node is null !"); } } +// +// @Override +// public String getPathSeparator() { +// return pathSeparator; +// } @Override - public String getPathSeparator() { - return pathSeparator; + public Class<?> getColumnClass(int i) { + return getDelegate().getColumnClass(i); } @Override @@ -269,23 +286,43 @@ return columnsName.get(column); } - protected void reload(NavigationTreeTableNode node) { - reload(node, false); + @Override + public int getHierarchicalColumn() { + return getDelegate().getHierarchicalColumn(); } - protected void reload(NavigationTreeTableNode node, boolean deep) { - if (node == null) { - return; - } - node.reload(getContext()); + @Override + public Object getValueAt(Object o, int i) { + return getDelegate().getValueAt(o, i); + } - if (deep) { - Enumeration<?> childs = node.children(); - while (childs.hasMoreElements()) { - NavigationTreeTableNode o = (NavigationTreeTableNode) childs.nextElement(); - reload(o, true); - } - } + @Override + public boolean isCellEditable(Object o, int i) { + return getDelegate().isCellEditable(o, i); } + @Override + public void setValueAt(Object o, Object o1, int i) { + getDelegate().setValueAt(o, o1, i); + } +// +// protected void reload(NavigationTreeTableNode node) { +// reload(node, false); +// } +// +// protected void reload(NavigationTreeTableNode node, boolean deep) { +// if (node == null) { +// return; +// } +// node.reload(getContext()); +// +// if (deep) { +// Enumeration<?> childs = node.children(); +// while (childs.hasMoreElements()) { +// NavigationTreeTableNode o = (NavigationTreeTableNode) childs.nextElement(); +// reload(o, true); +// } +// } +// } + }
participants (1)
-
tchemit@users.nuiton.org