Author: tchemit Date: 2010-06-30 19:24:16 +0200 (Wed, 30 Jun 2010) New Revision: 2014 Url: http://nuiton.org/repositories/revision/jaxx/2014 Log: normalize nav api Added: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/NavDemo.jaxx trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavBridge.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavDataProvider.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavHelper.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavNode.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavNodeChildLoador.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/AbstractNavTreeCellRenderer.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeBridge.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeHelper.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeNode.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeNodeChildLoador.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/package.html trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableBridge.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableHelper.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableModel.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNode.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNodeChildLoador.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/package.html Removed: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/JaxxNavDemo.jaxx trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/DataProvider.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNavBridge.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNavHelper.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNode.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNodeChildLoador.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/AbstractJaxxTreeCellRenderer.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeBridge.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeHelper.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeNode.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeNodeChildLoador.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableBridge.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableHelper.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableModel.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableNode.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableNodeChildLoador.java Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/DemoConfig.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/NavDemoDataProvider.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/ActorsTreeNodeLoador.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/MoviesTreeNodeLoador.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/NavDemoTreeCellRenderer.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/NavDemoTreeHelper.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/NavDemoTreeNode.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/ActorsTreeTableNodeLoador.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/MoviesTreeTableNodeLoador.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/NavDemoTreeTableHelper.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/NavDemoTreeTableModel.java trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/NavDemoTreeTableNode.java trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoCellRenderer.java trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNode.java trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNodeLoador.java trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoTreeHelper.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/package.html Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/DemoConfig.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/DemoConfig.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/DemoConfig.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -25,7 +25,7 @@ package jaxx.demo; -import jaxx.demo.component.jaxx.nav.JaxxNavDemo; +import jaxx.demo.component.jaxx.nav.NavDemo; import jaxx.runtime.JAXXUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -228,7 +228,7 @@ DEMO_PATH( "ui.demo.path", _("jaxxdemo.config.ui.demo.path"), - "jaxxdemo.tree/jaxxdemo.tree.component.jaxx/jaxxdemo.tree.component.jaxx.tree/" + JaxxNavDemo.class.getSimpleName(), + "jaxxdemo.tree/jaxxdemo.tree.component.jaxx/jaxxdemo.tree.component.jaxx.tree/" + NavDemo.class.getSimpleName(), String.class, false, true); Deleted: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/JaxxNavDemo.jaxx =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/JaxxNavDemo.jaxx 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/JaxxNavDemo.jaxx 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,256 +0,0 @@ -<!-- - #%L - JAXX :: Demo - $Id$ - $HeadURL$ - %% - Copyright (C) 2008 - 2010 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>. - #L% - --> - -<jaxx.demo.DemoPanel layout='{new BorderLayout()}'> - - <import> - jaxx.runtime.swing.nav.JaxxNode - jaxx.demo.component.jaxx.nav.content.* - jaxx.demo.component.jaxx.nav.tree.* - jaxx.demo.component.jaxx.nav.treetable.* - jaxx.demo.entities.* - jaxx.runtime.decorator.DecoratorProvider - - org.jdesktop.swingx.JXTreeTable - javax.swing.tree.TreePath - java.lang.reflect.Constructor - </import> - - <CardLayout2 id='contentLayout'/> - - <NavDemoDataProvider id='dataProvider'/> - - <NavDemoTreeHelper id='treeHelper' constructorParams='getDataProvider()'/> - - <NavDemoTreeTableHelper id='treeTableHelper' - constructorParams='getDataProvider()'/> - - <script><![CDATA[ - -@Override -protected String[] getSources() { - return new String[]{ getDefaultSource(), - "tree/NavDemoTreeNode.java", - "tree/NavDemoTreeHelper.java", - "tree/NavDemoTreeCellRenderer.java", - "tree/ActorsTreeNodeLoador.java", - "tree/MoviesTreeNodeLoador.java", - "treetable/NavDemoTreeTableNode.java", - "treetable/NavDemoTreeTableHelper.java", - "treetable/ActorsTreeTableNodeLoador.java", - "treetable/MoviesTreeTableNodeLoador.java" - }; -} - -private void $afterCompleteSetup() { - setContextValue(treeHelper, "treeHelper"); - setContextValue(treeTableHelper, "treeTableHelper"); - - // Creation of selection listener to open ui when tree selection change - TreeSelectionListener treeSelectionListener = new TreeSelectionListener() { - @Override - public void valueChanged(TreeSelectionEvent event) { - TreePath path = event.getPath(); - NavDemoTreeNode demoNode = (NavDemoTreeNode) path.getLastPathComponent(); - - if (log.isDebugEnabled()) { - log.debug("Select demoNode " + demoNode); - } - - // Do nothing for root - if (demoNode.isRoot()) { - return; - } - openUI(demoNode); - } - }; - - // Creation of selection listener to open ui when tree selection change - TreeSelectionListener treeTableSelectionListener = new TreeSelectionListener() { - @Override - public void valueChanged(TreeSelectionEvent event) { - TreePath path = event.getPath(); - NavDemoTreeTableNode demoNode = (NavDemoTreeTableNode) path.getLastPathComponent(); - - if (log.isDebugEnabled()) { - log.debug("Select demoNode " + demoNode); - } - - // Do nothing for root - if (demoNode.isRoot()) { - return; - } - openUI(demoNode); - } - }; - - // Register decorator - DecoratorProvider decoratorProvider = getContextValue(DecoratorProvider.class); - - // Attach renderer - navigationTree.setCellRenderer(new NavDemoTreeCellRenderer(decoratorProvider, dataProvider)); - - // Register tree - treeHelper.setUI(navigationTree, true, treeSelectionListener); - - // Register tree table - treeTableHelper.setUI(navigationTreeTable, true, treeTableSelectionListener); - - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - navigationTree.setSelectionInterval(0, 0); - splitPane.resetToPreferredSizes(); - } - }); - - // expand the tree - SwingUtil.expandTree(navigationTree); - SwingUtil.expandTreeTable(navigationTreeTable); - - // auto-expand demoNode when selected - SwingUtil.addExpandOnClickListener(navigationTree); - SwingUtil.addExpandOnClickListener(navigationTreeTable); -} - -protected void openUI(JaxxNode demoNode) { - - // Get demoNode type - Class<?> editType = demoNode.getInternalClass(); - String id = demoNode.getId(); - - // If it's category demoNode - if (editType.equals(String.class)) { - - // Actors categorie demoNode - if (NavDemoTreeHelper.ACTORS_CATEGORY_NODE.equals(id)) { - - java.util.List<People> peoples = dataProvider.getPeoples(); - showUI(peoples, ActorsContentUI.class); - - // Movies categorie demoNode - } else if (NavDemoTreeHelper.MOVIES_CATEGORY_NODE.equals(id)) { - - java.util.List<Movie> movies = dataProvider.getMovies(); - showUI(movies, MoviesContentUI.class); - } - - // People demoNode - } else if (editType.equals(People.class)) { - People people = dataProvider.getPeople(id); - showUI(people, ActorContentUI.class); - - // Movie demoNode - } else if (editType.equals(Movie.class)) { - Movie movie = dataProvider.getMovie(id); - showUI(movie, MovieContentUI.class); - } -} - -// Create by introspection content ui -protected <B> void showUI(B bean, Class<? extends AbstractContentUI> uiClass) { - - // Verify if instance is existing - AbstractContentUI ui = getContentIfExist(uiClass); - - // Get layout identifier - String contentName = uiClass.getName(); - - if (ui == null) { - try { - // Get constructor - Constructor<? extends AbstractContentUI> constructor = - uiClass.getConstructor(JAXXContext.class); - - // Invoke instance creation - ui = constructor.newInstance(this); - } catch (Exception eee) { - log.error(eee); - ErrorDialogUI.showError(eee); - } - - // Add to content panel - content.add(ui, contentName); - } - - // Attach bean - ui.setData(bean); - - // show ui - contentLayout.show(content, contentName); -} - -// Get content if exist in content, else return null -protected <E extends Component> E getContentIfExist(Class<E> uiClass) { - String contentName = uiClass.getName(); - if (log.isDebugEnabled()) { - log.debug("Get content if exist " + contentName); - } - if (!contentLayout.contains(contentName)) { - return null; - } - return (E) contentLayout.getComponent(content, contentName); -} - ]]> - </script> - - <JSplitPane id='splitPane' - constraints='BorderLayout.CENTER' - oneTouchExpandable='true'> - - <JTabbedPane> - <tab title='jaxxdemo.tree.tabtitle'> - <JScrollPane border='{null}' - horizontalScrollBarPolicy='{JScrollPane.HORIZONTAL_SCROLLBAR_NEVER}' - verticalScrollBarPolicy='{JScrollPane.VERTICAL_SCROLLBAR_NEVER}'> - - <JTree id="navigationTree" - font-size='11' - rootVisible='false' - showsRootHandles='false' - model='{treeHelper.createModel()}'/> - - </JScrollPane> - </tab> - <tab title='jaxxdemo.treeTable.tabtitle'> - <JScrollPane border='{null}' - horizontalScrollBarPolicy='{JScrollPane.HORIZONTAL_SCROLLBAR_NEVER}' - verticalScrollBarPolicy='{JScrollPane.VERTICAL_SCROLLBAR_NEVER}'> - - <JXTreeTable id="navigationTreeTable" - font-size='11' - rootVisible='false' - showsRootHandles='false' - treeTableModel='{treeTableHelper.createModel()}'/> - - </JScrollPane> - </tab> - </JTabbedPane> - - <JPanel id="content" layout="{contentLayout}"/> - - </JSplitPane> - -</jaxx.demo.DemoPanel> Copied: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/NavDemo.jaxx (from rev 2012, trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/JaxxNavDemo.jaxx) =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/NavDemo.jaxx (rev 0) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/NavDemo.jaxx 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,256 @@ +<!-- + #%L + JAXX :: Demo + $Id$ + $HeadURL$ + %% + Copyright (C) 2008 - 2010 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>. + #L% + --> + +<jaxx.demo.DemoPanel layout='{new BorderLayout()}'> + + <import> + jaxx.demo.component.jaxx.nav.content.* + jaxx.demo.component.jaxx.nav.tree.* + jaxx.demo.component.jaxx.nav.treetable.* + jaxx.demo.entities.* + jaxx.runtime.decorator.DecoratorProvider + jaxx.runtime.swing.nav.NavNode + + org.jdesktop.swingx.JXTreeTable + javax.swing.tree.TreePath + java.lang.reflect.Constructor + </import> + + <CardLayout2 id='contentLayout'/> + + <NavDemoDataProvider id='dataProvider'/> + + <NavDemoTreeHelper id='treeHelper' constructorParams='getDataProvider()'/> + + <NavDemoTreeTableHelper id='treeTableHelper' + constructorParams='getDataProvider()'/> + + <script><![CDATA[ + +@Override +protected String[] getSources() { + return new String[]{ getDefaultSource(), + "tree/NavDemoTreeNode.java", + "tree/NavDemoTreeHelper.java", + "tree/NavDemoTreeCellRenderer.java", + "tree/ActorsTreeNodeLoador.java", + "tree/MoviesTreeNodeLoador.java", + "treetable/NavDemoTreeTableNode.java", + "treetable/NavDemoTreeTableHelper.java", + "treetable/ActorsTreeTableNodeLoador.java", + "treetable/MoviesTreeTableNodeLoador.java" + }; +} + +private void $afterCompleteSetup() { + setContextValue(treeHelper, "treeHelper"); + setContextValue(treeTableHelper, "treeTableHelper"); + + // Creation of selection listener to open ui when tree selection change + TreeSelectionListener treeSelectionListener = new TreeSelectionListener() { + @Override + public void valueChanged(TreeSelectionEvent event) { + TreePath path = event.getPath(); + NavDemoTreeNode demoNode = (NavDemoTreeNode) path.getLastPathComponent(); + + if (log.isDebugEnabled()) { + log.debug("Select demoNode " + demoNode); + } + + // Do nothing for root + if (demoNode.isRoot()) { + return; + } + openUI(demoNode); + } + }; + + // Creation of selection listener to open ui when tree selection change + TreeSelectionListener treeTableSelectionListener = new TreeSelectionListener() { + @Override + public void valueChanged(TreeSelectionEvent event) { + TreePath path = event.getPath(); + NavDemoTreeTableNode demoNode = (NavDemoTreeTableNode) path.getLastPathComponent(); + + if (log.isDebugEnabled()) { + log.debug("Select demoNode " + demoNode); + } + + // Do nothing for root + if (demoNode.isRoot()) { + return; + } + openUI(demoNode); + } + }; + + // Register decorator + DecoratorProvider decoratorProvider = getContextValue(DecoratorProvider.class); + + // Attach renderer + navigationTree.setCellRenderer(new NavDemoTreeCellRenderer(decoratorProvider, dataProvider)); + + // Register tree + treeHelper.setUI(navigationTree, true, treeSelectionListener); + + // Register tree table + treeTableHelper.setUI(navigationTreeTable, true, treeTableSelectionListener); + + SwingUtilities.invokeLater(new Runnable() { + + @Override + public void run() { + navigationTree.setSelectionInterval(0, 0); + splitPane.resetToPreferredSizes(); + } + }); + + // expand the tree + SwingUtil.expandTree(navigationTree); + SwingUtil.expandTreeTable(navigationTreeTable); + + // auto-expand demoNode when selected + SwingUtil.addExpandOnClickListener(navigationTree); + SwingUtil.addExpandOnClickListener(navigationTreeTable); +} + +protected void openUI(NavNode demoNode) { + + // Get demoNode type + Class<?> editType = demoNode.getInternalClass(); + String id = demoNode.getId(); + + // If it's category demoNode + if (editType.equals(String.class)) { + + // Actors categorie demoNode + if (NavDemoTreeHelper.ACTORS_CATEGORY_NODE.equals(id)) { + + java.util.List<People> peoples = dataProvider.getPeoples(); + showUI(peoples, ActorsContentUI.class); + + // Movies categorie demoNode + } else if (NavDemoTreeHelper.MOVIES_CATEGORY_NODE.equals(id)) { + + java.util.List<Movie> movies = dataProvider.getMovies(); + showUI(movies, MoviesContentUI.class); + } + + // People demoNode + } else if (editType.equals(People.class)) { + People people = dataProvider.getPeople(id); + showUI(people, ActorContentUI.class); + + // Movie demoNode + } else if (editType.equals(Movie.class)) { + Movie movie = dataProvider.getMovie(id); + showUI(movie, MovieContentUI.class); + } +} + +// Create by introspection content ui +protected <B> void showUI(B bean, Class<? extends AbstractContentUI> uiClass) { + + // Verify if instance is existing + AbstractContentUI ui = getContentIfExist(uiClass); + + // Get layout identifier + String contentName = uiClass.getName(); + + if (ui == null) { + try { + // Get constructor + Constructor<? extends AbstractContentUI> constructor = + uiClass.getConstructor(JAXXContext.class); + + // Invoke instance creation + ui = constructor.newInstance(this); + } catch (Exception eee) { + log.error(eee); + ErrorDialogUI.showError(eee); + } + + // Add to content panel + content.add(ui, contentName); + } + + // Attach bean + ui.setData(bean); + + // show ui + contentLayout.show(content, contentName); +} + +// Get content if exist in content, else return null +protected <E extends Component> E getContentIfExist(Class<E> uiClass) { + String contentName = uiClass.getName(); + if (log.isDebugEnabled()) { + log.debug("Get content if exist " + contentName); + } + if (!contentLayout.contains(contentName)) { + return null; + } + return (E) contentLayout.getComponent(content, contentName); +} + ]]> + </script> + + <JSplitPane id='splitPane' + constraints='BorderLayout.CENTER' + oneTouchExpandable='true'> + + <JTabbedPane> + <tab title='jaxxdemo.tree.tabtitle'> + <JScrollPane border='{null}' + horizontalScrollBarPolicy='{JScrollPane.HORIZONTAL_SCROLLBAR_NEVER}' + verticalScrollBarPolicy='{JScrollPane.VERTICAL_SCROLLBAR_NEVER}'> + + <JTree id="navigationTree" + font-size='11' + rootVisible='false' + showsRootHandles='false' + model='{treeHelper.createModel()}'/> + + </JScrollPane> + </tab> + <tab title='jaxxdemo.treeTable.tabtitle'> + <JScrollPane border='{null}' + horizontalScrollBarPolicy='{JScrollPane.HORIZONTAL_SCROLLBAR_NEVER}' + verticalScrollBarPolicy='{JScrollPane.VERTICAL_SCROLLBAR_NEVER}'> + + <JXTreeTable id="navigationTreeTable" + font-size='11' + rootVisible='false' + showsRootHandles='false' + treeTableModel='{treeTableHelper.createModel()}'/> + + </JScrollPane> + </tab> + </JTabbedPane> + + <JPanel id="content" layout="{contentLayout}"/> + + </JSplitPane> + +</jaxx.demo.DemoPanel> Property changes on: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/NavDemo.jaxx ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/NavDemoDataProvider.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/NavDemoDataProvider.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/NavDemoDataProvider.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -27,7 +27,7 @@ import jaxx.demo.entities.Movie; import jaxx.demo.entities.People; -import jaxx.runtime.swing.nav.DataProvider; +import jaxx.runtime.swing.nav.NavDataProvider; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -40,7 +40,7 @@ * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class NavDemoDataProvider implements DataProvider { +public class NavDemoDataProvider implements NavDataProvider { /** Logger */ static private final Log log = LogFactory.getLog(NavDemoDataProvider.class); Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/ActorsTreeNodeLoador.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/ActorsTreeNodeLoador.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/ActorsTreeNodeLoador.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -27,8 +27,8 @@ import jaxx.demo.component.jaxx.nav.NavDemoDataProvider; import jaxx.demo.entities.People; -import jaxx.runtime.swing.nav.DataProvider; -import jaxx.runtime.swing.nav.tree.JaxxTreeNodeChildLoador; +import jaxx.runtime.swing.nav.NavDataProvider; +import jaxx.runtime.swing.nav.tree.NavTreeNodeChildLoador; import java.util.List; @@ -36,7 +36,7 @@ * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class ActorsTreeNodeLoador extends JaxxTreeNodeChildLoador<People, People, NavDemoTreeNode> { +public class ActorsTreeNodeLoador extends NavTreeNodeChildLoador<People, People, NavDemoTreeNode> { private static final long serialVersionUID = 1L; @@ -47,7 +47,7 @@ @Override public List<People> getData(Class<?> parentClass, String moviesId, - DataProvider dataProvider) throws Exception { + NavDataProvider dataProvider) throws Exception { // Get people for parentId NavDemoDataProvider provider = (NavDemoDataProvider) dataProvider; @@ -65,7 +65,7 @@ @SuppressWarnings({"unchecked"}) @Override - public NavDemoTreeNode createNode(People data, DataProvider dataProvider) { + public NavDemoTreeNode createNode(People data, NavDataProvider dataProvider) { NavDemoTreeNode actorNode; Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/MoviesTreeNodeLoador.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/MoviesTreeNodeLoador.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/MoviesTreeNodeLoador.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -27,9 +27,9 @@ import jaxx.demo.component.jaxx.nav.NavDemoDataProvider; import jaxx.demo.entities.Movie; -import jaxx.runtime.swing.nav.DataProvider; -import jaxx.runtime.swing.nav.JaxxNavHelper; -import jaxx.runtime.swing.nav.tree.JaxxTreeNodeChildLoador; +import jaxx.runtime.swing.nav.NavDataProvider; +import jaxx.runtime.swing.nav.NavHelper; +import jaxx.runtime.swing.nav.tree.NavTreeNodeChildLoador; import java.util.List; @@ -39,7 +39,7 @@ * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class MoviesTreeNodeLoador extends JaxxTreeNodeChildLoador<Movie, Movie, NavDemoTreeNode> { +public class MoviesTreeNodeLoador extends NavTreeNodeChildLoador<Movie, Movie, NavDemoTreeNode> { private static final long serialVersionUID = 1L; @@ -57,7 +57,7 @@ @Override public List<Movie> getData(Class<?> parentClass, String parentId, - DataProvider dataProvider) throws Exception { + NavDataProvider dataProvider) throws Exception { NavDemoDataProvider provider = (NavDemoDataProvider) dataProvider; @@ -67,7 +67,7 @@ @SuppressWarnings({"unchecked"}) @Override - public NavDemoTreeNode createNode(Movie data, DataProvider dataProvider) { + public NavDemoTreeNode createNode(Movie data, NavDataProvider dataProvider) { NavDemoTreeNode moviesNode; NavDemoTreeNode actorsCategoryNode; @@ -85,7 +85,7 @@ String.class, n_(NavDemoTreeHelper.ACTORS_CATEGORY_NODE), null, - JaxxNavHelper.getChildLoador(ActorsTreeNodeLoador.class) + NavHelper.getChildLoador(ActorsTreeNodeLoador.class) ); // Add actors nodes to movies node Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/NavDemoTreeCellRenderer.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/NavDemoTreeCellRenderer.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/NavDemoTreeCellRenderer.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -30,7 +30,7 @@ import jaxx.demo.entities.People; import jaxx.runtime.decorator.Decorator; import jaxx.runtime.decorator.DecoratorProvider; -import jaxx.runtime.swing.nav.tree.AbstractJaxxTreeCellRenderer; +import jaxx.runtime.swing.nav.tree.AbstractNavTreeCellRenderer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -42,7 +42,7 @@ * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class NavDemoTreeCellRenderer extends AbstractJaxxTreeCellRenderer<DefaultTreeModel, NavDemoTreeNode> { +public class NavDemoTreeCellRenderer extends AbstractNavTreeCellRenderer<DefaultTreeModel, NavDemoTreeNode> { /** Logger */ protected static final Log log = Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/NavDemoTreeHelper.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/NavDemoTreeHelper.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/NavDemoTreeHelper.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -26,7 +26,7 @@ package jaxx.demo.component.jaxx.nav.tree; import jaxx.demo.component.jaxx.nav.NavDemoDataProvider; -import jaxx.runtime.swing.nav.tree.JaxxTreeHelper; +import jaxx.runtime.swing.nav.tree.NavTreeHelper; import javax.swing.tree.DefaultTreeModel; @@ -36,7 +36,7 @@ * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class NavDemoTreeHelper extends JaxxTreeHelper<NavDemoTreeNode> { +public class NavDemoTreeHelper extends NavTreeHelper<NavDemoTreeNode> { public static String MOVIES_CATEGORY_NODE = "movies"; Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/NavDemoTreeNode.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/NavDemoTreeNode.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/tree/NavDemoTreeNode.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -25,14 +25,14 @@ package jaxx.demo.component.jaxx.nav.tree; -import jaxx.runtime.swing.nav.tree.JaxxTreeNode; -import jaxx.runtime.swing.nav.tree.JaxxTreeNodeChildLoador; +import jaxx.runtime.swing.nav.tree.NavTreeNode; +import jaxx.runtime.swing.nav.tree.NavTreeNodeChildLoador; /** * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class NavDemoTreeNode extends JaxxTreeNode<NavDemoTreeNode> { +public class NavDemoTreeNode extends NavTreeNode<NavDemoTreeNode> { private static final long serialVersionUID = 1L; @@ -43,7 +43,7 @@ public NavDemoTreeNode(Class<?> internalClass, String id, String context, - JaxxTreeNodeChildLoador<?, ?, NavDemoTreeNode> loador) { + NavTreeNodeChildLoador<?, ?, NavDemoTreeNode> loador) { super(internalClass, id, context, loador); } } Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/ActorsTreeTableNodeLoador.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/ActorsTreeTableNodeLoador.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/ActorsTreeTableNodeLoador.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -27,8 +27,8 @@ import jaxx.demo.component.jaxx.nav.NavDemoDataProvider; import jaxx.demo.entities.People; -import jaxx.runtime.swing.nav.DataProvider; -import jaxx.runtime.swing.nav.treetable.JaxxTreeTableNodeChildLoador; +import jaxx.runtime.swing.nav.NavDataProvider; +import jaxx.runtime.swing.nav.treetable.NavTreeTableNodeChildLoador; import java.util.List; @@ -36,7 +36,7 @@ * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class ActorsTreeTableNodeLoador extends JaxxTreeTableNodeChildLoador<People, People, NavDemoTreeTableNode> { +public class ActorsTreeTableNodeLoador extends NavTreeTableNodeChildLoador<People, People, NavDemoTreeTableNode> { private static final long serialVersionUID = 1L; @@ -47,7 +47,7 @@ @Override public List<People> getData(Class<?> parentClass, String moviesId, - DataProvider dataProvider) throws Exception { + NavDataProvider dataProvider) throws Exception { // Get people for parentId NavDemoDataProvider provider = (NavDemoDataProvider) dataProvider; @@ -65,7 +65,7 @@ @SuppressWarnings({"unchecked"}) @Override - public NavDemoTreeTableNode createNode(People data, DataProvider dataProvider) { + public NavDemoTreeTableNode createNode(People data, NavDataProvider dataProvider) { NavDemoTreeTableNode actorNode; Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/MoviesTreeTableNodeLoador.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/MoviesTreeTableNodeLoador.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/MoviesTreeTableNodeLoador.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -27,9 +27,9 @@ import jaxx.demo.component.jaxx.nav.NavDemoDataProvider; import jaxx.demo.entities.Movie; -import jaxx.runtime.swing.nav.DataProvider; -import jaxx.runtime.swing.nav.JaxxNavHelper; -import jaxx.runtime.swing.nav.treetable.JaxxTreeTableNodeChildLoador; +import jaxx.runtime.swing.nav.NavDataProvider; +import jaxx.runtime.swing.nav.NavHelper; +import jaxx.runtime.swing.nav.treetable.NavTreeTableNodeChildLoador; import java.util.List; @@ -39,7 +39,7 @@ * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class MoviesTreeTableNodeLoador extends JaxxTreeTableNodeChildLoador<Movie, Movie, NavDemoTreeTableNode> { +public class MoviesTreeTableNodeLoador extends NavTreeTableNodeChildLoador<Movie, Movie, NavDemoTreeTableNode> { private static final long serialVersionUID = 1L; @@ -57,7 +57,7 @@ @Override public List<Movie> getData(Class<?> parentClass, String parentId, - DataProvider dataProvider) throws Exception { + NavDataProvider dataProvider) throws Exception { NavDemoDataProvider provider = (NavDemoDataProvider) dataProvider; @@ -67,7 +67,7 @@ @SuppressWarnings({"unchecked"}) @Override - public NavDemoTreeTableNode createNode(Movie data, DataProvider dataProvider) { + public NavDemoTreeTableNode createNode(Movie data, NavDataProvider dataProvider) { NavDemoTreeTableNode moviesNode; NavDemoTreeTableNode actorsCategoryNode; @@ -85,7 +85,7 @@ String.class, n_(NavDemoTreeTableHelper.ACTORS_CATEGORY_NODE), null, - JaxxNavHelper.getChildLoador(ActorsTreeTableNodeLoador.class) + NavHelper.getChildLoador(ActorsTreeTableNodeLoador.class) ); // Add actors nodes to movies node Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/NavDemoTreeTableHelper.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/NavDemoTreeTableHelper.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/NavDemoTreeTableHelper.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -26,8 +26,8 @@ package jaxx.demo.component.jaxx.nav.treetable; import jaxx.demo.component.jaxx.nav.NavDemoDataProvider; -import jaxx.runtime.swing.nav.treetable.JaxxTreeTableHelper; -import jaxx.runtime.swing.nav.treetable.JaxxTreeTableModel; +import jaxx.runtime.swing.nav.treetable.NavTreeTableHelper; +import jaxx.runtime.swing.nav.treetable.NavTreeTableModel; import static org.nuiton.i18n.I18n.n_; @@ -35,7 +35,7 @@ * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class NavDemoTreeTableHelper extends JaxxTreeTableHelper<NavDemoTreeTableNode> { +public class NavDemoTreeTableHelper extends NavTreeTableHelper<NavDemoTreeTableNode> { public static String MOVIES_CATEGORY_NODE = "movies"; @@ -52,7 +52,7 @@ @SuppressWarnings({"unchecked"}) - public JaxxTreeTableModel createModel() { + public NavTreeTableModel createModel() { // Create root static node NavDemoTreeTableNode root = new NavDemoTreeTableNode( @@ -84,7 +84,7 @@ // Create model NavDemoTreeTableModel delegate = new NavDemoTreeTableModel(getDataProvider()); - JaxxTreeTableModel model = createModel(root, delegate); + NavTreeTableModel model = createModel(root, delegate); // Populate childs nodes root.populateChilds(getBridge(), getDataProvider()); Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/NavDemoTreeTableModel.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/NavDemoTreeTableModel.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/NavDemoTreeTableModel.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -27,8 +27,8 @@ import jaxx.demo.component.jaxx.nav.NavDemoDataProvider; import jaxx.demo.entities.Movie; import jaxx.demo.entities.People; -import jaxx.runtime.swing.nav.treetable.JaxxTreeTableModel; -import jaxx.runtime.swing.nav.JaxxNode; +import jaxx.runtime.swing.nav.NavNode; +import jaxx.runtime.swing.nav.treetable.NavTreeTableModel; import static org.nuiton.i18n.I18n._; @@ -36,7 +36,7 @@ * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class NavDemoTreeTableModel extends JaxxTreeTableModel.MyDefaultTreeTableModel { +public class NavDemoTreeTableModel extends NavTreeTableModel.MyDefaultTreeTableModel { protected NavDemoDataProvider dataProvider; @@ -46,7 +46,7 @@ @Override public Object getValueAt(Object o, int i) { - JaxxNode node = (JaxxNode)o; + NavNode node = (NavNode)o; // Get node type Class<?> editType = node.getInternalClass(); Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/NavDemoTreeTableNode.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/NavDemoTreeTableNode.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/component/jaxx/nav/treetable/NavDemoTreeTableNode.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -24,14 +24,14 @@ */ package jaxx.demo.component.jaxx.nav.treetable; -import jaxx.runtime.swing.nav.treetable.JaxxTreeTableNode; -import jaxx.runtime.swing.nav.treetable.JaxxTreeTableNodeChildLoador; +import jaxx.runtime.swing.nav.treetable.NavTreeTableNode; +import jaxx.runtime.swing.nav.treetable.NavTreeTableNodeChildLoador; /** * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class NavDemoTreeTableNode extends JaxxTreeTableNode<NavDemoTreeTableNode> { +public class NavDemoTreeTableNode extends NavTreeTableNode<NavDemoTreeTableNode> { private static final long serialVersionUID = 1L; protected NavDemoTreeTableNode(String id) { @@ -41,7 +41,7 @@ public NavDemoTreeTableNode(Class<?> internalClass, String id, String context, - JaxxTreeTableNodeChildLoador<?, ?, NavDemoTreeTableNode> childLoador) { + NavTreeTableNodeChildLoador<?, ?, NavDemoTreeTableNode> childLoador) { super(internalClass, id, context, childLoador); } } Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoCellRenderer.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoCellRenderer.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoCellRenderer.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -26,7 +26,7 @@ package jaxx.demo.tree; import jaxx.demo.component.jaxx.nav.NavDemoDataProvider; -import jaxx.runtime.swing.nav.tree.AbstractJaxxTreeCellRenderer; +import jaxx.runtime.swing.nav.tree.AbstractNavTreeCellRenderer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -40,7 +40,7 @@ * @author sletellier <letellier@codelutin.com> * @since 2.1 */ -public class DemoCellRenderer extends AbstractJaxxTreeCellRenderer<DefaultTreeModel, DemoNode> { +public class DemoCellRenderer extends AbstractNavTreeCellRenderer<DefaultTreeModel, DemoNode> { /** Logger */ protected static final Log log = Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoDataProvider.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -30,7 +30,7 @@ import jaxx.demo.component.jaxx.editor.ComboEditorDemo; import jaxx.demo.component.jaxx.editor.I18nEditorDemo; import jaxx.demo.component.jaxx.editor.NumberEditorDemo; -import jaxx.demo.component.jaxx.nav.JaxxNavDemo; +import jaxx.demo.component.jaxx.nav.NavDemo; import jaxx.demo.component.swing.HidorButtonDemo; import jaxx.demo.component.swing.JButtonDemo; import jaxx.demo.component.swing.JCheckBoxDemo; @@ -56,7 +56,7 @@ import jaxx.demo.fun.CalculatorDemo; import jaxx.demo.fun.CounterDemo; import jaxx.demo.fun.LabelStyleDemo; -import jaxx.runtime.swing.nav.DataProvider; +import jaxx.runtime.swing.nav.NavDataProvider; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -73,7 +73,7 @@ * @author tchemit <chemit@codelutin.com> * @since 2.1 */ -public class DemoDataProvider implements DataProvider { +public class DemoDataProvider implements NavDataProvider { /** Logger */ static private final Log log = LogFactory.getLog(DemoDataProvider.class); @@ -152,7 +152,7 @@ I18nEditorDemo.class ); addMapping(n_("jaxxdemo.tree.component.jaxx.tree"), - JaxxNavDemo.class + NavDemo.class ); addMapping(n_("jaxxdemo.tree.feature"), Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNode.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNode.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNode.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -25,7 +25,7 @@ package jaxx.demo.tree; -import jaxx.runtime.swing.nav.tree.JaxxTreeNode; +import jaxx.runtime.swing.nav.tree.NavTreeNode; /** * Basic node of the demo. @@ -33,7 +33,7 @@ * @author tchemit <chemit@codelutin.com> * @since 2.1 */ -public class DemoNode extends JaxxTreeNode<DemoNode> { +public class DemoNode extends NavTreeNode<DemoNode> { private static final long serialVersionUID = 1L; Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNodeLoador.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNodeLoador.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoNodeLoador.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -25,9 +25,9 @@ package jaxx.demo.tree; -import jaxx.runtime.swing.nav.tree.JaxxTreeNodeChildLoador; -import jaxx.runtime.swing.nav.DataProvider; -import jaxx.runtime.swing.nav.JaxxNodeChildLoador; +import jaxx.runtime.swing.nav.tree.NavTreeNodeChildLoador; +import jaxx.runtime.swing.nav.NavDataProvider; +import jaxx.runtime.swing.nav.NavNodeChildLoador; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -37,12 +37,12 @@ * @author tchemit <tchemit@codelutin.com> * @since 2.1 */ -public class DemoNodeLoador extends JaxxTreeNodeChildLoador<Object,Object, DemoNode> { +public class DemoNodeLoador extends NavTreeNodeChildLoador<Object,Object, DemoNode> { private static final long serialVersionUID = 1L; /** Logger */ - static private final Log log = LogFactory.getLog(JaxxNodeChildLoador.class); + static private final Log log = LogFactory.getLog(NavNodeChildLoador.class); public DemoNodeLoador() { super(Object.class); @@ -51,7 +51,7 @@ @Override public List<Object> getData(Class<?> parentClass, String packageName, - DataProvider dataProvider) throws Exception { + NavDataProvider dataProvider) throws Exception { DemoDataProvider provider = (DemoDataProvider) dataProvider; List<Object> implementations = provider.getImplementations(packageName); @@ -59,7 +59,7 @@ } @Override - public DemoNode createNode(Object data, DataProvider dataProvider) { + public DemoNode createNode(Object data, NavDataProvider dataProvider) { if (log.isDebugEnabled()) { log.debug("Creating node for object : " + data); Modified: trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoTreeHelper.java =================================================================== --- trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoTreeHelper.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-demo/src/main/java/jaxx/demo/tree/DemoTreeHelper.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -25,7 +25,7 @@ package jaxx.demo.tree; -import jaxx.runtime.swing.nav.tree.JaxxTreeHelper; +import jaxx.runtime.swing.nav.tree.NavTreeHelper; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeModel; @@ -34,7 +34,7 @@ * @author tchemit <tchemit@codelutin.com> * @since 2.1 */ -public class DemoTreeHelper extends JaxxTreeHelper<DemoNode> { +public class DemoTreeHelper extends NavTreeHelper<DemoNode> { public DemoTreeHelper(DemoDataProvider provider) { setDataProvider(provider); Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/DataProvider.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/DataProvider.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/DataProvider.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,46 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav; - -import jaxx.runtime.swing.nav.tree.AbstractJaxxTreeCellRenderer; - -/** - * Contract of provider of data. - * <p/> - * This object is used by {@link JaxxNodeChildLoador} to populate childs of node - * and by {@link AbstractJaxxTreeCellRenderer} to render nodes. - * - * @author tchemit <chemit@codelutin.com> - * @since 2.1 - */ -public interface DataProvider { - - /** - * @return {@code true} is provider is enabled and can provide datas, - * {@code false} otherwise. - */ - boolean isEnabled(); - -} Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNavBridge.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNavBridge.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNavBridge.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,159 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav; - -import javax.swing.event.TreeModelListener; -import javax.swing.tree.TreeNode; -import javax.swing.tree.TreePath; -import java.util.EventListener; - -/** - * Contract of the bridge used by {@link JaxxNavHelper} to hold model and ui. - * - * @author tchemit <chemit@codelutin.com> - * @param <M> Type of model to bridge - * @param <N> Type of nodes of the model - * @since 2.1 - */ -public interface JaxxNavBridge<M, N extends JaxxNode<M, N>> { - - //-------------------------------------------------------------------------- - //-- Model Queries - //-------------------------------------------------------------------------- - - M getModel(); - - N getRoot(); - - boolean isLeaf(Object node); - - int getChildCount(Object parent); - - N getChild(Object parent, int index); - - int getIndexOfChild(Object parent, Object child); - - TreeNode[] getPathToRoot(TreeNode aNode); - - //-------------------------------------------------------------------------- - //-- Model modification - //-------------------------------------------------------------------------- - - void setRoot(N node); - - void insertNodeInto(N newChild, N parent, int index); - - void removeNodeFromParent(N node); - - void reload(N node); - - //-------------------------------------------------------------------------- - //-- Listeners notifications - //-------------------------------------------------------------------------- - - void valueForPathChanged(TreePath path, Object newValue); - - void nodeStructureChanged(TreeNode node); - - void nodeChanged(TreeNode node); - - void nodesChanged(TreeNode node, int[] childIndices); - - void nodesWereInserted(N parent, int[] indices); - - void nodeWereInserted(N parentNode, int childIndice, N node); - - void nodesWereRemoved(TreeNode node, int[] childIndices, Object[] removedChildren); - - /** - * Notifies that the {@code node} was inserted. - * <p/> - * <b>Note:</b> The method recurses on childs (always notify parent before child) - * - * @param node node inserted - */ - void notifyNodeInserted(N node); - - /** - * Notifies that all childs nodes of {@code node} were - * inserted. - * <p/> - * <b>Note:</b> The method recurses on childs (always notify parent before child) - * - * @param node node where all childs where inserted - */ - void notifyChildNodesInserted(N node); - - //-------------------------------------------------------------------------- - //-- TreeModelListener provider - //-------------------------------------------------------------------------- - - void addTreeModelListener(TreeModelListener l); - - void removeTreeModelListener(TreeModelListener l); - - TreeModelListener[] getTreeModelListeners(); - - <T extends EventListener> T[] getListeners(Class<T> listenerType); - - - //-------------------------------------------------------------------------- - //-- UI - //-------------------------------------------------------------------------- - - -// U getUI(); -// -// void setUI(U ui); -// -// void scrollPathToVisible(TreePath path); -// -// void setSelectionPath(TreePath path); -// -// TreeSelectionModel getSelectionModel(); -// -// boolean isExpanded(TreePath pathToExpand); -// -// void expandPath(TreePath pathToExpand); -// -// /** -// * Obtains the {@link AbstractJaxxTreeCellRenderer} renderer of the -// * registred tree. -// * -// * @return the renderer of the registred tree or null if no tree was -// * registred nor the renderer is a {@link AbstractJaxxTreeCellRenderer}. -// */ -// AbstractJaxxTreeCellRenderer<M, N> getTreeCellRenderer(); -// -// /** -// * Obtains the selected node of the registred tree. -// * -// * @return the selected tree or {@code null} if no registred tree nor -// * selection empty. -// */ -// N getSelectedNode(); - - void setModel(M delegate); -} Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNavHelper.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNavHelper.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNavHelper.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,795 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav; - -import jaxx.runtime.swing.nav.tree.AbstractJaxxTreeCellRenderer; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.swing.event.TreeExpansionEvent; -import javax.swing.event.TreeModelEvent; -import javax.swing.event.TreeModelListener; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.event.TreeWillExpandListener; -import javax.swing.tree.TreePath; -import javax.swing.tree.TreeSelectionModel; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * Tree helper to deal with the build of trees and other usefull operations. - * <p/> - * A helper acts as an handler for a {@code tree}. It owns the {@link #getModel()} of - * the {@code #tree}. - * <p/> - * <b>Note:</b> A helper can NOT be used to manage multi-trees. - * <h2>Internal states</h2 - * <h3>Internal model</h3> - * To create the model, use method {@link #createModel(JaxxNode,Object...)} given a - * root node. - * <p/> - * To obtain the model, use method {@link #getModel()}. - * <p/> - * <b>Note:</b> The helper internal model can be different from the tree model, - * but must be the <b>lowest</b> model, other models must listen nicely this - * model to obtain model modification and selection notifications. - * <h3>Internal tree</h3> - * As said before, a helper matches exactly one tree. - * <p/> - * To register the tree, use method {@link #setUI(Object, boolean, TreeSelectionListener)}. - * <p/> - * To obtain the tree, use method {@link #getUI()}. - * <h3>Internal data provider</h3> - * To populate childs nodes and render nodes, we use a {@link DataProvider}. - * <p/> - * To register the data provider, use method {@link #setDataProvider(DataProvider)}. - * <p/> - * To obtain the data provider, use method {@link #getDataProvider()}. - * <h2>Internal listeners</h2> - * Several listeners are used to manage the auto-loading of nodes in model : - * <h3>{@link #expandListener}</h3> - * This listener will load node's childs before node expands if the node is not loaded. - * <p/> - * See the {@link JaxxNode#isLoaded()} method. - * <h3>{@link #treeModelListener}</h3> - * To listen modification of the model, it will mainly repopulate nodes when - * required. - * <p/> - * See the method {@link #populateNode(JaxxNode , Object[], boolean)}. - * <h3>{@link #selectionListener}</h3> - * To listen modification of the selection, it will mainly expand paths if required. - * <p/> - * This is a requirement, since childs of a node should NOT be loaded, so when - * selects a node, always check the path from root to selected node are all fully - * loaded. - * <h2>Model methods</h2> - * The helper offers some methods to modify and query the internal tree model. - * <h3>Model modification</h3> - * <ul> - * <li>{@link #createModel(JaxxNode,Object...)}</li> - * <li>{@link #insertNode(JaxxNode , JaxxNode)}</li> - * <li>{@link #removeNode(JaxxNode)}</li> - * <li>{@link #moveNode(JaxxNode , JaxxNode , int)}</li> - * <li>{@link #refreshNode(JaxxNode , boolean)}</li> - * <li>{@link #loadAllNodes(JaxxNode , DataProvider)}</li> - * <p/> - * </ul> - * <h3>Model selection modification</h3> - * <ul> - * <li>{@link #selectNode(JaxxNode)}</li> - * <li>{@link #selectNode(String...)}</li> - * <li>{@link #selectParentNode()}</li> - * </ul> - * <h3>Model query</h3> - * <ul> - * <li>{@link #findNode(JaxxNode , String...)}</li> - * </ul> - * <h3>Child loadors factory</h3> - * The class offers a factory of {@link JaxxNodeChildLoador}, use the method - * {@link #getChildLoador(Class)} to obtain the correct child loador given his type. - * - * @author tchemit <chemit@codelutin.com> - * @param <U> Type of ui to bridge - * @see JaxxNode - * @see JaxxNodeChildLoador - * @see AbstractJaxxTreeCellRenderer - * @since 2.1 - */ -public abstract class JaxxNavHelper<M, U, B extends JaxxNavBridge<M, N>, N extends JaxxNode<M, N>> { - - /** Logger */ - static private final Log log = LogFactory.getLog(JaxxNavHelper.class); - - //-------------------------------------------------------------------------- - //-- Methods to implement in your helper (related only to ui) - //-------------------------------------------------------------------------- - - public abstract void scrollPathToVisible(TreePath path); - - public abstract void setSelectionPath(TreePath path); - - public abstract TreeSelectionModel getSelectionModel(); - - public abstract boolean isExpanded(TreePath pathToExpand); - - public abstract void expandPath(TreePath pathToExpand); - - /** - * Register a new root node. - * <p/> - * If internal {@link #getModel()} does not exists, creates a new one from his given root {@code node}, - * otherwise just set the new root on the existing model. - * <p/> - * <p/> - * <b>Note:</b> As a side-effect, the model will be keep in field {@link #getModel()} - * and the {@link #treeModelListener} will be registred on this model. - * - * @param node the root node of the new model - * @param extraArgs extra args to create initial model - * @return the new model - */ - @SuppressWarnings({"unchecked"}) - protected abstract M createModel(N node, Object... extraArgs); - - /** - * The shared bridge. - * <p/> - * A helper deals with only ONE model (this one), becuase we add some - * listeners on it, we prefer always to keep ONE instance (any way this is - * a good thing). - * <p/> - * If you want to create a new model, just creates the good root node and - * push it in this model. - * <p/> - * For example, if you wrap the shared model with a filter model... Anyway, all - * listeners of this helper apply always of THIs model. - */ - private final B bridge; - - /** the associated ui component */ - private U ui; - - /** The shared data provider used to obtain datas to populate nodes and render them. */ - protected DataProvider dataProvider; - - /** - * A {@link TreeWillExpandListener} used to listen when tree should expand. - * <p/> - * If so, the listener will load selected node childs if required - * (says when the {@link JaxxNode#isLoaded()} is sets to {@code false}). - */ - protected TreeWillExpandListener expandListener; - - /** - * pour ouvrir les fils d'un noeud que l'on vient de sélectionner pour - * éviter d'avoir à faire des doubles clics. - */ - protected TreeSelectionListener selectionListener; - - /** - * pour recharger le rendu des noeuds (et charger les fils si nécessaires) - * lors d'une modification dans le modèle de l'arbre. - */ - protected TreeModelListener treeModelListener; - - /** Cache of child loadors. */ - protected static Set<? super JaxxNodeChildLoador<?, ?, ?, ?, ?>> childLoadors; - - protected static Set<? super JaxxNodeChildLoador<?, ?, ?, ?, ?>> getChildLoadors() { - if (childLoadors == null) { - childLoadors = new HashSet<JaxxNodeChildLoador<?, ?, ?, ?, ?>>(); - } - return childLoadors; - } - - /** - * Obtains the {@link JaxxNodeChildLoador} of the given {@code type} from - * internal cache. - * <p/> - * <b>Note:</b> The loador will be instanciated if not found, and push in cache. - * - * @param type the type of loador to get - * @param <L> the type of loador to get - * @return the loador from cache - */ - @SuppressWarnings({"unchecked"}) - public static <L extends JaxxNodeChildLoador<?, ?, ?, ?, ?>> L getChildLoador(Class<L> type) { - Set<? super JaxxNodeChildLoador<?, ?, ?, ?, ?>> cache = getChildLoadors(); - JaxxNodeChildLoador<?, ?, ?, ?, ?> result = null; - for (Object loador : cache) { - if (type.equals(loador.getClass())) { - result = (JaxxNodeChildLoador<?, ?, ?, ?, ?>) loador; - break; - } - } - if (result == null) { - // add it in cache - try { - result = type.newInstance(); - cache.add(result); - if (log.isDebugEnabled()) { - log.debug("Add " + result + " in loadors cache (new size:" + cache.size() + ")."); - } - } catch (Exception e) { - throw new IllegalArgumentException("Could not instanciate loador [" + type.getName() + "]", e); - } - } - return (L) result; - } - - public JaxxNavHelper(B bridge) { - this.bridge = bridge; - - selectionListener = new TreeSelectionListener() { - - @Override - public void valueChanged(TreeSelectionEvent e) { - if (!checkModel()) { - return; - } - - // Hack, because event.getSource for TreeTable doesnt return selectionModel - TreeSelectionModel source = getSelectionModel(); - - if (source.isSelectionEmpty()) { - - // empty selection - if (log.isDebugEnabled()) { - log.debug("Selection is empty."); - } - return; - } - - boolean debugEnabled = log.isDebugEnabled(); - boolean traceEnabled = log.isTraceEnabled(); - for (TreePath path : e.getPaths()) { - - N node = getNode(path); - if (node == null) { - - // pas de noeud selectionne - if (debugEnabled) { - log.debug("Skip for null node."); - } - continue; - } - - boolean isAdded = e.isAddedPath(path); - - TreePath pathToExpand = new TreePath(JaxxNavHelper.this.bridge.getPathToRoot(node)); - boolean pathExpanded = isExpanded(pathToExpand); - - if (traceEnabled || isAdded && debugEnabled) { - log.debug("==== Node selection ===================================="); - log.debug("node ? " + node); - log.debug("is added ? " + isAdded); - log.debug("is path expanded ? " + pathExpanded); - log.debug("is node static ? " + node.isStaticNode()); - log.debug("is node loaded ? " + node.isLoaded()); - log.debug("is node leaf ? " + node.isLeaf()); - log.debug("node nb childs ? " + node.getChildCount()); - } - - if (isAdded && !pathExpanded) { - - // ask to expand path - log.info("expand node [" + pathToExpand + "]"); - expandPath(pathToExpand); - } - } - } - }; - expandListener = new TreeWillExpandListener() { - @Override - public void treeWillExpand(TreeExpansionEvent event) { - - if (!checkModel()) { - // no model - return; - } - - N source = getNode(event.getPath()); - - if (source.isLoaded()) { - - // node is already loaded, nothing to do - return; - } - - if (log.isDebugEnabled()) { - log.debug("will load childs of node [" + source + "]"); - } - // populate childs of node - source.populateChilds(getBridge(), getDataProvider()); - } - - @Override - public void treeWillCollapse(TreeExpansionEvent event) { - } - }; - - treeModelListener = new TreeModelListener() { - @Override - public void treeNodesInserted(TreeModelEvent e) { - if (!checkModel()) { - // no model - return; - } - N source = getNode(e.getTreePath()); - Object[] children = e.getChildren(); - if (log.isDebugEnabled()) { - log.debug(getMessage("inserted ", source, children)); - } - - // ask to populate children nodes - populateNode(null, children, false); - } - - @SuppressWarnings({"unchecked"}) - @Override - public void treeNodesRemoved(TreeModelEvent e) { - if (!checkModel()) { - // no model - return; - } - N source = getNode(e.getTreePath()); - Object[] children = e.getChildren(); - if (log.isDebugEnabled()) { - log.debug(getMessage("removed ", source, children)); - } - - // Invalidates nodes in renderer cache (if any) - AbstractJaxxTreeCellRenderer<M, N> renderer = getTreeCellRenderer(); - if (children != null && renderer != null) { - for (Object child : children) { - renderer.invalidateCache((N) child); - } - } - } - - @Override - public void treeNodesChanged(TreeModelEvent e) { - if (!checkModel()) { - // no model - return; - } - - N source = getNode(e.getTreePath()); - Object[] children = e.getChildren(); - if (log.isDebugEnabled()) { - log.debug(getMessage("changed ", source, children)); - } - - // ask to populate modified child nodes - populateNode(null, children, false); - } - - @Override - public void treeStructureChanged(TreeModelEvent e) { - if (!checkModel()) { - // no model - return; - } - N source = getNode(e.getTreePath()); - Object[] children = e.getChildren(); - if (log.isDebugEnabled()) { - log.debug(getMessage("structure changed", source, children)); - } - - // ask to populate structure modified node and nodes recursively - populateNode(source, children, true); - } - - protected String getMessage(String action, N source, Object[] children) { - StringBuilder sb = new StringBuilder(); - sb.append("==== Nodes "); - sb.append(action); - sb.append(" ================="); - sb.append("\nsource : ").append(source); - sb.append("\nnb nodes : "); - sb.append(children == null ? 0 : children.length); - if (children != null) { - int i = 0; - for (Object child : children) { - sb.append("\n ["); - sb.append(i++); - sb.append("] - "); - sb.append(child); - } - } - return sb.toString(); - } - }; - } - - /** - * Obtains the attached data provider used to populate and render nodes. - * - * @return the attached data provider - */ - protected DataProvider getDataProvider() { - return dataProvider; - } - - /** - * Obtains the jaxx delegate tree model - * - * @return the internal tree model or {@code null} if none was created. - */ - public M getModel() { - return bridge.getModel(); - } - - /** - * Obtains the jaxx delegate tree model - * - * @return the internal tree model or {@code null} if none was created. - */ - protected B getBridge() { - return bridge; - } - - /** - * Obtains the ui associated with model in helper. - * - * @return the ui (or {@code null} if no ui attached) - */ - public U getUI() { - return ui; - } - - public N getRootNode() { - if (!checkModel()) { - return null; - } - return bridge.getRoot(); - } - - /** - * Obtains the {@link AbstractJaxxTreeCellRenderer} renderer of the - * registred tree. - * - * @return the renderer of the registred tree or null if no tree was - * registred nor the renderer is a {@link AbstractJaxxTreeCellRenderer}. - */ - public abstract AbstractJaxxTreeCellRenderer<M, N> getTreeCellRenderer(); - - /** - * Obtains the selected node of the registred tree. - * - * @return the selected tree or {@code null} if no registred tree nor - * selection empty. - */ - public abstract N getSelectedNode(); - - /** - * Obtains the path of ids fro the root node to the selected node on the - * registred tree. - * - * @return the array of ids from root node to selected node. - */ - public String[] getSelectedIds() { - List<String> result = new ArrayList<String>(); - N selectedNode = getSelectedNode(); - while (selectedNode != null && !selectedNode.isRoot()) { - - result.add(selectedNode.getId()); - selectedNode = selectedNode.getParent(); - } - Collections.reverse(result); - return result.toArray(new String[result.size()]); - } - - /** - * Registers the given {@code tree} for this helper. - * <p/> - * <b>Note:</b> as a side-effect, it will register (if required) the - * {@link #expandListener} listener and the {@link #selectionListener}. - * - * @param tree the tree to register - * @param addExpandTreeListener a flag to add expand listener - * @param listener the optional selection listener to add - */ - @SuppressWarnings({"unchecked"}) - public abstract void setUI(U tree, - boolean addExpandTreeListener, - TreeSelectionListener listener); - - /** - * Registers the {@code dataProvider} for the helper. - * <p/> - * <b>Node:</b> As a side-effect, the provider will be propagate to the - * renderer of the registred tree (if any). - * - * @param dataProvider the data provider to use - */ - public void setDataProvider(DataProvider dataProvider) { - this.dataProvider = dataProvider; - AbstractJaxxTreeCellRenderer<M, N> renderer = getTreeCellRenderer(); - if (renderer != null) { - - // dispatch provider to renderer - renderer.setDataProvider(dataProvider); - } - } - - /** - * Inserts the given node to the given {@code parentNode}. - * <p/> - * The node will be added to his parent, then creation listeners will be - * fired. - * - * @param parentNode the parent node where to insert the new node * - * @param newNode the node to insert - */ - public void insertNode(N parentNode, N newNode) { - parentNode.add(newNode); - bridge.notifyNodeInserted(newNode); - } - - /** - * Removes the given {@code node} from the registred tree model and returns - * his parent. - * - * @param node the node to remove - * @return the parent node of the removed node. - */ - public N removeNode(N node) { - N parentNode = node.getParent(); - bridge.removeNodeFromParent(node); - return parentNode; - } - - /** - * Moves the given {@code node} to the new {@code position}. - * - * @param parentNode the parent node - * @param node the node to move - * @param position the new position of the node - */ - public void moveNode(N parentNode, N node, int position) { - parentNode.remove(node); - parentNode.insert(node, position); - bridge.nodeStructureChanged(parentNode); - } - - /** - * Refreshs the given {@code node}. - * <p/> - * If flag {@code deep} is set to {@code true}, then it will refresh - * recursively children nodes. - * <p/> - * <b>Note:</b>As a side-effect, evvery node involved will become - * {@code dirty}. - * - * @param node the node to refresh - * @param deep un flag pour activer la repainte de la descendance du - * noeud - * @see JaxxNode#isDirty() - */ - @SuppressWarnings({"unchecked"}) - public void refreshNode(N node, boolean deep) { - if (log.isDebugEnabled()) { - log.debug("Will refresh (deep ? " + deep + ") node " + node); - } - bridge.nodeChanged(node); - if (deep) { - // repaint childs nodes - Enumeration<N> e = node.children(); - while (e.hasMoreElements()) { - N child = e.nextElement(); - refreshNode(child, true); - } - } - } - - /** - * To load all nodes of a model. - * - * @param node the root node to load - * @param dataProvider the data provider used to populate nodes - */ - @SuppressWarnings({"unchecked"}) - public void loadAllNodes(N node, DataProvider dataProvider) { - if (!checkModel()) { - return; - } - if (!node.isLoaded()) { - node.populateChilds(getBridge(), dataProvider); - Enumeration<? extends JaxxNode<?, ?>> enumeration = node.children(); - while (enumeration.hasMoreElements()) { - N jaxxNode = (N) enumeration.nextElement(); - loadAllNodes(jaxxNode, dataProvider); - } - } - } - - /** - * Selects the parent of the currently selected node. - * <p/> - * <b>Note:</> If selection is empty, then throws a NPE. - * - * @throws NullPointerException if selection is empty - */ - public void selectParentNode() throws NullPointerException { - - N node = getSelectedNode(); - - if (node == null) { - // pas de noeud selectionne - throw new NullPointerException("no selected node in context"); - } - node = node.getParent(); - - selectNode(node); - } - - /** - * Selects the given {@code node} in the registred tree. - * - * @param node the node to select - */ - public void selectNode(N node) { - if (!checkModel()) { - - // no model - return; - } - if (log.isDebugEnabled()) { - log.debug("try to select node [" + node + "]"); - } - TreePath path = new TreePath(bridge.getPathToRoot(node)); - - setSelectionPath(path); - scrollPathToVisible(path); - } - - /** - * Selects the node described by his given {@code path} of ids. - * - * @param path the absolute path of ids from root node to node to select. - */ - public void selectNode(String... path) { - if (!checkModel()) { - - // no model - return; - } - if (log.isDebugEnabled()) { - log.debug("try to select node from ids " + Arrays.toString(path)); - } - N root = bridge.getRoot(); - N node = findNode(root, path); - if (log.isDebugEnabled()) { - log.debug("selected node [" + node + "]"); - } - if (node != null) { - selectNode(node); - } - } - - /** - * Finds a node from the given root {@code node}, applying the path given - * by {@code ids}. - * - * @param node the starting node - * @param ids the path of ids to apply on the node. - * @return the find node or {@code null} if no node matchs. - */ - public N findNode(N node, String... ids) { - if (!checkModel()) { - - // no model - return null; - } - N result = null; - for (String id : ids) { - - result = node.findNodeById(id, getBridge(), getDataProvider()); - - if (result == null) { - - // un des noeud n'a pas ete trouve, on sort - break; - } - node = result; - } - return result; - } - - /** - * Checks if internal model was created. - * - * @return {@code true} if model was created, {@code false} otherwise. - */ - protected boolean checkModel() { - if (getModel() == null) { - - // no model set, - log.warn("No model set in " + this); - return false; - } - // model is set - return true; - } - - /** - * Populates nodes. - * <p/> - * If {@code node} is not {@code null}, then populate it. - * <p/> - * If {@code children} is not {@code null}, then populate them, moreover - * if {@code recurse} is set to {@code true} then do a recurse refresh on - * children. - * - * @param node the parent node to populate (optional) - * @param children the child nodes to populate (optional) - * @param recurse flag sets to {@code true} if should do recurse refresh on - * given {@code children} nodes. - */ - @SuppressWarnings({"unchecked"}) - protected void populateNode(N node, - Object[] children, - boolean recurse) { - DataProvider dataProvider = getDataProvider(); - if (node != null) { - if (log.isDebugEnabled()) { - log.debug("Will populate node : " + node); - } - node.populateNode(getBridge(), dataProvider, false); - } - if (children != null) { - for (Object o : children) { - N child = (N) o; - if (log.isDebugEnabled()) { - log.debug("Will populate child node : " + child); - } - child.populateNode(getBridge(), dataProvider, recurse); - } - } - } - - /** - * Convinient method to objet the casted node of a {@link TreePath}. - * - * @param path the path contaning the node. - * @return the casted node from the path. - */ - @SuppressWarnings({"unchecked"}) - protected N getNode(TreePath path) { - N result = (N) path.getLastPathComponent(); - return result; - } - - public void setUI(U ui) { - this.ui = ui; - } -} Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNode.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNode.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNode.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,207 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav; - -import jaxx.runtime.swing.nav.tree.AbstractJaxxTreeCellRenderer; - -import javax.swing.tree.TreeNode; -import java.io.Serializable; - -/** - * Definition of a node with a optional {@code childLoador} to build childs of - * node. - * <p/> - * A node is identified by an {@link #getId} of an associated data of type - * {@link #getInternalClass}. - * <p/> - * <b>Note:</b> - * <p><i> While using a {@code childLoador}, we can not know before node - * was loaded the exact count of his childs. As a matter of facts, real leaf - * nodes appears at the beginning in ui as a not leaf (there is a root handler). - * When node was loaded, a leaf node will be then displayed as required. - * </i></p> - * <p/> - * <h2>Why JaxxNode is generic ?</h2> - * In a project, you should implements your own Node extending with one like this : - * <pre> - * class MyNode extends JaxxNode<MyNode> { ... } - * </pre> - * While in this class, you overrides every method with a node return type, - * co-variance you'll be able to use this code : - * <pre> - * MyNode parentNode = new MyNode(); - * MyNode node = parentNode.getFirstNode(); - * </pre> - * So for final application this generic type avoid any cast for your own node - * type, this is quite convinient. - * <p/> - * Even if in your project, you wants to have a heriarchy of nodes, this will - * still works (if you use a genercic type on your abstract nodes). - * <h2>Internal states</h2> - * <ul> - * <li><b>internalClass</b> : the type of data associated with the node</li> - * <li><b>context</b> : an optinal context to distinguish different types of - * node with same {@code internalclass}</li> - * <li><b>id</b> : id of the data associated with the node</li> - * <li><b>dirty</b> : flag sets to {@code true} when node render MUST be recomputed</li> - * <li><b>loaded</b> : flag sets to {@code true} when node was loaded</li> - * <li><b>childLoador</b> : optional loador of childs</li> - * </ul> - * <h2>Static nodes</h2> - * Some nodes do not need auto-loading, we call them {@code static nodes}. - * The method {@link #isStaticNode()} gives this state. - * <p/> - * <b>Note:</b> A static node has no {@code childLoador}. - * <h2>Node loading</h2> - * Initialy node has no data child nodes, ({@link #isLoaded()} equals - * {@code false}). - * when model requires node's childs, it can load them via method - * {@link #populateNode(JaxxNavBridge , DataProvider, boolean)} - * and {@link #populateChilds(JaxxNavBridge, DataProvider)} methods. - * <h2>Node rendering</h2 - * the {@link AbstractJaxxTreeCellRenderer} looks the {@link #isDirty} state to - * know when render should be (re-)compute and set back the state to {@code false}. - * <p/> - * Each time, a node is modified, the {@link #isDirty} should be set to {@code true}. - * - * @author tchemit <chemit@codelutin.com> - * @since 2.1 - */ -public interface JaxxNode<M, N extends JaxxNode<M, N>> extends Cloneable, TreeNode, Serializable { - - String getId(); - - String getContext(); - - Class<?> getInternalClass(); - - boolean isLoaded(); - - boolean isDirty(); - - /** - * Convinient method to known if the node is a {@code String} typed. - * - * @return {@code true} if the type of node if - */ - boolean isStringNode(); - - /** - * To know if the node is static. - * <p/> - * A {@code static} node has no {@code childLoador}. - * - * @return {@code true} when the node is static : says, the node has - * no {@code childLoador}. - */ - boolean isStaticNode(); - - /** - * Gets the first node form this one to the root which has a none - * {@code String} type. - * - * @return the first concrete node type - */ - N getContainerNode(); - - /** - * Given an {@code id}, obtain the child with matching id. - * <p/> - * If node is NOT {@code loaded}, then first loads it (method - * {@link #populateChilds(JaxxNavBridge , DataProvider)}) then do search - * on direct childs of the node. - * - * @param id the id of the researched node - * @param bridge model owner of nodes - * @param provider data provider - * @return the found node or {@code null} if not found - */ - N findNodeById(String id, - JaxxNavBridge<M,N> bridge, - DataProvider provider); - - /** - * Changes the {@link #isDirty} state. - * <p/> - * As a side effect, when a renderer will use this node, it will force to - * reload the render from the {@link DataProvider}. - * - * @param dirty the new dirty value - */ - void setDirty(boolean dirty); - - @Override - boolean isLeaf(); - - Object getUserObject(); - - @Override - String toString(); - - //-------------------------------------------------------------------------- - //-- Populate methods - //-------------------------------------------------------------------------- - - /** - * To populate the node. A side-effect of this method is to set {@code dirty} - * the node (renderer will recompute the render of the node). - * <p/> - * If {@code populateChilds} is set to {@code true}, then also populate - * childs of the node using the given {@code dataProvider}. - * - * @param bridge le delegate modèles content le noeud - * @param provider le provider de données - * @param populateChilds un drapeau pour charger aussi les fils du noeud courant - */ - void populateNode(JaxxNavBridge<M,N> bridge, - DataProvider provider, - boolean populateChilds); - - /** - * To populate childs of the node (only when a none static node). - * A side-effect of this method is to set {@code loaded} of the node. - * <p/> - * For a static node, do nothing. - * - * @param bridge model owner of the node - * @param provider data provider - */ - void populateChilds(JaxxNavBridge<M,N> bridge, DataProvider provider); - - //-------------------------------------------------------------------------- - //-- Overrides to use generic type as return - //-------------------------------------------------------------------------- - - boolean isRoot(); - - @Override - N getParent(); - - void add(N node); - - void remove(N node); - - void insert(N node, int position); -} Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNodeChildLoador.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNodeChildLoador.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNodeChildLoador.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,168 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import java.io.Serializable; -import java.util.List; - -/** - * Object to load childs of a node. - * <p/> - * It uses {@link DataProvider} in method - * {@link #loadChilds(JaxxNavBridge , JaxxNode, DataProvider)} to obtain datas - * then build childs nodes. - * <p/> - * A factory of such objects can be found in {@link JaxxNavHelper} to make - * them reusable in other places than inside a {@link JaxxNode} to auto-load - * childs. - * <p/> - * For example when you want to creat by hand a new node, always prefer to reuse - * a such object rathen than duplicate same code in helper... - * - * @author tchemit <chemit@codelutin.com> - * @param <T> type of data used to create nodes (can be just a String type to use only ids) - * @param <O> type of data associated with nodes - * @param <N> type of node to used (to make possible full co-variance and no cast in fal implementations). - * @see JaxxNavHelper - * @see JaxxNode - * @since 2.1 - */ -public abstract class JaxxNodeChildLoador<T, O, M, B extends JaxxNavBridge<M, N>, N extends JaxxNode<M, N>> implements Serializable { - - /** Logger */ - static private final Log log = LogFactory.getLog(JaxxNodeChildLoador.class); - - /** Type of data of the node */ - protected final Class<O> beanType; - - protected JaxxNodeChildLoador(Class<O> beanType) { - this.beanType = beanType; - } - - /** - * Obtain the list of data used to create nodes. - * <p/> - * If type {@code T} is {@code O}, we directly use the data associated with nodes. - * - * @param parentClass type of parent - * @param parentId id of parent - * @param dataProvider the data provider - * @return the list of data - * @throws Exception if any problem - */ - public abstract List<T> getData(Class<?> parentClass, - String parentId, - DataProvider dataProvider) throws Exception; - - /** - * Hook to create a child node given his {@code data}. - * - * @param data the data of the node to create - * @param dataProvider the data provider - * @return the created node - */ - public abstract N createNode(T data, DataProvider dataProvider); - - /** - * Returns the type of data associated with nodes to create. - * - * @return the type of data associated with created nodes. - */ - public Class<O> getBeanType() { - return beanType; - } - - /** - * Load childs of the given {@code parentnode}. - * - * @param bridge the model owner of nodes - * @param parentNode the parent node where to insert nodes - * @param dataProvider data provider - * @throws Exception pour tout probleme de recuperation de donnees - */ - public void loadChilds(B bridge, - N parentNode, - DataProvider dataProvider) throws Exception { - - N containerNode = parentNode.getContainerNode(); - - List<T> datas; - if (containerNode == null) { - - // pas d'ancetre, il doit s'agir d'un premier noeud de données - // depuis le noeud root - - // recuperation des objets fils (sans connaitre de parent) - datas = getData(null, null, dataProvider); - - } else { - if (log.isDebugEnabled()) { - log.debug("search data for " + containerNode.getInternalClass() + - " : " + containerNode.getId()); - } - - // recuperation des objets fils - datas = getData(containerNode.getInternalClass(), - containerNode.getId(), - dataProvider); - } - - // on charge les fils - addChildNodes(parentNode, datas, dataProvider); - - // notifie le modele d'un ajout de noeuds - bridge.notifyChildNodesInserted(parentNode); - } - - /** - * Add childs to given {@code parentNode} using retrive {@code datas} from - * the data provider. - * <p/> - * This method is invoked by the {@link #loadChilds(JaxxNavBridge , JaxxNode, DataProvider)}. - * - * @param parentNode the node where to insert - * @param datas the data used to create node - * @param dataProvider the data provider - */ - protected void addChildNodes(N parentNode, - List<T> datas, - DataProvider dataProvider) { - - // creation des noeuds fils - if (datas != null) { - for (T o : datas) { - if (log.isInfoEnabled()) { - log.info("[" + parentNode + "] Will add child node for " + o); - } - N node = createNode(o, dataProvider); - parentNode.add(node); - } - } - } - -} \ No newline at end of file Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavBridge.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNavBridge.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavBridge.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavBridge.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,159 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav; + +import javax.swing.event.TreeModelListener; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; +import java.util.EventListener; + +/** + * Contract of the bridge used by {@link NavHelper} to hold model and ui. + * + * @author tchemit <chemit@codelutin.com> + * @param <M> Type of model to bridge + * @param <N> Type of nodes of the model + * @since 2.1 + */ +public interface NavBridge<M, N extends NavNode<M, N>> { + + //-------------------------------------------------------------------------- + //-- Model Queries + //-------------------------------------------------------------------------- + + M getModel(); + + N getRoot(); + + boolean isLeaf(Object node); + + int getChildCount(Object parent); + + N getChild(Object parent, int index); + + int getIndexOfChild(Object parent, Object child); + + TreeNode[] getPathToRoot(TreeNode aNode); + + //-------------------------------------------------------------------------- + //-- Model modification + //-------------------------------------------------------------------------- + + void setRoot(N node); + + void insertNodeInto(N newChild, N parent, int index); + + void removeNodeFromParent(N node); + + void reload(N node); + + //-------------------------------------------------------------------------- + //-- Listeners notifications + //-------------------------------------------------------------------------- + + void valueForPathChanged(TreePath path, Object newValue); + + void nodeStructureChanged(TreeNode node); + + void nodeChanged(TreeNode node); + + void nodesChanged(TreeNode node, int[] childIndices); + + void nodesWereInserted(N parent, int[] indices); + + void nodeWereInserted(N parentNode, int childIndice, N node); + + void nodesWereRemoved(TreeNode node, int[] childIndices, Object[] removedChildren); + + /** + * Notifies that the {@code node} was inserted. + * <p/> + * <b>Note:</b> The method recurses on childs (always notify parent before child) + * + * @param node node inserted + */ + void notifyNodeInserted(N node); + + /** + * Notifies that all childs nodes of {@code node} were + * inserted. + * <p/> + * <b>Note:</b> The method recurses on childs (always notify parent before child) + * + * @param node node where all childs where inserted + */ + void notifyChildNodesInserted(N node); + + //-------------------------------------------------------------------------- + //-- TreeModelListener provider + //-------------------------------------------------------------------------- + + void addTreeModelListener(TreeModelListener l); + + void removeTreeModelListener(TreeModelListener l); + + TreeModelListener[] getTreeModelListeners(); + + <T extends EventListener> T[] getListeners(Class<T> listenerType); + + + //-------------------------------------------------------------------------- + //-- UI + //-------------------------------------------------------------------------- + + +// U getUI(); +// +// void setUI(U ui); +// +// void scrollPathToVisible(TreePath path); +// +// void setSelectionPath(TreePath path); +// +// TreeSelectionModel getSelectionModel(); +// +// boolean isExpanded(TreePath pathToExpand); +// +// void expandPath(TreePath pathToExpand); +// +// /** +// * Obtains the {@link AbstractNavTreeCellRenderer} renderer of the +// * registred tree. +// * +// * @return the renderer of the registred tree or null if no tree was +// * registred nor the renderer is a {@link AbstractNavTreeCellRenderer}. +// */ +// AbstractNavTreeCellRenderer<M, N> getTreeCellRenderer(); +// +// /** +// * Obtains the selected node of the registred tree. +// * +// * @return the selected tree or {@code null} if no registred tree nor +// * selection empty. +// */ +// N getSelectedNode(); + + void setModel(M delegate); +} Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavBridge.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavDataProvider.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/DataProvider.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavDataProvider.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavDataProvider.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,46 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav; + +import jaxx.runtime.swing.nav.tree.AbstractNavTreeCellRenderer; + +/** + * Contract of provider of data. + * <p/> + * This object is used by {@link NavNodeChildLoador} to populate childs of node + * and by {@link AbstractNavTreeCellRenderer} to render nodes. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.1 + */ +public interface NavDataProvider { + + /** + * @return {@code true} is provider is enabled and can provide datas, + * {@code false} otherwise. + */ + boolean isEnabled(); + +} Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavDataProvider.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavHelper.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNavHelper.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavHelper.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavHelper.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,795 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav; + +import jaxx.runtime.swing.nav.tree.AbstractNavTreeCellRenderer; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.swing.event.TreeExpansionEvent; +import javax.swing.event.TreeModelEvent; +import javax.swing.event.TreeModelListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.event.TreeWillExpandListener; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Tree helper to deal with the build of trees and other usefull operations. + * <p/> + * A helper acts as an handler for a {@code tree}. It owns the {@link #getModel()} of + * the {@code #tree}. + * <p/> + * <b>Note:</b> A helper can NOT be used to manage multi-trees. + * <h2>Internal states</h2 + * <h3>Internal model</h3> + * To create the model, use method {@link #createModel(NavNode ,Object...)} given a + * root node. + * <p/> + * To obtain the model, use method {@link #getModel()}. + * <p/> + * <b>Note:</b> The helper internal model can be different from the tree model, + * but must be the <b>lowest</b> model, other models must listen nicely this + * model to obtain model modification and selection notifications. + * <h3>Internal tree</h3> + * As said before, a helper matches exactly one tree. + * <p/> + * To register the tree, use method {@link #setUI(Object, boolean, TreeSelectionListener)}. + * <p/> + * To obtain the tree, use method {@link #getUI()}. + * <h3>Internal data provider</h3> + * To populate childs nodes and render nodes, we use a {@link NavDataProvider}. + * <p/> + * To register the data provider, use method {@link #setDataProvider(NavDataProvider)}. + * <p/> + * To obtain the data provider, use method {@link #getDataProvider()}. + * <h2>Internal listeners</h2> + * Several listeners are used to manage the auto-loading of nodes in model : + * <h3>{@link #expandListener}</h3> + * This listener will load node's childs before node expands if the node is not loaded. + * <p/> + * See the {@link NavNode#isLoaded()} method. + * <h3>{@link #treeModelListener}</h3> + * To listen modification of the model, it will mainly repopulate nodes when + * required. + * <p/> + * See the method {@link #populateNode(NavNode , Object[], boolean)}. + * <h3>{@link #selectionListener}</h3> + * To listen modification of the selection, it will mainly expand paths if required. + * <p/> + * This is a requirement, since childs of a node should NOT be loaded, so when + * selects a node, always check the path from root to selected node are all fully + * loaded. + * <h2>Model methods</h2> + * The helper offers some methods to modify and query the internal tree model. + * <h3>Model modification</h3> + * <ul> + * <li>{@link #createModel(NavNode ,Object...)}</li> + * <li>{@link #insertNode(NavNode , NavNode)}</li> + * <li>{@link #removeNode(NavNode)}</li> + * <li>{@link #moveNode(NavNode , NavNode , int)}</li> + * <li>{@link #refreshNode(NavNode , boolean)}</li> + * <li>{@link #loadAllNodes(NavNode , NavDataProvider)}</li> + * <p/> + * </ul> + * <h3>Model selection modification</h3> + * <ul> + * <li>{@link #selectNode(NavNode)}</li> + * <li>{@link #selectNode(String...)}</li> + * <li>{@link #selectParentNode()}</li> + * </ul> + * <h3>Model query</h3> + * <ul> + * <li>{@link #findNode(NavNode , String...)}</li> + * </ul> + * <h3>Child loadors factory</h3> + * The class offers a factory of {@link NavNodeChildLoador}, use the method + * {@link #getChildLoador(Class)} to obtain the correct child loador given his type. + * + * @author tchemit <chemit@codelutin.com> + * @param <U> Type of ui to bridge + * @see NavNode + * @see NavNodeChildLoador + * @see AbstractNavTreeCellRenderer + * @since 2.1 + */ +public abstract class NavHelper<M, U, B extends NavBridge<M, N>, N extends NavNode<M, N>> { + + /** Logger */ + static private final Log log = LogFactory.getLog(NavHelper.class); + + //-------------------------------------------------------------------------- + //-- Methods to implement in your helper (related only to ui) + //-------------------------------------------------------------------------- + + public abstract void scrollPathToVisible(TreePath path); + + public abstract void setSelectionPath(TreePath path); + + public abstract TreeSelectionModel getSelectionModel(); + + public abstract boolean isExpanded(TreePath pathToExpand); + + public abstract void expandPath(TreePath pathToExpand); + + /** + * Register a new root node. + * <p/> + * If internal {@link #getModel()} does not exists, creates a new one from his given root {@code node}, + * otherwise just set the new root on the existing model. + * <p/> + * <p/> + * <b>Note:</b> As a side-effect, the model will be keep in field {@link #getModel()} + * and the {@link #treeModelListener} will be registred on this model. + * + * @param node the root node of the new model + * @param extraArgs extra args to create initial model + * @return the new model + */ + @SuppressWarnings({"unchecked"}) + protected abstract M createModel(N node, Object... extraArgs); + + /** + * The shared bridge. + * <p/> + * A helper deals with only ONE model (this one), becuase we add some + * listeners on it, we prefer always to keep ONE instance (any way this is + * a good thing). + * <p/> + * If you want to create a new model, just creates the good root node and + * push it in this model. + * <p/> + * For example, if you wrap the shared model with a filter model... Anyway, all + * listeners of this helper apply always of THIs model. + */ + private final B bridge; + + /** the associated ui component */ + private U ui; + + /** The shared data provider used to obtain datas to populate nodes and render them. */ + protected NavDataProvider dataProvider; + + /** + * A {@link TreeWillExpandListener} used to listen when tree should expand. + * <p/> + * If so, the listener will load selected node childs if required + * (says when the {@link NavNode#isLoaded()} is sets to {@code false}). + */ + protected TreeWillExpandListener expandListener; + + /** + * pour ouvrir les fils d'un noeud que l'on vient de sélectionner pour + * éviter d'avoir à faire des doubles clics. + */ + protected TreeSelectionListener selectionListener; + + /** + * pour recharger le rendu des noeuds (et charger les fils si nécessaires) + * lors d'une modification dans le modèle de l'arbre. + */ + protected TreeModelListener treeModelListener; + + /** Cache of child loadors. */ + protected static Set<? super NavNodeChildLoador<?, ?, ?, ?, ?>> childLoadors; + + protected static Set<? super NavNodeChildLoador<?, ?, ?, ?, ?>> getChildLoadors() { + if (childLoadors == null) { + childLoadors = new HashSet<NavNodeChildLoador<?, ?, ?, ?, ?>>(); + } + return childLoadors; + } + + /** + * Obtains the {@link NavNodeChildLoador} of the given {@code type} from + * internal cache. + * <p/> + * <b>Note:</b> The loador will be instanciated if not found, and push in cache. + * + * @param type the type of loador to get + * @param <L> the type of loador to get + * @return the loador from cache + */ + @SuppressWarnings({"unchecked"}) + public static <L extends NavNodeChildLoador<?, ?, ?, ?, ?>> L getChildLoador(Class<L> type) { + Set<? super NavNodeChildLoador<?, ?, ?, ?, ?>> cache = getChildLoadors(); + NavNodeChildLoador<?, ?, ?, ?, ?> result = null; + for (Object loador : cache) { + if (type.equals(loador.getClass())) { + result = (NavNodeChildLoador<?, ?, ?, ?, ?>) loador; + break; + } + } + if (result == null) { + // add it in cache + try { + result = type.newInstance(); + cache.add(result); + if (log.isDebugEnabled()) { + log.debug("Add " + result + " in loadors cache (new size:" + cache.size() + ")."); + } + } catch (Exception e) { + throw new IllegalArgumentException("Could not instanciate loador [" + type.getName() + "]", e); + } + } + return (L) result; + } + + public NavHelper(B bridge) { + this.bridge = bridge; + + selectionListener = new TreeSelectionListener() { + + @Override + public void valueChanged(TreeSelectionEvent e) { + if (!checkModel()) { + return; + } + + // Hack, because event.getSource for TreeTable doesnt return selectionModel + TreeSelectionModel source = getSelectionModel(); + + if (source.isSelectionEmpty()) { + + // empty selection + if (log.isDebugEnabled()) { + log.debug("Selection is empty."); + } + return; + } + + boolean debugEnabled = log.isDebugEnabled(); + boolean traceEnabled = log.isTraceEnabled(); + for (TreePath path : e.getPaths()) { + + N node = getNode(path); + if (node == null) { + + // pas de noeud selectionne + if (debugEnabled) { + log.debug("Skip for null node."); + } + continue; + } + + boolean isAdded = e.isAddedPath(path); + + TreePath pathToExpand = new TreePath(NavHelper.this.bridge.getPathToRoot(node)); + boolean pathExpanded = isExpanded(pathToExpand); + + if (traceEnabled || isAdded && debugEnabled) { + log.debug("==== Node selection ===================================="); + log.debug("node ? " + node); + log.debug("is added ? " + isAdded); + log.debug("is path expanded ? " + pathExpanded); + log.debug("is node static ? " + node.isStaticNode()); + log.debug("is node loaded ? " + node.isLoaded()); + log.debug("is node leaf ? " + node.isLeaf()); + log.debug("node nb childs ? " + node.getChildCount()); + } + + if (isAdded && !pathExpanded) { + + // ask to expand path + log.info("expand node [" + pathToExpand + "]"); + expandPath(pathToExpand); + } + } + } + }; + expandListener = new TreeWillExpandListener() { + @Override + public void treeWillExpand(TreeExpansionEvent event) { + + if (!checkModel()) { + // no model + return; + } + + N source = getNode(event.getPath()); + + if (source.isLoaded()) { + + // node is already loaded, nothing to do + return; + } + + if (log.isDebugEnabled()) { + log.debug("will load childs of node [" + source + "]"); + } + // populate childs of node + source.populateChilds(getBridge(), getDataProvider()); + } + + @Override + public void treeWillCollapse(TreeExpansionEvent event) { + } + }; + + treeModelListener = new TreeModelListener() { + @Override + public void treeNodesInserted(TreeModelEvent e) { + if (!checkModel()) { + // no model + return; + } + N source = getNode(e.getTreePath()); + Object[] children = e.getChildren(); + if (log.isDebugEnabled()) { + log.debug(getMessage("inserted ", source, children)); + } + + // ask to populate children nodes + populateNode(null, children, false); + } + + @SuppressWarnings({"unchecked"}) + @Override + public void treeNodesRemoved(TreeModelEvent e) { + if (!checkModel()) { + // no model + return; + } + N source = getNode(e.getTreePath()); + Object[] children = e.getChildren(); + if (log.isDebugEnabled()) { + log.debug(getMessage("removed ", source, children)); + } + + // Invalidates nodes in renderer cache (if any) + AbstractNavTreeCellRenderer<M, N> renderer = getTreeCellRenderer(); + if (children != null && renderer != null) { + for (Object child : children) { + renderer.invalidateCache((N) child); + } + } + } + + @Override + public void treeNodesChanged(TreeModelEvent e) { + if (!checkModel()) { + // no model + return; + } + + N source = getNode(e.getTreePath()); + Object[] children = e.getChildren(); + if (log.isDebugEnabled()) { + log.debug(getMessage("changed ", source, children)); + } + + // ask to populate modified child nodes + populateNode(null, children, false); + } + + @Override + public void treeStructureChanged(TreeModelEvent e) { + if (!checkModel()) { + // no model + return; + } + N source = getNode(e.getTreePath()); + Object[] children = e.getChildren(); + if (log.isDebugEnabled()) { + log.debug(getMessage("structure changed", source, children)); + } + + // ask to populate structure modified node and nodes recursively + populateNode(source, children, true); + } + + protected String getMessage(String action, N source, Object[] children) { + StringBuilder sb = new StringBuilder(); + sb.append("==== Nodes "); + sb.append(action); + sb.append(" ================="); + sb.append("\nsource : ").append(source); + sb.append("\nnb nodes : "); + sb.append(children == null ? 0 : children.length); + if (children != null) { + int i = 0; + for (Object child : children) { + sb.append("\n ["); + sb.append(i++); + sb.append("] - "); + sb.append(child); + } + } + return sb.toString(); + } + }; + } + + /** + * Obtains the attached data provider used to populate and render nodes. + * + * @return the attached data provider + */ + protected NavDataProvider getDataProvider() { + return dataProvider; + } + + /** + * Obtains the jaxx delegate tree model + * + * @return the internal tree model or {@code null} if none was created. + */ + public M getModel() { + return bridge.getModel(); + } + + /** + * Obtains the jaxx delegate tree model + * + * @return the internal tree model or {@code null} if none was created. + */ + protected B getBridge() { + return bridge; + } + + /** + * Obtains the ui associated with model in helper. + * + * @return the ui (or {@code null} if no ui attached) + */ + public U getUI() { + return ui; + } + + public N getRootNode() { + if (!checkModel()) { + return null; + } + return bridge.getRoot(); + } + + /** + * Obtains the {@link AbstractNavTreeCellRenderer} renderer of the + * registred tree. + * + * @return the renderer of the registred tree or null if no tree was + * registred nor the renderer is a {@link AbstractNavTreeCellRenderer}. + */ + public abstract AbstractNavTreeCellRenderer<M, N> getTreeCellRenderer(); + + /** + * Obtains the selected node of the registred tree. + * + * @return the selected tree or {@code null} if no registred tree nor + * selection empty. + */ + public abstract N getSelectedNode(); + + /** + * Obtains the path of ids fro the root node to the selected node on the + * registred tree. + * + * @return the array of ids from root node to selected node. + */ + public String[] getSelectedIds() { + List<String> result = new ArrayList<String>(); + N selectedNode = getSelectedNode(); + while (selectedNode != null && !selectedNode.isRoot()) { + + result.add(selectedNode.getId()); + selectedNode = selectedNode.getParent(); + } + Collections.reverse(result); + return result.toArray(new String[result.size()]); + } + + /** + * Registers the given {@code tree} for this helper. + * <p/> + * <b>Note:</b> as a side-effect, it will register (if required) the + * {@link #expandListener} listener and the {@link #selectionListener}. + * + * @param tree the tree to register + * @param addExpandTreeListener a flag to add expand listener + * @param listener the optional selection listener to add + */ + @SuppressWarnings({"unchecked"}) + public abstract void setUI(U tree, + boolean addExpandTreeListener, + TreeSelectionListener listener); + + /** + * Registers the {@code dataProvider} for the helper. + * <p/> + * <b>Node:</b> As a side-effect, the provider will be propagate to the + * renderer of the registred tree (if any). + * + * @param dataProvider the data provider to use + */ + public void setDataProvider(NavDataProvider dataProvider) { + this.dataProvider = dataProvider; + AbstractNavTreeCellRenderer<M, N> renderer = getTreeCellRenderer(); + if (renderer != null) { + + // dispatch provider to renderer + renderer.setDataProvider(dataProvider); + } + } + + /** + * Inserts the given node to the given {@code parentNode}. + * <p/> + * The node will be added to his parent, then creation listeners will be + * fired. + * + * @param parentNode the parent node where to insert the new node * + * @param newNode the node to insert + */ + public void insertNode(N parentNode, N newNode) { + parentNode.add(newNode); + bridge.notifyNodeInserted(newNode); + } + + /** + * Removes the given {@code node} from the registred tree model and returns + * his parent. + * + * @param node the node to remove + * @return the parent node of the removed node. + */ + public N removeNode(N node) { + N parentNode = node.getParent(); + bridge.removeNodeFromParent(node); + return parentNode; + } + + /** + * Moves the given {@code node} to the new {@code position}. + * + * @param parentNode the parent node + * @param node the node to move + * @param position the new position of the node + */ + public void moveNode(N parentNode, N node, int position) { + parentNode.remove(node); + parentNode.insert(node, position); + bridge.nodeStructureChanged(parentNode); + } + + /** + * Refreshs the given {@code node}. + * <p/> + * If flag {@code deep} is set to {@code true}, then it will refresh + * recursively children nodes. + * <p/> + * <b>Note:</b>As a side-effect, evvery node involved will become + * {@code dirty}. + * + * @param node the node to refresh + * @param deep un flag pour activer la repainte de la descendance du + * noeud + * @see NavNode#isDirty() + */ + @SuppressWarnings({"unchecked"}) + public void refreshNode(N node, boolean deep) { + if (log.isDebugEnabled()) { + log.debug("Will refresh (deep ? " + deep + ") node " + node); + } + bridge.nodeChanged(node); + if (deep) { + // repaint childs nodes + Enumeration<N> e = node.children(); + while (e.hasMoreElements()) { + N child = e.nextElement(); + refreshNode(child, true); + } + } + } + + /** + * To load all nodes of a model. + * + * @param node the root node to load + * @param dataProvider the data provider used to populate nodes + */ + @SuppressWarnings({"unchecked"}) + public void loadAllNodes(N node, NavDataProvider dataProvider) { + if (!checkModel()) { + return; + } + if (!node.isLoaded()) { + node.populateChilds(getBridge(), dataProvider); + Enumeration<? extends NavNode<?, ?>> enumeration = node.children(); + while (enumeration.hasMoreElements()) { + N jaxxNode = (N) enumeration.nextElement(); + loadAllNodes(jaxxNode, dataProvider); + } + } + } + + /** + * Selects the parent of the currently selected node. + * <p/> + * <b>Note:</> If selection is empty, then throws a NPE. + * + * @throws NullPointerException if selection is empty + */ + public void selectParentNode() throws NullPointerException { + + N node = getSelectedNode(); + + if (node == null) { + // pas de noeud selectionne + throw new NullPointerException("no selected node in context"); + } + node = node.getParent(); + + selectNode(node); + } + + /** + * Selects the given {@code node} in the registred tree. + * + * @param node the node to select + */ + public void selectNode(N node) { + if (!checkModel()) { + + // no model + return; + } + if (log.isDebugEnabled()) { + log.debug("try to select node [" + node + "]"); + } + TreePath path = new TreePath(bridge.getPathToRoot(node)); + + setSelectionPath(path); + scrollPathToVisible(path); + } + + /** + * Selects the node described by his given {@code path} of ids. + * + * @param path the absolute path of ids from root node to node to select. + */ + public void selectNode(String... path) { + if (!checkModel()) { + + // no model + return; + } + if (log.isDebugEnabled()) { + log.debug("try to select node from ids " + Arrays.toString(path)); + } + N root = bridge.getRoot(); + N node = findNode(root, path); + if (log.isDebugEnabled()) { + log.debug("selected node [" + node + "]"); + } + if (node != null) { + selectNode(node); + } + } + + /** + * Finds a node from the given root {@code node}, applying the path given + * by {@code ids}. + * + * @param node the starting node + * @param ids the path of ids to apply on the node. + * @return the find node or {@code null} if no node matchs. + */ + public N findNode(N node, String... ids) { + if (!checkModel()) { + + // no model + return null; + } + N result = null; + for (String id : ids) { + + result = node.findNodeById(id, getBridge(), getDataProvider()); + + if (result == null) { + + // un des noeud n'a pas ete trouve, on sort + break; + } + node = result; + } + return result; + } + + /** + * Checks if internal model was created. + * + * @return {@code true} if model was created, {@code false} otherwise. + */ + protected boolean checkModel() { + if (getModel() == null) { + + // no model set, + log.warn("No model set in " + this); + return false; + } + // model is set + return true; + } + + /** + * Populates nodes. + * <p/> + * If {@code node} is not {@code null}, then populate it. + * <p/> + * If {@code children} is not {@code null}, then populate them, moreover + * if {@code recurse} is set to {@code true} then do a recurse refresh on + * children. + * + * @param node the parent node to populate (optional) + * @param children the child nodes to populate (optional) + * @param recurse flag sets to {@code true} if should do recurse refresh on + * given {@code children} nodes. + */ + @SuppressWarnings({"unchecked"}) + protected void populateNode(N node, + Object[] children, + boolean recurse) { + NavDataProvider dataProvider = getDataProvider(); + if (node != null) { + if (log.isDebugEnabled()) { + log.debug("Will populate node : " + node); + } + node.populateNode(getBridge(), dataProvider, false); + } + if (children != null) { + for (Object o : children) { + N child = (N) o; + if (log.isDebugEnabled()) { + log.debug("Will populate child node : " + child); + } + child.populateNode(getBridge(), dataProvider, recurse); + } + } + } + + /** + * Convinient method to objet the casted node of a {@link TreePath}. + * + * @param path the path contaning the node. + * @return the casted node from the path. + */ + @SuppressWarnings({"unchecked"}) + protected N getNode(TreePath path) { + N result = (N) path.getLastPathComponent(); + return result; + } + + public void setUI(U ui) { + this.ui = ui; + } +} Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavHelper.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavNode.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNode.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavNode.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavNode.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,207 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav; + +import jaxx.runtime.swing.nav.tree.AbstractNavTreeCellRenderer; + +import javax.swing.tree.TreeNode; +import java.io.Serializable; + +/** + * Definition of a node with a optional {@code childLoador} to build childs of + * node. + * <p/> + * A node is identified by an {@link #getId} of an associated data of type + * {@link #getInternalClass}. + * <p/> + * <b>Note:</b> + * <p><i> While using a {@code childLoador}, we can not know before node + * was loaded the exact count of his childs. As a matter of facts, real leaf + * nodes appears at the beginning in ui as a not leaf (there is a root handler). + * When node was loaded, a leaf node will be then displayed as required. + * </i></p> + * <p/> + * <h2>Why NavNode is generic ?</h2> + * In a project, you should implements your own Node extending with one like this : + * <pre> + * class MyNode extends NavNode<MyNode> { ... } + * </pre> + * While in this class, you overrides every method with a node return type, + * co-variance you'll be able to use this code : + * <pre> + * MyNode parentNode = new MyNode(); + * MyNode node = parentNode.getFirstNode(); + * </pre> + * So for final application this generic type avoid any cast for your own node + * type, this is quite convinient. + * <p/> + * Even if in your project, you wants to have a heriarchy of nodes, this will + * still works (if you use a genercic type on your abstract nodes). + * <h2>Internal states</h2> + * <ul> + * <li><b>internalClass</b> : the type of data associated with the node</li> + * <li><b>context</b> : an optinal context to distinguish different types of + * node with same {@code internalclass}</li> + * <li><b>id</b> : id of the data associated with the node</li> + * <li><b>dirty</b> : flag sets to {@code true} when node render MUST be recomputed</li> + * <li><b>loaded</b> : flag sets to {@code true} when node was loaded</li> + * <li><b>childLoador</b> : optional loador of childs</li> + * </ul> + * <h2>Static nodes</h2> + * Some nodes do not need auto-loading, we call them {@code static nodes}. + * The method {@link #isStaticNode()} gives this state. + * <p/> + * <b>Note:</b> A static node has no {@code childLoador}. + * <h2>Node loading</h2> + * Initialy node has no data child nodes, ({@link #isLoaded()} equals + * {@code false}). + * when model requires node's childs, it can load them via method + * {@link #populateNode(NavBridge , NavDataProvider , boolean)} + * and {@link #populateChilds(NavBridge , NavDataProvider)} methods. + * <h2>Node rendering</h2 + * the {@link AbstractNavTreeCellRenderer} looks the {@link #isDirty} state to + * know when render should be (re-)compute and set back the state to {@code false}. + * <p/> + * Each time, a node is modified, the {@link #isDirty} should be set to {@code true}. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.1 + */ +public interface NavNode<M, N extends NavNode<M, N>> extends Cloneable, TreeNode, Serializable { + + String getId(); + + String getContext(); + + Class<?> getInternalClass(); + + boolean isLoaded(); + + boolean isDirty(); + + /** + * Convinient method to known if the node is a {@code String} typed. + * + * @return {@code true} if the type of node if + */ + boolean isStringNode(); + + /** + * To know if the node is static. + * <p/> + * A {@code static} node has no {@code childLoador}. + * + * @return {@code true} when the node is static : says, the node has + * no {@code childLoador}. + */ + boolean isStaticNode(); + + /** + * Gets the first node form this one to the root which has a none + * {@code String} type. + * + * @return the first concrete node type + */ + N getContainerNode(); + + /** + * Given an {@code id}, obtain the child with matching id. + * <p/> + * If node is NOT {@code loaded}, then first loads it (method + * {@link #populateChilds(NavBridge , NavDataProvider)}) then do search + * on direct childs of the node. + * + * @param id the id of the researched node + * @param bridge model owner of nodes + * @param provider data provider + * @return the found node or {@code null} if not found + */ + N findNodeById(String id, + NavBridge<M,N> bridge, + NavDataProvider provider); + + /** + * Changes the {@link #isDirty} state. + * <p/> + * As a side effect, when a renderer will use this node, it will force to + * reload the render from the {@link NavDataProvider}. + * + * @param dirty the new dirty value + */ + void setDirty(boolean dirty); + + @Override + boolean isLeaf(); + + Object getUserObject(); + + @Override + String toString(); + + //-------------------------------------------------------------------------- + //-- Populate methods + //-------------------------------------------------------------------------- + + /** + * To populate the node. A side-effect of this method is to set {@code dirty} + * the node (renderer will recompute the render of the node). + * <p/> + * If {@code populateChilds} is set to {@code true}, then also populate + * childs of the node using the given {@code dataProvider}. + * + * @param bridge le delegate modèles content le noeud + * @param provider le provider de données + * @param populateChilds un drapeau pour charger aussi les fils du noeud courant + */ + void populateNode(NavBridge<M,N> bridge, + NavDataProvider provider, + boolean populateChilds); + + /** + * To populate childs of the node (only when a none static node). + * A side-effect of this method is to set {@code loaded} of the node. + * <p/> + * For a static node, do nothing. + * + * @param bridge model owner of the node + * @param provider data provider + */ + void populateChilds(NavBridge<M,N> bridge, NavDataProvider provider); + + //-------------------------------------------------------------------------- + //-- Overrides to use generic type as return + //-------------------------------------------------------------------------- + + boolean isRoot(); + + @Override + N getParent(); + + void add(N node); + + void remove(N node); + + void insert(N node, int position); +} Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavNode.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavNodeChildLoador.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/JaxxNodeChildLoador.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavNodeChildLoador.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavNodeChildLoador.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,168 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.io.Serializable; +import java.util.List; + +/** + * Object to load childs of a node. + * <p/> + * It uses {@link NavDataProvider} in method + * {@link #loadChilds(NavBridge , NavNode , NavDataProvider)} to obtain datas + * then build childs nodes. + * <p/> + * A factory of such objects can be found in {@link NavHelper} to make + * them reusable in other places than inside a {@link NavNode} to auto-load + * childs. + * <p/> + * For example when you want to creat by hand a new node, always prefer to reuse + * a such object rathen than duplicate same code in helper... + * + * @author tchemit <chemit@codelutin.com> + * @param <T> type of data used to create nodes (can be just a String type to use only ids) + * @param <O> type of data associated with nodes + * @param <N> type of node to used (to make possible full co-variance and no cast in fal implementations). + * @see NavHelper + * @see NavNode + * @since 2.1 + */ +public abstract class NavNodeChildLoador<T, O, M, B extends NavBridge<M, N>, N extends NavNode<M, N>> implements Serializable { + + /** Logger */ + static private final Log log = LogFactory.getLog(NavNodeChildLoador.class); + + /** Type of data of the node */ + protected final Class<O> beanType; + + protected NavNodeChildLoador(Class<O> beanType) { + this.beanType = beanType; + } + + /** + * Obtain the list of data used to create nodes. + * <p/> + * If type {@code T} is {@code O}, we directly use the data associated with nodes. + * + * @param parentClass type of parent + * @param parentId id of parent + * @param dataProvider the data provider + * @return the list of data + * @throws Exception if any problem + */ + public abstract List<T> getData(Class<?> parentClass, + String parentId, + NavDataProvider dataProvider) throws Exception; + + /** + * Hook to create a child node given his {@code data}. + * + * @param data the data of the node to create + * @param dataProvider the data provider + * @return the created node + */ + public abstract N createNode(T data, NavDataProvider dataProvider); + + /** + * Returns the type of data associated with nodes to create. + * + * @return the type of data associated with created nodes. + */ + public Class<O> getBeanType() { + return beanType; + } + + /** + * Load childs of the given {@code parentnode}. + * + * @param bridge the model owner of nodes + * @param parentNode the parent node where to insert nodes + * @param dataProvider data provider + * @throws Exception pour tout probleme de recuperation de donnees + */ + public void loadChilds(B bridge, + N parentNode, + NavDataProvider dataProvider) throws Exception { + + N containerNode = parentNode.getContainerNode(); + + List<T> datas; + if (containerNode == null) { + + // pas d'ancetre, il doit s'agir d'un premier noeud de données + // depuis le noeud root + + // recuperation des objets fils (sans connaitre de parent) + datas = getData(null, null, dataProvider); + + } else { + if (log.isDebugEnabled()) { + log.debug("search data for " + containerNode.getInternalClass() + + " : " + containerNode.getId()); + } + + // recuperation des objets fils + datas = getData(containerNode.getInternalClass(), + containerNode.getId(), + dataProvider); + } + + // on charge les fils + addChildNodes(parentNode, datas, dataProvider); + + // notifie le modele d'un ajout de noeuds + bridge.notifyChildNodesInserted(parentNode); + } + + /** + * Add childs to given {@code parentNode} using retrive {@code datas} from + * the data provider. + * <p/> + * This method is invoked by the {@link #loadChilds(NavBridge , NavNode , NavDataProvider)}. + * + * @param parentNode the node where to insert + * @param datas the data used to create node + * @param dataProvider the data provider + */ + protected void addChildNodes(N parentNode, + List<T> datas, + NavDataProvider dataProvider) { + + // creation des noeuds fils + if (datas != null) { + for (T o : datas) { + if (log.isInfoEnabled()) { + log.info("[" + parentNode + "] Will add child node for " + o); + } + N node = createNode(o, dataProvider); + parentNode.add(node); + } + } + } + +} \ No newline at end of file Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/NavNodeChildLoador.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/package.html =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/package.html 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/package.html 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,9 +1,17 @@ <html> <body> -<h1>JAXX - tree utilities</h1> +<h1>JAXX - nav api</h1> -This package contains all the classes of the new tree and treeTable framework. +This package contains a little framework to build dynamci nodes. +Tow implementations are offers : + +<ul> + <li>One for the <b>JTree</b> in <b>jaxx.runtime.swing.nav.tree</b></li> + <li>One for the <b>JXTreeTable</b> in + <b>jaxx.runtime.swing.nav.treetable</b></li> +</ul> + <p> Replace the previous framework from package <code>jaxx.runtime.swing.navigation</code> @@ -38,11 +46,11 @@ <h2>DataProvider</h2> -Contract of objet responsible of acquiring data to populate nodes and render them. +Contract of objet responsible of acquiring data to populate nodes and render +them. <h2>JaxxNode</h2> -Jaxx node contract customized for our purpose (loaded, dirty -states,...). +Jaxx node contract customized for our purpose (loaded, dirty states,...). <h2>JaxxNodeChildLoador</h2> Contract to load childs of a JaxxNode using DataProvider. @@ -50,34 +58,8 @@ <h2>JaxxNavHelper</h2> Helper to manage a tree or a tree table using auto-loading nodes. -<h2>JaxxDelegateTreeModel</h2> -Model to switch between tree model and tree table model. +<h2>JaxxNavBridge</h2> +Bridge to encapsulate models. - -<h1>Tree api</h1> - - -<h2>JaxxTreeNode</h2> -An override of DefaultMutableTreeNode implement JaxxNode. - -<h2>JaxxTreeNodeChildLoador</h2> -Object to load childs of a tree node using DataProvider. - -<h2>AbstractJaxxTreeCellRenderer</h2> -Abstract renderer using DataProvider to acquire node render. - - -<h1>Tree table api</h1> - - -<h2>JaxxTreeTableNode</h2> -An override of DefaultMutableTreeTableNode implement JaxxNode - -<h2>JaxxTreeTableNodeChildLoador</h2> -Object to load childs of a tree table node using DataProvider. - -<h2>JaxxTreeTableModel</h2> -Implementation of TreeTableModel used by JaxxDelegateTreeModel - </body> </html> Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/AbstractJaxxTreeCellRenderer.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/AbstractJaxxTreeCellRenderer.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/AbstractJaxxTreeCellRenderer.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,128 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav.tree; - -import jaxx.runtime.swing.nav.DataProvider; -import jaxx.runtime.swing.nav.JaxxNode; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.swing.tree.DefaultTreeCellRenderer; -import java.util.HashMap; -import java.util.Map; - -import static org.nuiton.i18n.I18n._; - -/** - * Le renderer abstrait (qui a toutes les methodes qui aident) pour implanter de - * vrai renderer pour les différents cas d'utilisation de l'abre de navigation. - * - * @author chemit <chemit@codelutin.com> - * @since 1.2 - */ -public abstract class AbstractJaxxTreeCellRenderer<M,N extends JaxxNode<M,N>> extends DefaultTreeCellRenderer { - - /** Logger */ - protected static final Log log = - LogFactory.getLog(AbstractJaxxTreeCellRenderer.class); - - /** source de donnée */ - protected DataProvider dataProvider; - - /** le cache de rendu */ - protected final Map<N, String> renderCache = new HashMap<N, String>(); - - /** - * Determines the text render of a node using the {@link #dataProvider}. - * - * @param node the node to render - * @return the text render of the node - */ - protected abstract String computeNodeText(N node); - - protected AbstractJaxxTreeCellRenderer() { - } - - public DataProvider getDataProvider() { - return dataProvider; - } - - public void setDataProvider(DataProvider dataProvider) { - this.dataProvider = dataProvider; - - // une nouvelle source utilisée, on vide le cache - clearCache(); - } - - public void clearCache() { - renderCache.clear(); - } - - public void invalidateCache(N node) { - renderCache.remove(node); - } - - @Override - protected void finalize() throws Throwable { - super.finalize(); - clearCache(); - } - - public String getNodeText(N node) { - if (node == null) { - return null; - } - String text; - - if (node.isDirty() || !renderCache.containsKey(node)) { - - // calculer le rendu du noeud - if (node.isStringNode()) { - text = _(node.getId()); - - } else { - - text = computeNodeText(node); - } - - if (log.isDebugEnabled()) { - log.debug("text for node [" + node + "] = <" + text + ">"); - } - - // sauvegarde dans le cache - renderCache.put(node, text); - - // le noeud est de nouveau propre - node.setDirty(false); - - } else { - - // recupération directement du rendu dans le cache - text = renderCache.get(node); - } - - return text; - } -} Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/AbstractNavTreeCellRenderer.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/AbstractJaxxTreeCellRenderer.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/AbstractNavTreeCellRenderer.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/AbstractNavTreeCellRenderer.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,128 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav.tree; + +import jaxx.runtime.swing.nav.NavDataProvider; +import jaxx.runtime.swing.nav.NavNode; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.swing.tree.DefaultTreeCellRenderer; +import java.util.HashMap; +import java.util.Map; + +import static org.nuiton.i18n.I18n._; + +/** + * Le renderer abstrait (qui a toutes les methodes qui aident) pour implanter de + * vrai renderer pour les différents cas d'utilisation de l'abre de navigation. + * + * @author chemit <chemit@codelutin.com> + * @since 1.2 + */ +public abstract class AbstractNavTreeCellRenderer<M, N extends NavNode<M, N>> extends DefaultTreeCellRenderer { + + /** Logger */ + protected static final Log log = + LogFactory.getLog(AbstractNavTreeCellRenderer.class); + + /** source de donnée */ + protected NavDataProvider dataProvider; + + /** le cache de rendu */ + protected final Map<N, String> renderCache = new HashMap<N, String>(); + + /** + * Determines the text render of a node using the {@link #dataProvider}. + * + * @param node the node to render + * @return the text render of the node + */ + protected abstract String computeNodeText(N node); + + protected AbstractNavTreeCellRenderer() { + } + + public NavDataProvider getDataProvider() { + return dataProvider; + } + + public void setDataProvider(NavDataProvider dataProvider) { + this.dataProvider = dataProvider; + + // une nouvelle source utilisée, on vide le cache + clearCache(); + } + + public void clearCache() { + renderCache.clear(); + } + + public void invalidateCache(N node) { + renderCache.remove(node); + } + + @Override + protected void finalize() throws Throwable { + super.finalize(); + clearCache(); + } + + public String getNodeText(N node) { + if (node == null) { + return null; + } + String text; + + if (node.isDirty() || !renderCache.containsKey(node)) { + + // calculer le rendu du noeud + if (node.isStringNode()) { + text = _(node.getId()); + + } else { + + text = computeNodeText(node); + } + + if (log.isDebugEnabled()) { + log.debug("text for node [" + node + "] = <" + text + ">"); + } + + // sauvegarde dans le cache + renderCache.put(node, text); + + // le noeud est de nouveau propre + node.setDirty(false); + + } else { + + // recupération directement du rendu dans le cache + text = renderCache.get(node); + } + + return text; + } +} Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/AbstractNavTreeCellRenderer.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeBridge.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeBridge.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeBridge.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,306 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav.tree; - -import jaxx.runtime.swing.nav.JaxxNavBridge; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.swing.JTree; -import javax.swing.event.TreeModelListener; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreeNode; -import javax.swing.tree.TreePath; -import java.util.Enumeration; -import java.util.EventListener; - -/** - * Delegate model used to switch between tree model and tree table model api - * - * @author sletellier <letellier@codelutin.com> - * @since 2.1 - */ -public class JaxxTreeBridge<N extends JaxxTreeNode<N>> implements JaxxNavBridge<DefaultTreeModel, N> { - - /** Logger */ - static private final Log log = LogFactory.getLog(JaxxTreeBridge.class); - - /** bridge model */ - protected DefaultTreeModel model; - - /** bridge ui */ - protected JTree ui; - - public JaxxTreeBridge() { - } - - //-------------------------------------------------------------------------- - //-- Model Queries - //-------------------------------------------------------------------------- - - @Override - public DefaultTreeModel getModel() { - return model; - } - - @Override - @SuppressWarnings({"unchecked"}) - public N getRoot() { - return (N) model.getRoot(); - } - - @Override - public boolean isLeaf(Object node) { - return model.isLeaf(node); - } - - @Override - public int getChildCount(Object parent) { - return model.getChildCount(parent); - } - - @Override - @SuppressWarnings({"unchecked"}) - public N getChild(Object parent, int index) { - return (N) model.getChild(parent, index); - } - - @Override - public int getIndexOfChild(Object parent, Object child) { - return model.getIndexOfChild(parent, child); - } - - @Override - public TreeNode[] getPathToRoot(TreeNode aNode) { - return model.getPathToRoot(aNode); - } - - //-------------------------------------------------------------------------- - //-- Model modification - //-------------------------------------------------------------------------- - - @Override - public void setModel(DefaultTreeModel model) { - this.model = model; - } - - @Override - public void setRoot(N node) { - model.setRoot(node); - } - - @Override - public void insertNodeInto(N newChild, N parent, int index) { - model.insertNodeInto(newChild, parent, index); - } - - @Override - public void removeNodeFromParent(N node) { - model.removeNodeFromParent(node); - } - - @Override - public void reload(N node) { - model.reload(); - } - - //-------------------------------------------------------------------------- - //-- Listeners notifications - //-------------------------------------------------------------------------- - - @Override - public void valueForPathChanged(TreePath path, Object newValue) { - model.valueForPathChanged(path, newValue); - } - - @Override - public void nodesWereInserted(N parent, int[] indices) { - model.nodesWereInserted(parent, indices); - } - - @Override - public void nodeWereInserted(N parentNode, int childIndice, N node) { - int[] indices = new int[1]; - indices[0] = childIndice; - model.nodesWereInserted(parentNode, indices); - } - - @Override - public void nodeChanged(TreeNode node) { - model.nodeChanged(node); - } - - @Override - public void nodeStructureChanged(TreeNode node) { - model.nodeStructureChanged(node); - } - - @Override - public void nodesWereRemoved(TreeNode node, int[] childIndices, - Object[] removedChildren) { - model.nodesWereRemoved(node, childIndices, removedChildren); - } - - @Override - public void nodesChanged(TreeNode node, int[] childIndices) { - model.nodesChanged(node, childIndices); - } - - @Override - @SuppressWarnings({"unchecked"}) - public void notifyChildNodesInserted(N node) { - int count = node.getChildCount(); - if (count < 1) { - if (log.isDebugEnabled()) { - log.debug("Skip for leaf node : " + node); - } - return; - } - if (log.isDebugEnabled()) { - log.debug("Notify for node : " + node + ", " + count + " child(s) inserted."); - } - int[] indices = new int[count]; - for (int i = 0; i < count; i++) { - indices[i] = i; - } - - nodesWereInserted(node, indices); - - // recurse notify on childs - for (Enumeration<? extends JaxxTreeNode<?>> childs = node.children(); - childs.hasMoreElements();) { - N child = (N) childs.nextElement(); - notifyChildNodesInserted(child); - } - } - - @Override - public void notifyNodeInserted(N node) { - - N parent = node.getParent(); - if (parent != null) { - int indice = parent.getIndex(node); - if (log.isDebugEnabled()) { - log.debug("Notify for node : " + node + ", for parent [" + parent + "] child " + indice + " inserted."); - } - nodesWereInserted(parent, new int[]{indice}); - notifyChildNodesInserted(node); - } - } - - //-------------------------------------------------------------------------- - //-- TreeModelListener provider - //-------------------------------------------------------------------------- - - @Override - public void addTreeModelListener(TreeModelListener l) { - model.addTreeModelListener(l); - } - - @Override - public void removeTreeModelListener(TreeModelListener l) { - model.removeTreeModelListener(l); - } - - @Override - public TreeModelListener[] getTreeModelListeners() { - return model.getTreeModelListeners(); - } - - @Override - @SuppressWarnings({"unchecked"}) - public <T extends EventListener> T[] getListeners(Class<T> listenerType) { - return model.getListeners(listenerType); - } - - //-------------------------------------------------------------------------- - //-- UI - //-------------------------------------------------------------------------- - -// @Override -// public JTree getUI() { -// return ui; -// } -// -// @Override -// public void setUI(JTree ui) { -// this.ui = ui; -// } -// -// @Override -// public void scrollPathToVisible(TreePath path) { -// getUI().scrollPathToVisible(path); -// } -// -// @Override -// public void setSelectionPath(TreePath path) { -// getUI().setSelectionPath(path); -// } -// -// @Override -// public TreeSelectionModel getSelectionModel() { -// return getUI().getSelectionModel(); -// } -// -// @Override -// public boolean isExpanded(TreePath pathToExpand) { -// return getUI().isExpanded(pathToExpand); -// } -// -// @Override -// public void expandPath(TreePath pathToExpand) { -// getUI().expandPath(pathToExpand); -// } -// -// @SuppressWarnings({"unchecked"}) -// @Override -// public AbstractJaxxTreeCellRenderer<DefaultTreeModel, N> getTreeCellRenderer() { -// JTree t = getUI(); -// if (t == null) { -// return null; -// } -// TreeCellRenderer r = t.getCellRenderer(); -// if (r instanceof AbstractJaxxTreeCellRenderer) { -// return (AbstractJaxxTreeCellRenderer<DefaultTreeModel, N>) r; -// } -// return null; -// } -// -// @SuppressWarnings({"unchecked"}) -// @Override -// public N getSelectedNode() { -// JTree tree = getUI(); -// if (tree == null) { -// return null; -// } -// TreePath path = tree.getSelectionPath(); -// N node = null; -// if (path != null) { -// node = (N) path.getLastPathComponent(); -// } -// return node; -// } - -} \ No newline at end of file Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeHelper.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeHelper.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeHelper.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,133 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav.tree; - -import jaxx.runtime.swing.nav.JaxxNavHelper; - -import javax.swing.JTree; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreeCellRenderer; -import javax.swing.tree.TreePath; -import javax.swing.tree.TreeSelectionModel; - -/** - * The implementation of {@link JaxxNavHelper} base on a {@link JTree} component. - * - * @author tchemit <chemit@codelutin.com> - * @since 2.1 - */ -public class JaxxTreeHelper<N extends JaxxTreeNode<N>> extends JaxxNavHelper<DefaultTreeModel, JTree, JaxxTreeBridge<N>, N> { - - public JaxxTreeHelper() { - super(new JaxxTreeBridge<N>()); - } - - @Override - public void scrollPathToVisible(TreePath path) { - getUI().scrollPathToVisible(path); - } - - @Override - public void setSelectionPath(TreePath path) { - getUI().setSelectionPath(path); - } - - @Override - public TreeSelectionModel getSelectionModel() { - return getUI().getSelectionModel(); - } - - @Override - public boolean isExpanded(TreePath pathToExpand) { - return getUI().isExpanded(pathToExpand); - } - - @Override - public void expandPath(TreePath pathToExpand) { - getUI().expandPath(pathToExpand); - } - - @SuppressWarnings({"unchecked"}) - @Override - public AbstractJaxxTreeCellRenderer<DefaultTreeModel, N> getTreeCellRenderer() { - JTree t = getUI(); - if (t == null) { - return null; - } - TreeCellRenderer r = t.getCellRenderer(); - if (r instanceof AbstractJaxxTreeCellRenderer) { - return (AbstractJaxxTreeCellRenderer<DefaultTreeModel, N>) r; - } - return null; - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getSelectedNode() { - JTree tree = getUI(); - if (tree == null) { - return null; - } - TreePath path = tree.getSelectionPath(); - N node = null; - if (path != null) { - node = (N) path.getLastPathComponent(); - } - return node; - } - - @SuppressWarnings({"unchecked"}) - @Override - public void setUI(JTree tree, - boolean addExpandTreeListener, - TreeSelectionListener listener) { - setUI(tree); - if (addExpandTreeListener) { - tree.addTreeWillExpandListener(expandListener); - } - if (listener != null) { - tree.getSelectionModel().addTreeSelectionListener(listener); - } - tree.getSelectionModel().addTreeSelectionListener(selectionListener); - } - - @Override - protected DefaultTreeModel createModel(N node, Object... extraArgs) { - JaxxTreeBridge<N> bridge = getBridge(); - DefaultTreeModel model = bridge.getModel(); - if (model == null) { - model = new DefaultTreeModel(node); - bridge.setModel(model); - bridge.addTreeModelListener(treeModelListener); - } else { - bridge.setRoot(node); - } - - // notify structure has changed - bridge.nodeStructureChanged(getRootNode()); - return model; - } -} Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeNode.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeNode.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeNode.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,380 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav.tree; - -import jaxx.runtime.swing.nav.DataProvider; -import jaxx.runtime.swing.nav.JaxxNavBridge; -import jaxx.runtime.swing.nav.JaxxNode; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreeNode; -import java.util.Enumeration; - -/** - * Implementation of {@link JaxxNode} used to create in tree table - * This node extends {@link DefaultMutableTreeNode} - * - * @author tchemit <chemit@codelutin.com> - * @since 2.2 - */ -public class JaxxTreeNode<N extends JaxxTreeNode<N>> extends DefaultMutableTreeNode implements JaxxNode<DefaultTreeModel, N> { - - /** Logger */ - static private final Log log = LogFactory.getLog(JaxxNode.class); - - private static final long serialVersionUID = 1L; - - /** Type of data associated with the node */ - protected final Class<?> internalClass; - - /** - * Optinal context to distinguish different nodes with same - * {@link #internalClass}. - */ - protected final String context; - - /** Id of the data associated with the node. */ - protected final String id; - - /** Flag to know when renderer should (re-)compute render of the node. */ - protected boolean dirty = true; - - /** Flag to know when the none static node was loaded. */ - protected boolean loaded; - - /** Optional child loador to lazy create childs of the node. */ - protected final JaxxTreeNodeChildLoador<?, ?, N> childLoador; - - protected JaxxTreeNode(String id) { - this(String.class, id, null, null); - } - - public JaxxTreeNode(Class<?> internalClass, - String id, - String context, - JaxxTreeNodeChildLoador<?, ?, N> childLoador) { - this.internalClass = internalClass; - this.id = id; - this.context = context; - this.childLoador = childLoador; - if (isStaticNode()) { - - // A static node is always full loaded - loaded = true; - } - if (log.isDebugEnabled()) { - log.debug("new node : " + this); - } - } - - @Override - public String getId() { - return id; - } - - @Override - public String getContext() { - return context; - } - - @Override - public Class<?> getInternalClass() { - return internalClass; - } - - @Override - public boolean isLoaded() { - return loaded; - } - - @Override - public boolean isDirty() { - return dirty; - } - - @Override - public boolean isStringNode() { - return String.class.equals(internalClass); - } - - @Override - public boolean isStaticNode() { - return childLoador == null; - } - - @Override - @SuppressWarnings({"unchecked"}) - public N getContainerNode() { - if (isRoot()) { - // si on arrive sur le root, quelque chose ne va pas, - // on bloque par null, a defaut de declancher une exception - return null; - } - - if (isStringNode()) { - // on est sur un noeud de type String, donc on regarde sur le parent - return getParent().getContainerNode(); - } - - // cas final : sur un noeud de donnee + classe interne de donnee - return (N) this; - } - - @Override - @SuppressWarnings({"unchecked"}) - public N findNodeById(String id, - JaxxNavBridge<DefaultTreeModel, N> model, - DataProvider provider) { - if (id == null) { - - // id null ? donc rien a faire - return null; - } - if (id.equals(getId())) { - - // on a trouve le bon noeud - return (N) this; - } - - if (!isLoaded()) { - - // il faut charger les fils du noeud pour effectuer la recherche - populateChilds(model, provider); - } - - if (isLeaf()) { - - // au final le noeud est une feuille, donc ne convient pas - return null; - } - - // on recherche dans les fils - Enumeration<N> enumeration = children(); - while (enumeration.hasMoreElements()) { - N node = enumeration.nextElement(); - N nodeById = node.findNodeById(id, model, provider); - if (nodeById != null) { - return nodeById; - } - } - - // aucun des noeud fils ne convient - return null; - } - - @Override - public void setDirty(boolean dirty) { - this.dirty = dirty; - } - - @Override - public boolean isLeaf() { - // there is two behaviours for the test : - // 1 - when the node is static, then can directly use his number of child - // to determine if node is a leaf (no child) - // 2 - when the node is dynamic, then ALWAYS says the node is NOT a leaf until - // it was loaded, otherwise the WillExpand listener will not load the childs... - // Once the node is loaded, use back the normal behaviour (count number of childs) - return isStaticNode() ? super.isLeaf() : isLoaded() && getChildCount() == 0; - } - - @Override - public Object getUserObject() { - return id; - } - - @Override - public String toString() { - return System.identityHashCode(this) + "-" + id; - } - - //-------------------------------------------------------------------------- - //-- Populate methods - //-------------------------------------------------------------------------- - - @Override - public void populateNode(JaxxNavBridge<DefaultTreeModel, N> model, - DataProvider provider, - boolean populateChilds) { - - // on indique que le noeud n'est plus propre - setDirty(true); - - if (populateChilds) { - - // chargement des fils - populateChilds(model, provider); - } - } - - @Override - @SuppressWarnings({"unchecked"}) - public void populateChilds(JaxxNavBridge<DefaultTreeModel, N> model, DataProvider provider) { - if (isStaticNode()) { - - log.debug("is static node " + this); - - // noeud static, rien a faire - return; - } - - // chargement des noeuds fils du noeud courant - try { - if (log.isDebugEnabled()) { - log.debug("Will load childs for " + this); - } - childLoador.loadChilds((JaxxTreeBridge<N>) model, (N) this, provider); - } catch (Exception e) { - throw new RuntimeException(e.getMessage(), e); - } finally { - - // au final, on passe le noeud a l'état chargé - loaded = true; - } - } - - //-------------------------------------------------------------------------- - //-- Overrides to use generic type as return - //-------------------------------------------------------------------------- - - @SuppressWarnings({"unchecked"}) - @Override - public N getParent() { - return (N) super.getParent(); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getRoot() { - return (N) super.getRoot(); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getFirstChild() { - return (N) super.getFirstChild(); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getLastChild() { - return (N) super.getLastChild(); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getChildAfter(TreeNode aChild) { - return (N) super.getChildAfter(aChild); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getChildBefore(TreeNode aChild) { - return (N) super.getChildBefore(aChild); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getNextSibling() { - return (N) super.getNextSibling(); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getPreviousSibling() { - return (N) super.getPreviousSibling(); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getFirstLeaf() { - return (N) super.getFirstLeaf(); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getLastLeaf() { - return (N) super.getLastLeaf(); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getNextLeaf() { - return (N) super.getNextLeaf(); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getPreviousLeaf() { - return (N) super.getPreviousLeaf(); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getNextNode() { - return (N) super.getNextNode(); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getPreviousNode() { - return (N) super.getPreviousNode(); - } - - @SuppressWarnings({"unchecked"}) - public N getSharedAncestor(N aNode) { - return (N) getSharedAncestor((DefaultMutableTreeNode) aNode); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getChildAt(int index) { - return (N) super.getChildAt(index); - } - - @SuppressWarnings({"unchecked"}) - @Override - public Enumeration<N> children() { - return (Enumeration<N>) super.children(); - } - - @Override - public void add(N node) { - super.add(node); - } - - @Override - public void remove(N node) { - super.remove(node); - } - - @Override - public void insert(N node, int position) { - super.insert(node, position); - } -} Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeNodeChildLoador.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeNodeChildLoador.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeNodeChildLoador.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,42 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav.tree; - -import jaxx.runtime.swing.nav.JaxxNodeChildLoador; - -import javax.swing.tree.DefaultTreeModel; - -/** - * Implementation for tree of {@link JaxxNodeChildLoador} - * - * @author sletellier <letellier@codelutin.com> - * @since 2.2 - */ -public abstract class JaxxTreeNodeChildLoador<T, O, N extends JaxxTreeNode<N>> extends JaxxNodeChildLoador<T, O, DefaultTreeModel, JaxxTreeBridge<N>, N> { - - protected JaxxTreeNodeChildLoador(Class<O> beanType) { - super(beanType); - } -} Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeBridge.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeBridge.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeBridge.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeBridge.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,306 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav.tree; + +import jaxx.runtime.swing.nav.NavBridge; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.swing.JTree; +import javax.swing.event.TreeModelListener; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; +import java.util.Enumeration; +import java.util.EventListener; + +/** + * Delegate model used to switch between tree model and tree table model api + * + * @author sletellier <letellier@codelutin.com> + * @since 2.1 + */ +public class NavTreeBridge<N extends NavTreeNode<N>> implements NavBridge<DefaultTreeModel, N> { + + /** Logger */ + static private final Log log = LogFactory.getLog(NavTreeBridge.class); + + /** bridge model */ + protected DefaultTreeModel model; + + /** bridge ui */ + protected JTree ui; + + public NavTreeBridge() { + } + + //-------------------------------------------------------------------------- + //-- Model Queries + //-------------------------------------------------------------------------- + + @Override + public DefaultTreeModel getModel() { + return model; + } + + @Override + @SuppressWarnings({"unchecked"}) + public N getRoot() { + return (N) model.getRoot(); + } + + @Override + public boolean isLeaf(Object node) { + return model.isLeaf(node); + } + + @Override + public int getChildCount(Object parent) { + return model.getChildCount(parent); + } + + @Override + @SuppressWarnings({"unchecked"}) + public N getChild(Object parent, int index) { + return (N) model.getChild(parent, index); + } + + @Override + public int getIndexOfChild(Object parent, Object child) { + return model.getIndexOfChild(parent, child); + } + + @Override + public TreeNode[] getPathToRoot(TreeNode aNode) { + return model.getPathToRoot(aNode); + } + + //-------------------------------------------------------------------------- + //-- Model modification + //-------------------------------------------------------------------------- + + @Override + public void setModel(DefaultTreeModel model) { + this.model = model; + } + + @Override + public void setRoot(N node) { + model.setRoot(node); + } + + @Override + public void insertNodeInto(N newChild, N parent, int index) { + model.insertNodeInto(newChild, parent, index); + } + + @Override + public void removeNodeFromParent(N node) { + model.removeNodeFromParent(node); + } + + @Override + public void reload(N node) { + model.reload(); + } + + //-------------------------------------------------------------------------- + //-- Listeners notifications + //-------------------------------------------------------------------------- + + @Override + public void valueForPathChanged(TreePath path, Object newValue) { + model.valueForPathChanged(path, newValue); + } + + @Override + public void nodesWereInserted(N parent, int[] indices) { + model.nodesWereInserted(parent, indices); + } + + @Override + public void nodeWereInserted(N parentNode, int childIndice, N node) { + int[] indices = new int[1]; + indices[0] = childIndice; + model.nodesWereInserted(parentNode, indices); + } + + @Override + public void nodeChanged(TreeNode node) { + model.nodeChanged(node); + } + + @Override + public void nodeStructureChanged(TreeNode node) { + model.nodeStructureChanged(node); + } + + @Override + public void nodesWereRemoved(TreeNode node, int[] childIndices, + Object[] removedChildren) { + model.nodesWereRemoved(node, childIndices, removedChildren); + } + + @Override + public void nodesChanged(TreeNode node, int[] childIndices) { + model.nodesChanged(node, childIndices); + } + + @Override + @SuppressWarnings({"unchecked"}) + public void notifyChildNodesInserted(N node) { + int count = node.getChildCount(); + if (count < 1) { + if (log.isDebugEnabled()) { + log.debug("Skip for leaf node : " + node); + } + return; + } + if (log.isDebugEnabled()) { + log.debug("Notify for node : " + node + ", " + count + " child(s) inserted."); + } + int[] indices = new int[count]; + for (int i = 0; i < count; i++) { + indices[i] = i; + } + + nodesWereInserted(node, indices); + + // recurse notify on childs + for (Enumeration<? extends NavTreeNode<?>> childs = node.children(); + childs.hasMoreElements();) { + N child = (N) childs.nextElement(); + notifyChildNodesInserted(child); + } + } + + @Override + public void notifyNodeInserted(N node) { + + N parent = node.getParent(); + if (parent != null) { + int indice = parent.getIndex(node); + if (log.isDebugEnabled()) { + log.debug("Notify for node : " + node + ", for parent [" + parent + "] child " + indice + " inserted."); + } + nodesWereInserted(parent, new int[]{indice}); + notifyChildNodesInserted(node); + } + } + + //-------------------------------------------------------------------------- + //-- TreeModelListener provider + //-------------------------------------------------------------------------- + + @Override + public void addTreeModelListener(TreeModelListener l) { + model.addTreeModelListener(l); + } + + @Override + public void removeTreeModelListener(TreeModelListener l) { + model.removeTreeModelListener(l); + } + + @Override + public TreeModelListener[] getTreeModelListeners() { + return model.getTreeModelListeners(); + } + + @Override + @SuppressWarnings({"unchecked"}) + public <T extends EventListener> T[] getListeners(Class<T> listenerType) { + return model.getListeners(listenerType); + } + + //-------------------------------------------------------------------------- + //-- UI + //-------------------------------------------------------------------------- + +// @Override +// public JTree getUI() { +// return ui; +// } +// +// @Override +// public void setUI(JTree ui) { +// this.ui = ui; +// } +// +// @Override +// public void scrollPathToVisible(TreePath path) { +// getUI().scrollPathToVisible(path); +// } +// +// @Override +// public void setSelectionPath(TreePath path) { +// getUI().setSelectionPath(path); +// } +// +// @Override +// public TreeSelectionModel getSelectionModel() { +// return getUI().getSelectionModel(); +// } +// +// @Override +// public boolean isExpanded(TreePath pathToExpand) { +// return getUI().isExpanded(pathToExpand); +// } +// +// @Override +// public void expandPath(TreePath pathToExpand) { +// getUI().expandPath(pathToExpand); +// } +// +// @SuppressWarnings({"unchecked"}) +// @Override +// public AbstractNavTreeCellRenderer<DefaultTreeModel, N> getTreeCellRenderer() { +// JTree t = getUI(); +// if (t == null) { +// return null; +// } +// TreeCellRenderer r = t.getCellRenderer(); +// if (r instanceof AbstractNavTreeCellRenderer) { +// return (AbstractNavTreeCellRenderer<DefaultTreeModel, N>) r; +// } +// return null; +// } +// +// @SuppressWarnings({"unchecked"}) +// @Override +// public N getSelectedNode() { +// JTree tree = getUI(); +// if (tree == null) { +// return null; +// } +// TreePath path = tree.getSelectionPath(); +// N node = null; +// if (path != null) { +// node = (N) path.getLastPathComponent(); +// } +// return node; +// } + +} \ No newline at end of file Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeBridge.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeHelper.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeHelper.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeHelper.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeHelper.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,133 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav.tree; + +import jaxx.runtime.swing.nav.NavHelper; + +import javax.swing.JTree; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeCellRenderer; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; + +/** + * The implementation of {@link NavHelper} base on a {@link JTree} component. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.1 + */ +public class NavTreeHelper<N extends NavTreeNode<N>> extends NavHelper<DefaultTreeModel, JTree, NavTreeBridge<N>, N> { + + public NavTreeHelper() { + super(new NavTreeBridge<N>()); + } + + @Override + public void scrollPathToVisible(TreePath path) { + getUI().scrollPathToVisible(path); + } + + @Override + public void setSelectionPath(TreePath path) { + getUI().setSelectionPath(path); + } + + @Override + public TreeSelectionModel getSelectionModel() { + return getUI().getSelectionModel(); + } + + @Override + public boolean isExpanded(TreePath pathToExpand) { + return getUI().isExpanded(pathToExpand); + } + + @Override + public void expandPath(TreePath pathToExpand) { + getUI().expandPath(pathToExpand); + } + + @SuppressWarnings({"unchecked"}) + @Override + public AbstractNavTreeCellRenderer<DefaultTreeModel, N> getTreeCellRenderer() { + JTree t = getUI(); + if (t == null) { + return null; + } + TreeCellRenderer r = t.getCellRenderer(); + if (r instanceof AbstractNavTreeCellRenderer) { + return (AbstractNavTreeCellRenderer<DefaultTreeModel, N>) r; + } + return null; + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getSelectedNode() { + JTree tree = getUI(); + if (tree == null) { + return null; + } + TreePath path = tree.getSelectionPath(); + N node = null; + if (path != null) { + node = (N) path.getLastPathComponent(); + } + return node; + } + + @SuppressWarnings({"unchecked"}) + @Override + public void setUI(JTree tree, + boolean addExpandTreeListener, + TreeSelectionListener listener) { + setUI(tree); + if (addExpandTreeListener) { + tree.addTreeWillExpandListener(expandListener); + } + if (listener != null) { + tree.getSelectionModel().addTreeSelectionListener(listener); + } + tree.getSelectionModel().addTreeSelectionListener(selectionListener); + } + + @Override + protected DefaultTreeModel createModel(N node, Object... extraArgs) { + NavTreeBridge<N> bridge = getBridge(); + DefaultTreeModel model = bridge.getModel(); + if (model == null) { + model = new DefaultTreeModel(node); + bridge.setModel(model); + bridge.addTreeModelListener(treeModelListener); + } else { + bridge.setRoot(node); + } + + // notify structure has changed + bridge.nodeStructureChanged(getRootNode()); + return model; + } +} Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeHelper.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeNode.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeNode.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeNode.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeNode.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,380 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav.tree; + +import jaxx.runtime.swing.nav.NavDataProvider; +import jaxx.runtime.swing.nav.NavBridge; +import jaxx.runtime.swing.nav.NavNode; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeNode; +import java.util.Enumeration; + +/** + * Implementation of {@link NavNode} used to create in tree table + * This node extends {@link DefaultMutableTreeNode} + * + * @author tchemit <chemit@codelutin.com> + * @since 2.2 + */ +public class NavTreeNode<N extends NavTreeNode<N>> extends DefaultMutableTreeNode implements NavNode<DefaultTreeModel, N> { + + /** Logger */ + static private final Log log = LogFactory.getLog(NavNode.class); + + private static final long serialVersionUID = 1L; + + /** Type of data associated with the node */ + protected final Class<?> internalClass; + + /** + * Optinal context to distinguish different nodes with same + * {@link #internalClass}. + */ + protected final String context; + + /** Id of the data associated with the node. */ + protected final String id; + + /** Flag to know when renderer should (re-)compute render of the node. */ + protected boolean dirty = true; + + /** Flag to know when the none static node was loaded. */ + protected boolean loaded; + + /** Optional child loador to lazy create childs of the node. */ + protected final NavTreeNodeChildLoador<?, ?, N> childLoador; + + protected NavTreeNode(String id) { + this(String.class, id, null, null); + } + + public NavTreeNode(Class<?> internalClass, + String id, + String context, + NavTreeNodeChildLoador<?, ?, N> childLoador) { + this.internalClass = internalClass; + this.id = id; + this.context = context; + this.childLoador = childLoador; + if (isStaticNode()) { + + // A static node is always full loaded + loaded = true; + } + if (log.isDebugEnabled()) { + log.debug("new node : " + this); + } + } + + @Override + public String getId() { + return id; + } + + @Override + public String getContext() { + return context; + } + + @Override + public Class<?> getInternalClass() { + return internalClass; + } + + @Override + public boolean isLoaded() { + return loaded; + } + + @Override + public boolean isDirty() { + return dirty; + } + + @Override + public boolean isStringNode() { + return String.class.equals(internalClass); + } + + @Override + public boolean isStaticNode() { + return childLoador == null; + } + + @Override + @SuppressWarnings({"unchecked"}) + public N getContainerNode() { + if (isRoot()) { + // si on arrive sur le root, quelque chose ne va pas, + // on bloque par null, a defaut de declancher une exception + return null; + } + + if (isStringNode()) { + // on est sur un noeud de type String, donc on regarde sur le parent + return getParent().getContainerNode(); + } + + // cas final : sur un noeud de donnee + classe interne de donnee + return (N) this; + } + + @Override + @SuppressWarnings({"unchecked"}) + public N findNodeById(String id, + NavBridge<DefaultTreeModel, N> model, + NavDataProvider provider) { + if (id == null) { + + // id null ? donc rien a faire + return null; + } + if (id.equals(getId())) { + + // on a trouve le bon noeud + return (N) this; + } + + if (!isLoaded()) { + + // il faut charger les fils du noeud pour effectuer la recherche + populateChilds(model, provider); + } + + if (isLeaf()) { + + // au final le noeud est une feuille, donc ne convient pas + return null; + } + + // on recherche dans les fils + Enumeration<N> enumeration = children(); + while (enumeration.hasMoreElements()) { + N node = enumeration.nextElement(); + N nodeById = node.findNodeById(id, model, provider); + if (nodeById != null) { + return nodeById; + } + } + + // aucun des noeud fils ne convient + return null; + } + + @Override + public void setDirty(boolean dirty) { + this.dirty = dirty; + } + + @Override + public boolean isLeaf() { + // there is two behaviours for the test : + // 1 - when the node is static, then can directly use his number of child + // to determine if node is a leaf (no child) + // 2 - when the node is dynamic, then ALWAYS says the node is NOT a leaf until + // it was loaded, otherwise the WillExpand listener will not load the childs... + // Once the node is loaded, use back the normal behaviour (count number of childs) + return isStaticNode() ? super.isLeaf() : isLoaded() && getChildCount() == 0; + } + + @Override + public Object getUserObject() { + return id; + } + + @Override + public String toString() { + return System.identityHashCode(this) + "-" + id; + } + + //-------------------------------------------------------------------------- + //-- Populate methods + //-------------------------------------------------------------------------- + + @Override + public void populateNode(NavBridge<DefaultTreeModel, N> model, + NavDataProvider provider, + boolean populateChilds) { + + // on indique que le noeud n'est plus propre + setDirty(true); + + if (populateChilds) { + + // chargement des fils + populateChilds(model, provider); + } + } + + @Override + @SuppressWarnings({"unchecked"}) + public void populateChilds(NavBridge<DefaultTreeModel, N> model, NavDataProvider provider) { + if (isStaticNode()) { + + log.debug("is static node " + this); + + // noeud static, rien a faire + return; + } + + // chargement des noeuds fils du noeud courant + try { + if (log.isDebugEnabled()) { + log.debug("Will load childs for " + this); + } + childLoador.loadChilds((NavTreeBridge<N>) model, (N) this, provider); + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); + } finally { + + // au final, on passe le noeud a l'état chargé + loaded = true; + } + } + + //-------------------------------------------------------------------------- + //-- Overrides to use generic type as return + //-------------------------------------------------------------------------- + + @SuppressWarnings({"unchecked"}) + @Override + public N getParent() { + return (N) super.getParent(); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getRoot() { + return (N) super.getRoot(); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getFirstChild() { + return (N) super.getFirstChild(); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getLastChild() { + return (N) super.getLastChild(); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getChildAfter(TreeNode aChild) { + return (N) super.getChildAfter(aChild); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getChildBefore(TreeNode aChild) { + return (N) super.getChildBefore(aChild); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getNextSibling() { + return (N) super.getNextSibling(); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getPreviousSibling() { + return (N) super.getPreviousSibling(); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getFirstLeaf() { + return (N) super.getFirstLeaf(); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getLastLeaf() { + return (N) super.getLastLeaf(); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getNextLeaf() { + return (N) super.getNextLeaf(); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getPreviousLeaf() { + return (N) super.getPreviousLeaf(); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getNextNode() { + return (N) super.getNextNode(); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getPreviousNode() { + return (N) super.getPreviousNode(); + } + + @SuppressWarnings({"unchecked"}) + public N getSharedAncestor(N aNode) { + return (N) getSharedAncestor((DefaultMutableTreeNode) aNode); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getChildAt(int index) { + return (N) super.getChildAt(index); + } + + @SuppressWarnings({"unchecked"}) + @Override + public Enumeration<N> children() { + return (Enumeration<N>) super.children(); + } + + @Override + public void add(N node) { + super.add(node); + } + + @Override + public void remove(N node) { + super.remove(node); + } + + @Override + public void insert(N node, int position) { + super.insert(node, position); + } +} Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeNode.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeNodeChildLoador.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/JaxxTreeNodeChildLoador.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeNodeChildLoador.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeNodeChildLoador.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,42 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav.tree; + +import jaxx.runtime.swing.nav.NavNodeChildLoador; + +import javax.swing.tree.DefaultTreeModel; + +/** + * Implementation for tree of {@link NavNodeChildLoador} + * + * @author sletellier <letellier@codelutin.com> + * @since 2.2 + */ +public abstract class NavTreeNodeChildLoador<T, O, N extends NavTreeNode<N>> extends NavNodeChildLoador<T, O, DefaultTreeModel, NavTreeBridge<N>, N> { + + protected NavTreeNodeChildLoador(Class<O> beanType) { + super(beanType); + } +} Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/NavTreeNodeChildLoador.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Added: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/package.html =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/package.html (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/package.html 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,20 @@ +package.html<html> +<body> +<h1>JAXX - nav tree implementation</h1> + +This package contains the implementation of nav api for the <b>JTree</b> + +<h2>NavTreeNode</h2> +An override of DefaultMutableTreeNode implement JaxxNode. + +<h2>NavTreeChildLoador</h2> +Object to load childs of a tree node using DataProvider. + +<h2>NavTreeHelper</h2> +Helper to manage a tree using auto-loading nodes. + +<h2>AbstractNavTreeCellRenderer</h2> +Abstract renderer using DataProvider to acquire node render. + +</body> +</html> Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/tree/package.html ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableBridge.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableBridge.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableBridge.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,289 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav.treetable; - -import jaxx.runtime.swing.nav.JaxxNavBridge; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.jdesktop.swingx.JXTreeTable; -import org.jdesktop.swingx.treetable.TreeTableNode; - -import javax.swing.event.TreeModelListener; -import javax.swing.tree.TreeNode; -import javax.swing.tree.TreePath; -import java.util.ArrayList; -import java.util.EventListener; -import java.util.List; - -/** - * Delegate model used to switch between tree model and tree table model api - * - * @author sletellier <letellier@codelutin.com> - * @since 2.1 - */ -public class JaxxTreeTableBridge<N extends JaxxTreeTableNode<N>> implements JaxxNavBridge<JaxxTreeTableModel, N> { - - /** Logger */ - static private final Log log = LogFactory.getLog(JaxxTreeTableBridge.class); - - /** bridge model */ - protected JaxxTreeTableModel model; - - /** bridge ui */ - protected JXTreeTable ui; - - public JaxxTreeTableBridge() { - if (log.isDebugEnabled()) { - log.debug("New " + this); - } - } - - //-------------------------------------------------------------------------- - //-- Model Queries - //-------------------------------------------------------------------------- - - @Override - public JaxxTreeTableModel getModel() { - return model; - } - - @Override - @SuppressWarnings({"unchecked"}) - public N getRoot() { - return (N) model.getRoot(); - } - - @Override - public boolean isLeaf(Object node) { - return model.isLeaf(node); - } - - @Override - public int getChildCount(Object parent) { - return model.getChildCount(parent); - } - - @Override - @SuppressWarnings({"unchecked"}) - public N getChild(Object parent, int index) { - return (N) model.getChild(parent, index); - } - - @Override - public int getIndexOfChild(Object parent, Object child) { - return model.getIndexOfChild(parent, child); - } - - @Override - public TreeNode[] getPathToRoot(TreeNode aNode) { - return model.getPathToRoot((TreeTableNode) aNode); - } - - //-------------------------------------------------------------------------- - //-- Model modification - //-------------------------------------------------------------------------- - - - @Override - public void setModel(JaxxTreeTableModel model) { - this.model = model; - } - - @Override - public void setRoot(N node) { - model.setRoot(node); - } - - @Override - public void insertNodeInto(N newChild, N parent, int index) { - //FIXME c'est ca le code ? y'a rien d'ajoute au model c'est pas normal - model.nodeStructureChanged(parent); - } - - @Override - public void removeNodeFromParent(N node) { - //FIXME c'est ca le code ? y'a rien de supprimer au model c'est pas normal - model.nodeStructureChanged(node); - } - - @Override - public void reload(N node) { - model.getModelSupport().fireTreeStructureChanged(new TreePath(getPathToRoot(node))); - } - - //-------------------------------------------------------------------------- - //-- Listeners notifications - //-------------------------------------------------------------------------- - - @Override - public void valueForPathChanged(TreePath path, Object newValue) { - model.valueForPathChanged(path, newValue); - } - - @Override - public void nodeStructureChanged(TreeNode node) { - model.nodeStructureChanged((JaxxTreeTableNode<?>) node); - } - - @Override - public void nodeChanged(TreeNode node) { - model.nodeChanged((JaxxTreeTableNode<?>) node); - } - - @Override - public void nodesChanged(TreeNode node, int[] childIndices) { - //FIXME c'est plus fin que ça je pense, on indique juste que les fils ont - // changé par le node en lui meme - model.nodeChanged((JaxxTreeTableNode<?>) node); - } - - @Override - public void nodesWereInserted(N parent, int[] indices) { - //FIXME, hum c'est louche (on ne veut pas recharger tout le noeud sinon - // on peut perdre le positionnement de l'arbre - nodeStructureChanged(parent); - } - - @Override - public void nodeWereInserted(N parentNode, int childIndice, N node) { - //FIXME, hum c'est louche (on ne veut pas recharger tout le noeud sinon - // on peut perdre le positionnement de l'arbre - nodeStructureChanged(node); - } - - @Override - public void nodesWereRemoved(TreeNode node, int[] childIndices, - Object[] removedChildren) { - TreePath path = new TreePath(getPathToRoot(node)); - model.getModelSupport().fireChildrenRemoved(path, - childIndices, - removedChildren); - } - - @Override - @SuppressWarnings({"unchecked"}) - public void notifyChildNodesInserted(N node) { - //FIXME quel raccourci :) pour moi ça va pas trop de faire ça c'est - // trop violent, il faut affiner - nodeStructureChanged(node); - } - - @Override - public void notifyNodeInserted(N node) { - //FIXME quel raccourci :) pour moi ça va pas trop de faire ça c'est - // trop violent, il faut affiner - nodeStructureChanged(node); - } - - //-------------------------------------------------------------------------- - //-- TreeModelListener provider - //-------------------------------------------------------------------------- - - - @Override - public void addTreeModelListener(TreeModelListener l) { - model.addTreeModelListener(l); - } - - @Override - public void removeTreeModelListener(TreeModelListener l) { - model.removeTreeModelListener(l); - } - - @Override - public TreeModelListener[] getTreeModelListeners() { - return model.getModelSupport().getTreeModelListeners(); - } - - @Override - @SuppressWarnings({"unchecked"}) - public <T extends EventListener> T[] getListeners(Class<T> listenerType) { - TreeModelListener[] treeModelListeners = getTreeModelListeners(); - List<TreeModelListener> result = new ArrayList<TreeModelListener>(); - for (TreeModelListener listener : treeModelListeners) { - if (listener.getClass().isAssignableFrom(listenerType)) { - result.add(listener); - } - } - return (T[]) result.toArray(); - } - -// //-------------------------------------------------------------------------- -// //-- UI -// //-------------------------------------------------------------------------- -// -// @Override -// public JXTreeTable getUI() { -// return ui; -// } -// -// @Override -// public void setUI(JXTreeTable ui) { -// this.ui = ui; -// } -// -// @Override -// public void scrollPathToVisible(TreePath path) { -// getUI().scrollPathToVisible(path); -// } -// -// @Override -// public void setSelectionPath(TreePath path) { -// getUI().getTreeSelectionModel().setSelectionPath(path); -// } -// -// @Override -// public TreeSelectionModel getSelectionModel() { -// return getUI().getTreeSelectionModel(); -// } -// -// @Override -// public boolean isExpanded(TreePath pathToExpand) { -// return getUI().isExpanded(pathToExpand); -// } -// -// @Override -// public void expandPath(TreePath pathToExpand) { -// getUI().expandPath(pathToExpand); -// } -// -// @Override -// public AbstractJaxxTreeCellRenderer<JaxxTreeTableModel, N> getTreeCellRenderer() { -// //FIXME Implements it if possible -// return null; -// } -// -// @SuppressWarnings({"unchecked"}) -// @Override -// public N getSelectedNode() { -// TreePath path = getSelectionModel().getSelectionPath(); -// N node = null; -// if (path != null) { -// node = (N) path.getLastPathComponent(); -// } -// return node; -// } - -} \ No newline at end of file Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableHelper.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableHelper.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableHelper.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,140 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav.treetable; - -import jaxx.runtime.swing.nav.JaxxNavHelper; -import jaxx.runtime.swing.nav.tree.AbstractJaxxTreeCellRenderer; -import org.jdesktop.swingx.JXTreeTable; - -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.TreePath; -import javax.swing.tree.TreeSelectionModel; - -/** - * The implementation of {@link JaxxNavHelper} based on a {@link JXTreeTable} component. - * - * @author tchemit <chemit@codelutin.com> - * @since 2.1 - */ -public class JaxxTreeTableHelper<N extends JaxxTreeTableNode<N>> extends JaxxNavHelper<JaxxTreeTableModel, JXTreeTable, JaxxTreeTableBridge<N>, N> { - - public JaxxTreeTableHelper() { - super(new JaxxTreeTableBridge<N>()); - } - - @Override - public void scrollPathToVisible(TreePath path) { - getUI().scrollPathToVisible(path); - } - - @Override - public void setSelectionPath(TreePath path) { - getUI().getTreeSelectionModel().setSelectionPath(path); - } - - @Override - public TreeSelectionModel getSelectionModel() { - return getUI().getTreeSelectionModel(); - } - - @Override - public boolean isExpanded(TreePath pathToExpand) { - return getUI().isExpanded(pathToExpand); - } - - @Override - public void expandPath(TreePath pathToExpand) { - getUI().expandPath(pathToExpand); - } - - @Override - public AbstractJaxxTreeCellRenderer<JaxxTreeTableModel, N> getTreeCellRenderer() { - //FIXME Implements it if possible - return null; - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getSelectedNode() { - TreePath path = getSelectionModel().getSelectionPath(); - N node = null; - if (path != null) { - node = (N) path.getLastPathComponent(); - } - return node; - } - - /** - * Registers the given {@code treeTable} for this helper. - * <p/> - * <b>Note:</b> as a side-effect, it will register (if required) the - * {@link #expandListener} listener and the {@link #selectionListener}. - * - * @param treeTable the tree table to register - * @param addExpandTreeListener a flag to add expand listener - * @param listener the optional selection listener to add - */ - @SuppressWarnings({"unchecked"}) - @Override - public void setUI(JXTreeTable treeTable, - boolean addExpandTreeListener, - TreeSelectionListener listener) { - setUI(treeTable); - if (addExpandTreeListener) { - treeTable.addTreeWillExpandListener(expandListener); - } - if (listener != null) { - treeTable.addTreeSelectionListener(listener); - } - treeTable.addTreeSelectionListener(selectionListener); - } - - @Override - protected JaxxTreeTableModel createModel(N node, Object... extraArgs) { - - // must have a single extra params with delegate model - if (extraArgs.length != 1) { - throw new IllegalArgumentException("Should have exactly one extra parameter (delegate model)"); - } - if (!(extraArgs[0] instanceof JaxxTreeTableModel.MyDefaultTreeTableModel)) { - throw new IllegalArgumentException("extra parameter is not instance of " + JaxxTreeTableModel.MyDefaultTreeTableModel.class.getName()); - } - JaxxTreeTableModel.MyDefaultTreeTableModel delegate = (JaxxTreeTableModel.MyDefaultTreeTableModel) extraArgs[0]; - JaxxTreeTableBridge<N> bridge = getBridge(); - JaxxTreeTableModel model = bridge.getModel(); - if (model == null) { - model = new JaxxTreeTableModel(delegate); - bridge.setModel(model); -// model = new JaxxTreeTableBridge(tableModel); - bridge.addTreeModelListener(treeModelListener); -// ((JaxxTreeTableModel) model).addTreeModelListener(treeModelListener); - } - bridge.setRoot(node); - - // notify structure has changed - bridge.nodeStructureChanged(getRootNode()); - return model; - } -} \ No newline at end of file Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableModel.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableModel.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableModel.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,219 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav.treetable; - -import org.apache.commons.logging.Log; -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 org.jdesktop.swingx.treetable.TreeTableNode; - -import javax.swing.event.TreeModelListener; -import javax.swing.tree.TreeNode; -import javax.swing.tree.TreePath; - -/** - * Model of the tree table used for a jaxx tree table api. - * - * @author sletellier <letellier@codelutin.com> - * @since 2.2 - */ -public class JaxxTreeTableModel implements TreeTableModel { - - /** - * Logger - */ - static private final Log log = LogFactory.getLog(JaxxTreeTableModel.class); - - /** - * Hack to acces to the modelSupport - * - * @author sletellier - * @since 2.2 - */ - public static abstract class MyDefaultTreeTableModel extends DefaultTreeTableModel { - - public TreeModelSupport getModelSupport() { - return modelSupport; - } - - public abstract String[] getColumnsNames(); - - } - - /** - * the delegate model - */ - protected MyDefaultTreeTableModel delegate; - - public JaxxTreeTableModel(MyDefaultTreeTableModel delegate) { - this.delegate = delegate; - } - - @SuppressWarnings({"SuspiciousSystemArraycopy"}) - public TreeTableNode[] getPathToRoot(TreeTableNode aNode) { - if (aNode == null) { - return null; - } - TreeNode[] treeNodes = getDelegate().getPathToRoot(aNode); - JaxxTreeTableNode<?>[] result = new JaxxTreeTableNode[treeNodes.length]; - System.arraycopy(treeNodes, 0, result, 0, treeNodes.length); - return result; - } - - public void nodeStructureChanged(JaxxTreeTableNode<?> node) { - if (node != null) { - JaxxTreeTableNode<?> parentNode = node.getParent(); - if (parentNode == null || parentNode.isRoot()) { - getModelSupport().fireNewRoot(); - } else { - TreeNode[] treeNodes = getPathToRoot(parentNode); - if (treeNodes != null) { - getModelSupport().fireTreeStructureChanged(new TreePath(treeNodes)); - } - // FIXME : it's append.... -// else { -// log.error("[Node structure changed] Path to root is null !"); -// } - } - } else { - log.error("Node is null !"); - } - } - - public void nodeChanged(JaxxTreeTableNode<?> node) { - if (node != null) { - JaxxTreeTableNode<?> parent = node.getParent(); - TreeNode[] treeNodes = getPathToRoot(parent); - if (treeNodes != null) { - getModelSupport().fireChildChanged( - new TreePath(treeNodes), parent.getIndex(node), node); - // FIXME : it's append.... -// else { -// log.error("[Node changed] Path to root is null !"); -// } - } - } else { - log.error("Node is null !"); - } - } - - public MyDefaultTreeTableModel getDelegate() { - return delegate; - } - - public TreeModelSupport getModelSupport() { - return delegate.getModelSupport(); - } - - public String[] getColomnsNames() { - return delegate.getColumnsNames(); - } - - public void setRoot(TreeTableNode root) { - delegate.setRoot(root); - } - - //-------------------------------------------------------------------------- - //-- Overrides delegate methode - //-------------------------------------------------------------------------- - - @Override - public TreeTableNode getRoot() { - return delegate.getRoot(); - } - - @Override - public Object getChild(Object parent, int index) { - return delegate.getChild(parent, index); - } - - @Override - public int getChildCount(Object parent) { - return delegate.getChildCount(parent); - } - - @Override - public boolean isLeaf(Object node) { - return delegate.isLeaf(node); - } - - @Override - public void valueForPathChanged(TreePath path, Object newValue) { - delegate.valueForPathChanged(path, newValue); - } - - @Override - public int getIndexOfChild(Object parent, Object child) { - return delegate.getIndexOfChild(parent, child); - } - - @Override - public void addTreeModelListener(TreeModelListener l) { - delegate.addTreeModelListener(l); - } - - @Override - public void removeTreeModelListener(TreeModelListener l) { - delegate.removeTreeModelListener(l); - } - - @Override - public Class<?> getColumnClass(int i) { - return getDelegate().getColumnClass(i); - } - - @Override - public int getColumnCount() { - return getColomnsNames().length; - } - - @Override - public String getColumnName(int column) { - return getColomnsNames()[column]; - } - - @Override - public int getHierarchicalColumn() { - return getDelegate().getHierarchicalColumn(); - } - - @Override - public Object getValueAt(Object o, int i) { - return getDelegate().getValueAt(o, i); - } - - @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); - } - -} Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableNode.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableNode.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableNode.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,321 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav.treetable; - -import jaxx.runtime.swing.nav.DataProvider; -import jaxx.runtime.swing.nav.JaxxNavBridge; -import jaxx.runtime.swing.nav.JaxxNode; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.jdesktop.swingx.JXTreeTable; -import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode; - -import java.util.Enumeration; - -/** - * Implementation of {@link JaxxNode} used to create in tree table - * This node extends {@link DefaultMutableTreeTableNode} used by - * {@link JXTreeTable} - * - * @author sletellier <letellier@codelutin.com> - * @since 2.2 - */ -public class JaxxTreeTableNode<N extends JaxxTreeTableNode<N>> extends DefaultMutableTreeTableNode implements JaxxNode<JaxxTreeTableModel, N> { - - /** Logger */ - static private final Log log = LogFactory.getLog(JaxxNode.class); - - private static final long serialVersionUID = 1L; - - /** Type of data associated with the node */ - protected final Class<?> internalClass; - - /** - * Optinal context to distinguish different nodes with same - * {@link #internalClass}. - */ - protected final String context; - - /** Id of the data associated with the node. */ - protected final String id; - - /** Flag to know when renderer should (re-)compute render of the node. */ - protected boolean dirty = true; - - /** Flag to know when the none static node was loaded. */ - protected boolean loaded; - - /** Optional child loador to lazy create childs of the node. */ - protected final JaxxTreeTableNodeChildLoador<?, ?, N> childLoador; - - protected JaxxTreeTableNode(String id) { - this(String.class, id, null, null); - } - - public JaxxTreeTableNode(Class<?> internalClass, - String id, - String context, - JaxxTreeTableNodeChildLoador<?, ?, N> childLoador) { - this.internalClass = internalClass; - this.id = id; - this.context = context; - this.childLoador = childLoador; - if (isStaticNode()) { - - // A static node is always full loaded - loaded = true; - } - if (log.isDebugEnabled()) { - log.debug("new node : " + this); - } - } - - @Override - public String getId() { - return id; - } - - @Override - public String getContext() { - return context; - } - - @Override - public Class<?> getInternalClass() { - return internalClass; - } - - @Override - public boolean isLoaded() { - return loaded; - } - - @Override - public boolean isDirty() { - return dirty; - } - - @Override - public boolean isStringNode() { - return String.class.equals(internalClass); - } - - @Override - public boolean isStaticNode() { - return childLoador == null; - } - - @Override - @SuppressWarnings({"unchecked"}) - public N getContainerNode() { - if (isRoot()) { - // si on arrive sur le root, quelque chose ne va pas, - // on bloque par null, a defaut de declancher une exception - return null; - } - - if (isStringNode()) { - // on est sur un noeud de type String, donc on regarde sur le parent - return getParent().getContainerNode(); - } - - // cas final : sur un noeud de donnee + classe interne de donnee - return (N) this; - } - - public boolean isRoot() { - return getParent() == null; - } - - @Override - @SuppressWarnings({"unchecked"}) - public N findNodeById(String id, - JaxxNavBridge<JaxxTreeTableModel, N> model, - DataProvider provider) { - if (id == null) { - - // id null ? donc rien a faire - return null; - } - if (id.equals(getId())) { - - // on a trouve le bon noeud - return (N) this; - } - - if (!isLoaded()) { - - // il faut charger les fils du noeud pour effectuer la recherche - populateChilds(model, provider); - } - - if (isLeaf()) { - - // au final le noeud est une feuille, donc ne convient pas - return null; - } - - // on recherche dans les fils - Enumeration<N> enumeration = children(); - while (enumeration.hasMoreElements()) { - N node = enumeration.nextElement(); - N nodeById = node.findNodeById(id, model, provider); - if (nodeById != null) { - return nodeById; - } - } - - // aucun des noeud fils ne convient - return null; - } - - @Override - public void setDirty(boolean dirty) { - this.dirty = dirty; - } - - @Override - public boolean isLeaf() { - // there is two behaviours for the test : - // 1 - when the node is static, then can directly use his number of child - // to determine if node is a leaf (no child) - // 2 - when the node is dynamic, then ALWAYS says the node is NOT a leaf until - // it was loaded, otherwise the WillExpand listener will not load the childs... - // Once the node is loaded, use back the normal behaviour (count number of childs) - return isStaticNode() ? super.isLeaf() : isLoaded() && getChildCount() == 0; - } - - @Override - public Object getUserObject() { - return id; - } - - @Override - public String toString() { - return System.identityHashCode(this) + "-" + id; - } - - //-------------------------------------------------------------------------- - //-- Populate methods - //-------------------------------------------------------------------------- - - @Override - public void populateNode(JaxxNavBridge<JaxxTreeTableModel, N> model, - DataProvider provider, - boolean populateChilds) { - - // on indique que le noeud n'est plus propre - setDirty(true); - - if (populateChilds) { - - // chargement des fils - populateChilds(model, provider); - } - } - - @Override - @SuppressWarnings({"unchecked"}) - public void populateChilds(JaxxNavBridge<JaxxTreeTableModel, N> model, - DataProvider provider) { - if (isStaticNode()) { - - // noeud static, rien a faire - return; - } - - // chargement des noeuds fils du noeud courant - try { - if (log.isDebugEnabled()) { - log.debug("Will load childs for " + this); - } - childLoador.loadChilds((JaxxTreeTableBridge<N>) model, (N) this, provider); - } catch (Exception e) { - throw new RuntimeException(e.getMessage(), e); - } finally { - - // au final, on passe le noeud a l'état chargé - loaded = true; - } - } - - //-------------------------------------------------------------------------- - //-- Overrides to use generic type as return - //-------------------------------------------------------------------------- - - @SuppressWarnings({"unchecked"}) - @Override - public N getParent() { - return (N) super.getParent(); - } - - @SuppressWarnings({"unchecked"}) - @Override - public N getChildAt(int index) { - return (N) super.getChildAt(index); - } - - @SuppressWarnings({"unchecked"}) - @Override - public Enumeration<N> children() { - return (Enumeration<N>) super.children(); - } - - @Override - public void add(N node) { - super.add(node); - } - - @SuppressWarnings({"unchecked"}) - public N[] getPathToRoot(JaxxTreeTableNode aNode, int depth) { - - JaxxTreeTableNode[] retNodes; - - /* Check for null, in case someone passed in a null node, or - they passed in an element that isn't rooted at root. */ - if (aNode == null) { - if (depth == 0) { - return null; - } else { - retNodes = new JaxxTreeTableNode[depth]; - } - } else { - depth++; - retNodes = getPathToRoot(aNode.getParent(), depth); - retNodes[retNodes.length - depth] = aNode; - } - return (N[]) retNodes; - } - - @Override - public void remove(N node) { - super.remove(node); - } - - @Override - public void insert(N node, int position) { - super.insert(node, position); - } -} Deleted: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableNodeChildLoador.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableNodeChildLoador.java 2010-06-30 16:48:34 UTC (rev 2013) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableNodeChildLoador.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -1,40 +0,0 @@ -/* - * #%L - * JAXX :: Runtime - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2008 - 2010 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>. - * #L% - */ -package jaxx.runtime.swing.nav.treetable; - -import jaxx.runtime.swing.nav.JaxxNodeChildLoador; - -/** - * Implementation for tree table of {@link JaxxNodeChildLoador} - * - * @author sletellier <letellier@codelutin.com> - * @since 2.2 - */ -public abstract class JaxxTreeTableNodeChildLoador<T, O, N extends JaxxTreeTableNode<N>> extends JaxxNodeChildLoador<T, O, JaxxTreeTableModel, JaxxTreeTableBridge<N>, N> { - - protected JaxxTreeTableNodeChildLoador(Class<O> beanType) { - super(beanType); - } -} Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableBridge.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableBridge.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableBridge.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableBridge.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,289 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav.treetable; + +import jaxx.runtime.swing.nav.NavBridge; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTreeTable; +import org.jdesktop.swingx.treetable.TreeTableNode; + +import javax.swing.event.TreeModelListener; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; +import java.util.ArrayList; +import java.util.EventListener; +import java.util.List; + +/** + * Delegate model used to switch between tree model and tree table model api + * + * @author sletellier <letellier@codelutin.com> + * @since 2.1 + */ +public class NavTreeTableBridge<N extends NavTreeTableNode<N>> implements NavBridge<NavTreeTableModel, N> { + + /** Logger */ + static private final Log log = LogFactory.getLog(NavTreeTableBridge.class); + + /** bridge model */ + protected NavTreeTableModel model; + + /** bridge ui */ + protected JXTreeTable ui; + + public NavTreeTableBridge() { + if (log.isDebugEnabled()) { + log.debug("New " + this); + } + } + + //-------------------------------------------------------------------------- + //-- Model Queries + //-------------------------------------------------------------------------- + + @Override + public NavTreeTableModel getModel() { + return model; + } + + @Override + @SuppressWarnings({"unchecked"}) + public N getRoot() { + return (N) model.getRoot(); + } + + @Override + public boolean isLeaf(Object node) { + return model.isLeaf(node); + } + + @Override + public int getChildCount(Object parent) { + return model.getChildCount(parent); + } + + @Override + @SuppressWarnings({"unchecked"}) + public N getChild(Object parent, int index) { + return (N) model.getChild(parent, index); + } + + @Override + public int getIndexOfChild(Object parent, Object child) { + return model.getIndexOfChild(parent, child); + } + + @Override + public TreeNode[] getPathToRoot(TreeNode aNode) { + return model.getPathToRoot((TreeTableNode) aNode); + } + + //-------------------------------------------------------------------------- + //-- Model modification + //-------------------------------------------------------------------------- + + + @Override + public void setModel(NavTreeTableModel model) { + this.model = model; + } + + @Override + public void setRoot(N node) { + model.setRoot(node); + } + + @Override + public void insertNodeInto(N newChild, N parent, int index) { + //FIXME c'est ca le code ? y'a rien d'ajoute au model c'est pas normal + model.nodeStructureChanged(parent); + } + + @Override + public void removeNodeFromParent(N node) { + //FIXME c'est ca le code ? y'a rien de supprimer au model c'est pas normal + model.nodeStructureChanged(node); + } + + @Override + public void reload(N node) { + model.getModelSupport().fireTreeStructureChanged(new TreePath(getPathToRoot(node))); + } + + //-------------------------------------------------------------------------- + //-- Listeners notifications + //-------------------------------------------------------------------------- + + @Override + public void valueForPathChanged(TreePath path, Object newValue) { + model.valueForPathChanged(path, newValue); + } + + @Override + public void nodeStructureChanged(TreeNode node) { + model.nodeStructureChanged((NavTreeTableNode<?>) node); + } + + @Override + public void nodeChanged(TreeNode node) { + model.nodeChanged((NavTreeTableNode<?>) node); + } + + @Override + public void nodesChanged(TreeNode node, int[] childIndices) { + //FIXME c'est plus fin que ça je pense, on indique juste que les fils ont + // changé par le node en lui meme + model.nodeChanged((NavTreeTableNode<?>) node); + } + + @Override + public void nodesWereInserted(N parent, int[] indices) { + //FIXME, hum c'est louche (on ne veut pas recharger tout le noeud sinon + // on peut perdre le positionnement de l'arbre + nodeStructureChanged(parent); + } + + @Override + public void nodeWereInserted(N parentNode, int childIndice, N node) { + //FIXME, hum c'est louche (on ne veut pas recharger tout le noeud sinon + // on peut perdre le positionnement de l'arbre + nodeStructureChanged(node); + } + + @Override + public void nodesWereRemoved(TreeNode node, int[] childIndices, + Object[] removedChildren) { + TreePath path = new TreePath(getPathToRoot(node)); + model.getModelSupport().fireChildrenRemoved(path, + childIndices, + removedChildren); + } + + @Override + @SuppressWarnings({"unchecked"}) + public void notifyChildNodesInserted(N node) { + //FIXME quel raccourci :) pour moi ça va pas trop de faire ça c'est + // trop violent, il faut affiner + nodeStructureChanged(node); + } + + @Override + public void notifyNodeInserted(N node) { + //FIXME quel raccourci :) pour moi ça va pas trop de faire ça c'est + // trop violent, il faut affiner + nodeStructureChanged(node); + } + + //-------------------------------------------------------------------------- + //-- TreeModelListener provider + //-------------------------------------------------------------------------- + + + @Override + public void addTreeModelListener(TreeModelListener l) { + model.addTreeModelListener(l); + } + + @Override + public void removeTreeModelListener(TreeModelListener l) { + model.removeTreeModelListener(l); + } + + @Override + public TreeModelListener[] getTreeModelListeners() { + return model.getModelSupport().getTreeModelListeners(); + } + + @Override + @SuppressWarnings({"unchecked"}) + public <T extends EventListener> T[] getListeners(Class<T> listenerType) { + TreeModelListener[] treeModelListeners = getTreeModelListeners(); + List<TreeModelListener> result = new ArrayList<TreeModelListener>(); + for (TreeModelListener listener : treeModelListeners) { + if (listener.getClass().isAssignableFrom(listenerType)) { + result.add(listener); + } + } + return (T[]) result.toArray(); + } + +// //-------------------------------------------------------------------------- +// //-- UI +// //-------------------------------------------------------------------------- +// +// @Override +// public JXTreeTable getUI() { +// return ui; +// } +// +// @Override +// public void setUI(JXTreeTable ui) { +// this.ui = ui; +// } +// +// @Override +// public void scrollPathToVisible(TreePath path) { +// getUI().scrollPathToVisible(path); +// } +// +// @Override +// public void setSelectionPath(TreePath path) { +// getUI().getTreeSelectionModel().setSelectionPath(path); +// } +// +// @Override +// public TreeSelectionModel getSelectionModel() { +// return getUI().getTreeSelectionModel(); +// } +// +// @Override +// public boolean isExpanded(TreePath pathToExpand) { +// return getUI().isExpanded(pathToExpand); +// } +// +// @Override +// public void expandPath(TreePath pathToExpand) { +// getUI().expandPath(pathToExpand); +// } +// +// @Override +// public AbstractNavTreeCellRenderer<NavTreeTableModel, N> getTreeCellRenderer() { +// //FIXME Implements it if possible +// return null; +// } +// +// @SuppressWarnings({"unchecked"}) +// @Override +// public N getSelectedNode() { +// TreePath path = getSelectionModel().getSelectionPath(); +// N node = null; +// if (path != null) { +// node = (N) path.getLastPathComponent(); +// } +// return node; +// } + +} \ No newline at end of file Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableBridge.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableHelper.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableHelper.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableHelper.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableHelper.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,140 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav.treetable; + +import jaxx.runtime.swing.nav.NavHelper; +import jaxx.runtime.swing.nav.tree.AbstractNavTreeCellRenderer; +import org.jdesktop.swingx.JXTreeTable; + +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; + +/** + * The implementation of {@link NavHelper} based on a {@link JXTreeTable} component. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.1 + */ +public class NavTreeTableHelper<N extends NavTreeTableNode<N>> extends NavHelper<NavTreeTableModel, JXTreeTable, NavTreeTableBridge<N>, N> { + + public NavTreeTableHelper() { + super(new NavTreeTableBridge<N>()); + } + + @Override + public void scrollPathToVisible(TreePath path) { + getUI().scrollPathToVisible(path); + } + + @Override + public void setSelectionPath(TreePath path) { + getUI().getTreeSelectionModel().setSelectionPath(path); + } + + @Override + public TreeSelectionModel getSelectionModel() { + return getUI().getTreeSelectionModel(); + } + + @Override + public boolean isExpanded(TreePath pathToExpand) { + return getUI().isExpanded(pathToExpand); + } + + @Override + public void expandPath(TreePath pathToExpand) { + getUI().expandPath(pathToExpand); + } + + @Override + public AbstractNavTreeCellRenderer<NavTreeTableModel, N> getTreeCellRenderer() { + //FIXME Implements it if possible + return null; + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getSelectedNode() { + TreePath path = getSelectionModel().getSelectionPath(); + N node = null; + if (path != null) { + node = (N) path.getLastPathComponent(); + } + return node; + } + + /** + * Registers the given {@code treeTable} for this helper. + * <p/> + * <b>Note:</b> as a side-effect, it will register (if required) the + * {@link #expandListener} listener and the {@link #selectionListener}. + * + * @param treeTable the tree table to register + * @param addExpandTreeListener a flag to add expand listener + * @param listener the optional selection listener to add + */ + @SuppressWarnings({"unchecked"}) + @Override + public void setUI(JXTreeTable treeTable, + boolean addExpandTreeListener, + TreeSelectionListener listener) { + setUI(treeTable); + if (addExpandTreeListener) { + treeTable.addTreeWillExpandListener(expandListener); + } + if (listener != null) { + treeTable.addTreeSelectionListener(listener); + } + treeTable.addTreeSelectionListener(selectionListener); + } + + @Override + protected NavTreeTableModel createModel(N node, Object... extraArgs) { + + // must have a single extra params with delegate model + if (extraArgs.length != 1) { + throw new IllegalArgumentException("Should have exactly one extra parameter (delegate model)"); + } + if (!(extraArgs[0] instanceof NavTreeTableModel.MyDefaultTreeTableModel)) { + throw new IllegalArgumentException("extra parameter is not instance of " + NavTreeTableModel.MyDefaultTreeTableModel.class.getName()); + } + NavTreeTableModel.MyDefaultTreeTableModel delegate = (NavTreeTableModel.MyDefaultTreeTableModel) extraArgs[0]; + NavTreeTableBridge<N> bridge = getBridge(); + NavTreeTableModel model = bridge.getModel(); + if (model == null) { + model = new NavTreeTableModel(delegate); + bridge.setModel(model); +// model = new NavTreeTableBridge(tableModel); + bridge.addTreeModelListener(treeModelListener); +// ((NavTreeTableModel) model).addTreeModelListener(treeModelListener); + } + bridge.setRoot(node); + + // notify structure has changed + bridge.nodeStructureChanged(getRootNode()); + return model; + } +} \ No newline at end of file Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableHelper.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableModel.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableModel.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableModel.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableModel.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,219 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav.treetable; + +import org.apache.commons.logging.Log; +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 org.jdesktop.swingx.treetable.TreeTableNode; + +import javax.swing.event.TreeModelListener; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; + +/** + * Model of the tree table used for a jaxx tree table api. + * + * @author sletellier <letellier@codelutin.com> + * @since 2.2 + */ +public class NavTreeTableModel implements TreeTableModel { + + /** + * Logger + */ + static private final Log log = LogFactory.getLog(NavTreeTableModel.class); + + /** + * Hack to acces to the modelSupport + * + * @author sletellier + * @since 2.2 + */ + public static abstract class MyDefaultTreeTableModel extends DefaultTreeTableModel { + + public TreeModelSupport getModelSupport() { + return modelSupport; + } + + public abstract String[] getColumnsNames(); + + } + + /** + * the delegate model + */ + protected MyDefaultTreeTableModel delegate; + + public NavTreeTableModel(MyDefaultTreeTableModel delegate) { + this.delegate = delegate; + } + + @SuppressWarnings({"SuspiciousSystemArraycopy"}) + public TreeTableNode[] getPathToRoot(TreeTableNode aNode) { + if (aNode == null) { + return null; + } + TreeNode[] treeNodes = getDelegate().getPathToRoot(aNode); + NavTreeTableNode<?>[] result = new NavTreeTableNode[treeNodes.length]; + System.arraycopy(treeNodes, 0, result, 0, treeNodes.length); + return result; + } + + public void nodeStructureChanged(NavTreeTableNode<?> node) { + if (node != null) { + NavTreeTableNode<?> parentNode = node.getParent(); + if (parentNode == null || parentNode.isRoot()) { + getModelSupport().fireNewRoot(); + } else { + TreeNode[] treeNodes = getPathToRoot(parentNode); + if (treeNodes != null) { + getModelSupport().fireTreeStructureChanged(new TreePath(treeNodes)); + } + // FIXME : it's append.... +// else { +// log.error("[Node structure changed] Path to root is null !"); +// } + } + } else { + log.error("Node is null !"); + } + } + + public void nodeChanged(NavTreeTableNode<?> node) { + if (node != null) { + NavTreeTableNode<?> parent = node.getParent(); + TreeNode[] treeNodes = getPathToRoot(parent); + if (treeNodes != null) { + getModelSupport().fireChildChanged( + new TreePath(treeNodes), parent.getIndex(node), node); + // FIXME : it's append.... +// else { +// log.error("[Node changed] Path to root is null !"); +// } + } + } else { + log.error("Node is null !"); + } + } + + public MyDefaultTreeTableModel getDelegate() { + return delegate; + } + + public TreeModelSupport getModelSupport() { + return delegate.getModelSupport(); + } + + public String[] getColomnsNames() { + return delegate.getColumnsNames(); + } + + public void setRoot(TreeTableNode root) { + delegate.setRoot(root); + } + + //-------------------------------------------------------------------------- + //-- Overrides delegate methode + //-------------------------------------------------------------------------- + + @Override + public TreeTableNode getRoot() { + return delegate.getRoot(); + } + + @Override + public Object getChild(Object parent, int index) { + return delegate.getChild(parent, index); + } + + @Override + public int getChildCount(Object parent) { + return delegate.getChildCount(parent); + } + + @Override + public boolean isLeaf(Object node) { + return delegate.isLeaf(node); + } + + @Override + public void valueForPathChanged(TreePath path, Object newValue) { + delegate.valueForPathChanged(path, newValue); + } + + @Override + public int getIndexOfChild(Object parent, Object child) { + return delegate.getIndexOfChild(parent, child); + } + + @Override + public void addTreeModelListener(TreeModelListener l) { + delegate.addTreeModelListener(l); + } + + @Override + public void removeTreeModelListener(TreeModelListener l) { + delegate.removeTreeModelListener(l); + } + + @Override + public Class<?> getColumnClass(int i) { + return getDelegate().getColumnClass(i); + } + + @Override + public int getColumnCount() { + return getColomnsNames().length; + } + + @Override + public String getColumnName(int column) { + return getColomnsNames()[column]; + } + + @Override + public int getHierarchicalColumn() { + return getDelegate().getHierarchicalColumn(); + } + + @Override + public Object getValueAt(Object o, int i) { + return getDelegate().getValueAt(o, i); + } + + @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); + } + +} Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableModel.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNode.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableNode.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNode.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNode.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,321 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav.treetable; + +import jaxx.runtime.swing.nav.NavDataProvider; +import jaxx.runtime.swing.nav.NavBridge; +import jaxx.runtime.swing.nav.NavNode; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTreeTable; +import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode; + +import java.util.Enumeration; + +/** + * Implementation of {@link NavNode} used to create in tree table + * This node extends {@link DefaultMutableTreeTableNode} used by + * {@link JXTreeTable} + * + * @author sletellier <letellier@codelutin.com> + * @since 2.2 + */ +public class NavTreeTableNode<N extends NavTreeTableNode<N>> extends DefaultMutableTreeTableNode implements NavNode<NavTreeTableModel, N> { + + /** Logger */ + static private final Log log = LogFactory.getLog(NavNode.class); + + private static final long serialVersionUID = 1L; + + /** Type of data associated with the node */ + protected final Class<?> internalClass; + + /** + * Optinal context to distinguish different nodes with same + * {@link #internalClass}. + */ + protected final String context; + + /** Id of the data associated with the node. */ + protected final String id; + + /** Flag to know when renderer should (re-)compute render of the node. */ + protected boolean dirty = true; + + /** Flag to know when the none static node was loaded. */ + protected boolean loaded; + + /** Optional child loador to lazy create childs of the node. */ + protected final NavTreeTableNodeChildLoador<?, ?, N> childLoador; + + protected NavTreeTableNode(String id) { + this(String.class, id, null, null); + } + + public NavTreeTableNode(Class<?> internalClass, + String id, + String context, + NavTreeTableNodeChildLoador<?, ?, N> childLoador) { + this.internalClass = internalClass; + this.id = id; + this.context = context; + this.childLoador = childLoador; + if (isStaticNode()) { + + // A static node is always full loaded + loaded = true; + } + if (log.isDebugEnabled()) { + log.debug("new node : " + this); + } + } + + @Override + public String getId() { + return id; + } + + @Override + public String getContext() { + return context; + } + + @Override + public Class<?> getInternalClass() { + return internalClass; + } + + @Override + public boolean isLoaded() { + return loaded; + } + + @Override + public boolean isDirty() { + return dirty; + } + + @Override + public boolean isStringNode() { + return String.class.equals(internalClass); + } + + @Override + public boolean isStaticNode() { + return childLoador == null; + } + + @Override + @SuppressWarnings({"unchecked"}) + public N getContainerNode() { + if (isRoot()) { + // si on arrive sur le root, quelque chose ne va pas, + // on bloque par null, a defaut de declancher une exception + return null; + } + + if (isStringNode()) { + // on est sur un noeud de type String, donc on regarde sur le parent + return getParent().getContainerNode(); + } + + // cas final : sur un noeud de donnee + classe interne de donnee + return (N) this; + } + + public boolean isRoot() { + return getParent() == null; + } + + @Override + @SuppressWarnings({"unchecked"}) + public N findNodeById(String id, + NavBridge<NavTreeTableModel, N> model, + NavDataProvider provider) { + if (id == null) { + + // id null ? donc rien a faire + return null; + } + if (id.equals(getId())) { + + // on a trouve le bon noeud + return (N) this; + } + + if (!isLoaded()) { + + // il faut charger les fils du noeud pour effectuer la recherche + populateChilds(model, provider); + } + + if (isLeaf()) { + + // au final le noeud est une feuille, donc ne convient pas + return null; + } + + // on recherche dans les fils + Enumeration<N> enumeration = children(); + while (enumeration.hasMoreElements()) { + N node = enumeration.nextElement(); + N nodeById = node.findNodeById(id, model, provider); + if (nodeById != null) { + return nodeById; + } + } + + // aucun des noeud fils ne convient + return null; + } + + @Override + public void setDirty(boolean dirty) { + this.dirty = dirty; + } + + @Override + public boolean isLeaf() { + // there is two behaviours for the test : + // 1 - when the node is static, then can directly use his number of child + // to determine if node is a leaf (no child) + // 2 - when the node is dynamic, then ALWAYS says the node is NOT a leaf until + // it was loaded, otherwise the WillExpand listener will not load the childs... + // Once the node is loaded, use back the normal behaviour (count number of childs) + return isStaticNode() ? super.isLeaf() : isLoaded() && getChildCount() == 0; + } + + @Override + public Object getUserObject() { + return id; + } + + @Override + public String toString() { + return System.identityHashCode(this) + "-" + id; + } + + //-------------------------------------------------------------------------- + //-- Populate methods + //-------------------------------------------------------------------------- + + @Override + public void populateNode(NavBridge<NavTreeTableModel, N> model, + NavDataProvider provider, + boolean populateChilds) { + + // on indique que le noeud n'est plus propre + setDirty(true); + + if (populateChilds) { + + // chargement des fils + populateChilds(model, provider); + } + } + + @Override + @SuppressWarnings({"unchecked"}) + public void populateChilds(NavBridge<NavTreeTableModel, N> model, + NavDataProvider provider) { + if (isStaticNode()) { + + // noeud static, rien a faire + return; + } + + // chargement des noeuds fils du noeud courant + try { + if (log.isDebugEnabled()) { + log.debug("Will load childs for " + this); + } + childLoador.loadChilds((NavTreeTableBridge<N>) model, (N) this, provider); + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); + } finally { + + // au final, on passe le noeud a l'état chargé + loaded = true; + } + } + + //-------------------------------------------------------------------------- + //-- Overrides to use generic type as return + //-------------------------------------------------------------------------- + + @SuppressWarnings({"unchecked"}) + @Override + public N getParent() { + return (N) super.getParent(); + } + + @SuppressWarnings({"unchecked"}) + @Override + public N getChildAt(int index) { + return (N) super.getChildAt(index); + } + + @SuppressWarnings({"unchecked"}) + @Override + public Enumeration<N> children() { + return (Enumeration<N>) super.children(); + } + + @Override + public void add(N node) { + super.add(node); + } + + @SuppressWarnings({"unchecked"}) + public N[] getPathToRoot(NavTreeTableNode aNode, int depth) { + + NavTreeTableNode[] retNodes; + + /* Check for null, in case someone passed in a null node, or + they passed in an element that isn't rooted at root. */ + if (aNode == null) { + if (depth == 0) { + return null; + } else { + retNodes = new NavTreeTableNode[depth]; + } + } else { + depth++; + retNodes = getPathToRoot(aNode.getParent(), depth); + retNodes[retNodes.length - depth] = aNode; + } + return (N[]) retNodes; + } + + @Override + public void remove(N node) { + super.remove(node); + } + + @Override + public void insert(N node, int position) { + super.insert(node, position); + } +} Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNode.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Copied: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNodeChildLoador.java (from rev 2012, trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/JaxxTreeTableNodeChildLoador.java) =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNodeChildLoador.java (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNodeChildLoador.java 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,40 @@ +/* + * #%L + * JAXX :: Runtime + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2008 - 2010 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>. + * #L% + */ +package jaxx.runtime.swing.nav.treetable; + +import jaxx.runtime.swing.nav.NavNodeChildLoador; + +/** + * Implementation for tree table of {@link NavNodeChildLoador} + * + * @author sletellier <letellier@codelutin.com> + * @since 2.2 + */ +public abstract class NavTreeTableNodeChildLoador<T, O, N extends NavTreeTableNode<N>> extends NavNodeChildLoador<T, O, NavTreeTableModel, NavTreeTableBridge<N>, N> { + + protected NavTreeTableNodeChildLoador(Class<O> beanType) { + super(beanType); + } +} Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNodeChildLoador.java ___________________________________________________________________ Added: svn:keywords + HeadURL Id Date Revision Author Added: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/package.html =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/package.html (rev 0) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/package.html 2010-06-30 17:24:16 UTC (rev 2014) @@ -0,0 +1,21 @@ +package.html +<html> +<body> +<h1>JAXX - nav tree table implementation</h1> + +This package contains the implementation of nav api for the <b>JXTreeTable</b> + +<h2>NavTreeTableNode</h2> +An override of DefaultMutableTreeTableNode implement JaxxNode + +<h2>NavTreeTableChildLoador</h2> +Object to load childs of a tree table node using DataProvider. + +<h2>NavTreeTableHelper</h2> +Helper to manage a tree table using auto-loading nodes. + +<h2>JaxxTreeTableModel</h2> +Implementation of TreeTableModel used by JaxxDelegateTreeModel + +</body> +</html> Property changes on: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/package.html ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL