Author: tchemit Date: 2008-02-17 15:53:30 +0000 (Sun, 17 Feb 2008) New Revision: 1041 Added: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/EntityTreeNodeHelper.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/EntityTreeNode.java Removed: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/TreeNodeBuilder.java Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/SimExplorer.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/DetailTabRefreshHelper.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ListTabRefreshHelper.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/MainUIRefreshHelper.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerMainUI.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerTab.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SynchronizeTabRefreshHelper.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangePageAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangeSizorAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/CollapseAllAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ConnectAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DetailToTreeAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExpandAllAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/HistoryNextAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/HistoryPreviousAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ResetSearchAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/SearchAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowDetailTabAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowSynchronizeTabAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/UnconnectAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowListTabAbstractAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowTabAbstractAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractTabAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/DetailTabModel.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/ListTabModel.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/SimExplorerTabModel.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/SynchronizeTabModel.java Log: utilisation modele de selection d'entity + simplification code Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/SimExplorer.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/SimExplorer.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/SimExplorer.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -19,12 +19,12 @@ package fr.cemagref.simexplorer.is.ui; import fr.cemagref.simexplorer.is.exceptions.SimExplorerRuntimeException; -import fr.cemagref.simexplorer.is.ui.swing.MainUIRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerActionManager; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerMainUI; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerTab; import fr.cemagref.simexplorer.is.ui.swing.actions.ConnectAction; import fr.cemagref.simexplorer.is.ui.swing.actions.ImportAction; +import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractAction; import fr.cemagref.simexplorer.is.ui.swing.util.ErrorDialog; import org.codelutin.i18n.I18n; import org.codelutin.option.ui.ConfigTableModel; @@ -139,24 +139,32 @@ try { // try to connect mainUI.getConnect().getAction().actionPerformed(new ActionEvent(mainUI, 0, "connect")); + // action will update ui if everything is correct + if (context.isConnected() && conf.isShowRemoteTab()) { + // show remote tab + mainUI.getToggleTab_remote().doClick(); + } } catch (Exception e) { // ignore ? - System.err.println(e.getMessage()); + System.err.println(e.getMessage()); } } - boolean isConnected = context.isConnected(); - // refresh ui accessibles actions - MainUIRefreshHelper.refreshConnnectState(mainUI, isConnected, null); + if (!context.isConnected()) { + getConnectAction(false).updateUI(); + } + + mainUI.setVisible(true); + } + + public static SimExplorerAbstractAction getConnectAction(boolean isConnected) { if (isConnected) { - if (conf.isShowRemoteTab()) { - // show remote tab - mainUI.getToggleTab_remote().doClick(); - } + return (SimExplorerAbstractAction) getUI().getConnect().getAction(); + } else { + return (SimExplorerAbstractAction) getUI().getUnconnect().getAction(); } - mainUI.setVisible(true); } public static void main(String... args) throws Exception { Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/DetailTabRefreshHelper.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/DetailTabRefreshHelper.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/DetailTabRefreshHelper.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -27,7 +27,7 @@ import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; import fr.cemagref.simexplorer.is.ui.swing.model.HistoryModel; import fr.cemagref.simexplorer.is.ui.swing.model.DetailTableModel; -import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; import static org.codelutin.i18n.I18n._; import javax.swing.DefaultComboBoxModel; @@ -58,6 +58,15 @@ public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSS"); + public static void refreshDetailTab(JDetailTab ui, DetailTabModel model) { + EntityTreeNode root = EntityTreeNodeHelper.build(model.getRootNode(), model.isRemote()); + EntityTreeNode current = model.getHistory().getCurrent(); + //FIXME : if object has different version, it says that this is same!!! + if (current==null || !root.getUserObject().equals(current.getUserObject())) { + model.getHistory().add(root); + } + DetailTabRefreshHelper.updateDetailNavigationTree(ui, model.getHistory()); + } /** * Rafraichit les actions d'un node dans l'arbre de navigation @@ -66,7 +75,7 @@ * @param model le model de d'onglet detail * @param node le node sélectionné dans l'arbre de navigation */ - public static void refreshDetailActions(JDetailTab ui, DetailTabModel model, LoggableElementTreeNode node) { + public static void refreshDetailActions(JDetailTab ui, DetailTabModel model, EntityTreeNode node) { // refresh synchronize action button refreshSynchroniseAction(ui, model); // refresh download LoggableElement button @@ -79,11 +88,11 @@ refreshDownloadAttachmentAction(ui, model); } - public static void refreshTreeDetailActions(JDetailTab ui, LoggableElementTreeNode node) { - MainUIRefreshHelper.refreshTreeActions(ui.getCollapseAllDetail(), ui.getExpandAllDetail(), node); + public static void refreshTreeDetailActions(JDetailTab ui, EntityTreeNode node) { + EntityTreeNodeHelper.refreshTreeActions(ui.getCollapseAllDetail(), ui.getExpandAllDetail(), node); } - public static void refreshDownloadElementAction(JDetailTab ui, DetailTabModel model, LoggableElementTreeNode node) { + public static void refreshDownloadElementAction(JDetailTab ui, DetailTabModel model, EntityTreeNode node) { MetaData detail = model.getDetail(); boolean enabled = EntityHelper.Action.DOWNLOAD.accept(node); String tooltip = !enabled ? null : _("simexplorer.action.downloadLoggableElement.tooltip", detail == null ? node.getUserObject() : detail.getName() + " [" + model.getSelectedVersion() + "]"); @@ -106,7 +115,7 @@ public static void refreshDetailToTreeAction(JDetailTab ui, DetailTabModel model) { MetaData detail = model.getDetail(); - LoggableElementTreeNode rootNode = model.getHistory().getCurrent(); + EntityTreeNode rootNode = model.getHistory().getCurrent(); LoggableElement rootElement = (LoggableElement) rootNode.getUserObject(); MetaData data = rootElement.getMetaData(); Version version = model.getSelectedVersion(); @@ -128,7 +137,7 @@ MainUIRefreshHelper.updateButton(ui.getShowTab_synchronize(), enabled, tooltip); } - protected static void refreshExportAction(JDetailTab ui, DetailTabModel model) { + public static void refreshExportAction(JDetailTab ui, DetailTabModel model) { MetaData detail = model.getDetail(); LoggableElement sNode = model.getSelectedNode(); //boolean enabled = sNode != null && SimExplorer.getContext().isConnected() && sNode instanceof ExplorationApplication; @@ -178,11 +187,13 @@ ((DetailTableModel) ui.getDetailTable().getModel()).setData(null); } - public static void updateDetailNavigationTree(JDetailTab ui, HistoryModel<LoggableElementTreeNode> model) { + public static void updateDetailNavigationTree(JDetailTab ui, HistoryModel<EntityTreeNode> model) { // push it in tree model ((DefaultTreeModel) ui.getNavigationTree().getModel()).setRoot(model.getCurrent()); // by default select the root node - ui.getNavigationTree().setSelectionRow(0); + if (ui.getNavigationTree().getModel().getRoot()!=null) { + ui.getNavigationTree().setSelectionRow(0); + } boolean enabled; enabled = model.size() > 1 && model.hasPrevious(); MainUIRefreshHelper.updateButton(ui.getHistoryPrevious(), enabled, !enabled ? null : _("simexplorer.action.historyPrevious.tooltip", model.getPrevious())); @@ -193,7 +204,9 @@ public static void updateDetailPanel(Integer index, final JDetailTab ui, DetailTabModel model, LoggableElement selectedNode) { MetaData detail = model.getDetail(); ui.getDetailVersions().setVisible(true); - ui.getDetailVersions().setSelectedIndex(index); + if (ui.getDetailVersions().getItemCount()>0) { + ui.getDetailVersions().setSelectedIndex(index); + } ui.getDetailHeader().setText(selectedNode.getMetaData().getName()); ui.getDetailDescriptorsHeader().setText(_("simexplorer.node.descriptors", detail.getDescriptors().size())); ui.getDetailType().setText(EntityHelper.Type.getLibelle(detail)); Copied: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/EntityTreeNodeHelper.java (from rev 1038, trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/TreeNodeBuilder.java) =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/EntityTreeNodeHelper.java (rev 0) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/EntityTreeNodeHelper.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -0,0 +1,311 @@ +/* +* ##% Copyright (C) 2007, 2008 Code Lutin, +* Tony Chemit, Gabriel Landais +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* 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 Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* ##% */ +package fr.cemagref.simexplorer.is.ui.swing; + +import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.Code; +import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.Component; +import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.Constant; +import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.ConstantValue; +import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.ExplorationData; +import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.Library; +import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.Structure; +import fr.cemagref.simexplorer.is.entities.EntityVisitable; +import fr.cemagref.simexplorer.is.entities.SimpleEntityVisitor; +import fr.cemagref.simexplorer.is.entities.data.Code; +import fr.cemagref.simexplorer.is.entities.data.Component; +import fr.cemagref.simexplorer.is.entities.data.Constant; +import fr.cemagref.simexplorer.is.entities.data.ConstantValue; +import fr.cemagref.simexplorer.is.entities.data.ExplorationApplication; +import fr.cemagref.simexplorer.is.entities.data.ExplorationData; +import fr.cemagref.simexplorer.is.entities.data.Library; +import fr.cemagref.simexplorer.is.entities.data.LoggableElement; +import fr.cemagref.simexplorer.is.entities.data.Result; +import fr.cemagref.simexplorer.is.entities.data.Structure; +import fr.cemagref.simexplorer.is.entities.metadata.MetaData; +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; +import static org.codelutin.i18n.I18n._; + +import javax.swing.AbstractButton; +import javax.swing.JTree; +import javax.swing.tree.TreePath; +import java.util.Collection; + +/** + * La classe responsable de la création des arbres de {@link fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode} + * à partir de {@link LoggableElement} . + * <p/> + * La classe possède une instance cachée par thread qui délègue la construction + * del'arbre de navigation à un visiteur de {@link LoggableElement}. + * <p/> + * + * @author chemit + */ +public class EntityTreeNodeHelper { + + /** L'instance cachée de builder par Thread. */ + protected static final ThreadLocal<EntityVisitorBuilder> builder = + new ThreadLocal<EntityVisitorBuilder>() { + @Override + protected EntityVisitorBuilder initialValue() { + return new EntityVisitorBuilder(); + } + }; + + /** + * Construit un arbre de navigation à partir d'un {@link LoggableElement}. + * + * @param v la donnée à visiter + * @param remote flag pour indiquer si on travaille sur des données locales + * ou en remote. + * @return le noeud parent de l'arbre de nivation construit. + */ + public static EntityTreeNode build(LoggableElement v, boolean remote) { + EntityVisitorBuilder instance; + synchronized (instance = EntityTreeNodeHelper.builder.get()) { + EntityTreeNode result; + // walk + result = instance.visit(v, remote); + return result; + } + } + + public static EntityTreeNode getSelectedNodeOrRootNode(JTree tree) { + EntityTreeNode node = getSelectedNode(tree); + if (node == null) { + return getRootNode(tree); + } + return node; + } + + public static EntityTreeNode getSelectedNode(JTree tree) { + TreePath path = tree.getSelectionPath(); + EntityTreeNode node = null; + if (path != null) { + Object o = path.getLastPathComponent(); + if (o != null && !(o instanceof EntityTreeNode)) { + return null; + } + node = (EntityTreeNode) o; + } + return node; + } + + public static EntityTreeNode getRootNode(JTree tree) { + EntityTreeNode node; + // take the root node + Object root = tree.getModel().getRoot(); + if (root == null || !(root instanceof EntityTreeNode)) { + return null; + } + node = (EntityTreeNode) root; + return node; + } + + public static void refreshTreeActions(AbstractButton collapseButton, AbstractButton expandButton, EntityTreeNode node) { + String tooltip; + boolean enabled = node != null && !node.isLeaf() && node.getChildCount() > 0; + tooltip = !enabled ? null : _("simexplorer.action.collapseAll.tooltip", node.getUserObject()); + MainUIRefreshHelper.updateButton(collapseButton, enabled, tooltip); + tooltip = !enabled ? null : _("simexplorer.action.expandAll.tooltip", node.getUserObject()); + MainUIRefreshHelper.updateButton(expandButton, enabled, tooltip); + } + + protected EntityTreeNodeHelper() { + // no instance + } + + /** + * Implantation de {@link SimpleEntityVisitor} pour construire l'arbre + * de navigation d'un {@link LoggableElement}. + * <p/> + * Cette classe est stateless, tous ces états internes doivent être nettoyé + * après une visite, en utilisant la méthode {@link #reset()}. + * <p/> + */ + public static class EntityVisitorBuilder extends SimpleEntityVisitor { + + /** + * le noeud parent de tous les autres. + * <p/> + * Ce noeud est positionné par la méthode + * {@link #markRootNode(EntityTreeNode)}. + */ + protected EntityTreeNode rootNode; + + /** + * flag qui indique si on travaille sur des objet locaux ou distants. + * <p/> + * Cette information est conservé dans les nodes pour permettre de gérer + * de manière transparent des objet locaux ou distants. + */ + protected Boolean remote; + + /** les nodes internes utilisés pendant la visite. */ + protected EntityTreeNode explorationApplication, + component, + explorationData, + components, + explorationDatas, + libraries, + constants, + strutures, + codes, + constantValues; + + public EntityTreeNode visit(EntityVisitable v, boolean remote) { + reset(); + try { + this.remote = remote; + super.visit(v); + EntityTreeNode result; + result = this.rootNode; + return result; + } finally { + reset(); + } + } + + @Override + public void visitMetaData(MetaData v) { + // do not visit meta data (for the moment we dont need thoses + // informations in navigation tree), but it could be interresting + // for example to display attchments here ? + } + + @Override + public void visitExplorationApplication(ExplorationApplication v) { + markRootNode(explorationApplication = new EntityTreeNode(explorationDatas, v, remote, true)); + super.visitExplorationApplication(v); + } + + @Override + public void visitComponent(Component v) { + markRootNode(component = new EntityTreeNode(components, v, remote, true)); + super.visitComponent(v); + } + + @Override + public void visitExplorationData(ExplorationData v) { + markRootNode(explorationData = new EntityTreeNode(explorationDatas, v, remote, true)); + super.visitExplorationData(v); + } + + @Override + public void visitCodes(Collection<Code> vs) { + codes = new EntityTreeNode(component, Code.getLibelles(), remote, true); + super.visitCodes(vs); + } + + @Override + public void visitComponents(Collection<Component> vs) { + components = new EntityTreeNode(explorationApplication, Component.getLibelles(), remote, true); + super.visitComponents(vs); + } + + @Override + public void visitConstants(Collection<Constant> vs) { + constants = new EntityTreeNode(component, Constant.getLibelles(), remote, true); + super.visitConstants(vs); + } + + @Override + public void visitConstantValues(Collection<ConstantValue> vs) { + constantValues = new EntityTreeNode(explorationData, ConstantValue.getLibelles(), remote, true); + super.visitConstantValues(vs); + } + + @Override + public void visitExplorationDatas(Collection<ExplorationData> vs) { + explorationDatas = new EntityTreeNode(explorationApplication, ExplorationData.getLibelles(), remote, true); + super.visitExplorationDatas(vs); + } + + @Override + public void visitLibraries(Collection<Library> vs) { + libraries = new EntityTreeNode(component, Library.getLibelles(), remote, true); + super.visitLibraries(vs); + } + + @Override + public void visitStructures(Collection<Structure> vs) { + strutures = new EntityTreeNode(component, Structure.getLibelles(), remote, true); + super.visitStructures(vs); + } + + @Override + public void visitConstant(Constant v) { + markRootNode(new EntityTreeNode(constants, v, remote, false)); + } + + @Override + public void visitLibrary(Library v) { + markRootNode(new EntityTreeNode(libraries, v, remote, false)); + } + + @Override + public void visitResult(Result v) { + if (v != null) { + markRootNode(new EntityTreeNode(explorationData, v, remote, false)); + } + } + + @Override + public void visitCode(Code v) { + new EntityTreeNode(codes, v, remote, false); + } + + @Override + public void visitConstantValue(ConstantValue v) { + new EntityTreeNode( + new EntityTreeNode(constantValues, v.getConstant().getName(), remote, true), + v.getValue(), remote, false); + } + + @Override + public void visitStructure(Structure v) { + new EntityTreeNode(strutures, v, remote, false); + } + + /** + * Tente de marquerle node donné comme noeud ancêtre de tous les autres. + * <p/> + * Le positionnement n'a lieu que si on a pas encore de rootNode. + * + * @param node le node a positionner comme rootNode (si nessecaire) + */ + protected void markRootNode(EntityTreeNode node) { + if (rootNode == null) { + rootNode = node; + } + } + + /** + * La méthode pour réinitialiser les états interne de la classe. + * <p/> + * Cette méthode doit être appeler après chaque visite, afin d'assurer + * la propriété stateless de la classe. + */ + protected void reset() { + remote = null; + rootNode = explorationApplication = explorationDatas = explorationData + = components = component = constants = codes = libraries + = constantValues = null; + } + } +} Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ListTabRefreshHelper.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ListTabRefreshHelper.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ListTabRefreshHelper.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -21,12 +21,14 @@ import fr.cemagref.simexplorer.is.entities.EntityHelper; import fr.cemagref.simexplorer.is.entities.metadata.MetaData; import fr.cemagref.simexplorer.is.ui.SimExplorer; +import fr.cemagref.simexplorer.is.ui.swing.model.DataEntityModel; import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; import fr.cemagref.simexplorer.is.ui.swing.model.PaginationModel; import static org.codelutin.i18n.I18n._; import javax.swing.JComboBox; import javax.swing.SwingUtilities; +import javax.swing.ListSelectionModel; /** * Cette classe contient les méthodes utiles et réutilisables pour rafraichir @@ -64,6 +66,15 @@ // refresh pagination actions refreshPagination(ui, model.getPagination()); + + ListSelectionModel selectionModel = ui.getTable().getSelectionModel(); + if (!model.isEmpty() && selectionModel.isSelectionEmpty()) { + // always select the first row (to init selectedItem) + selectionModel.setSelectionInterval(0, 0); + } else { + selectionModel.clearSelection(); + } + // table data model may have changed, must revalidate ui.getTable().invalidate(); @@ -74,13 +85,12 @@ } public static void refreshListTablePopupMenu(final JListTab ui, final ListTabModel model) { - int index = model.getSelectedIndex(); - if (index == -1) { - // disable popupmenu - ui.getTablePopupMenu().setEnabled(false); + DataEntityModel item = model.getSelectedItem(); + ui.getTablePopupMenu().setEnabled(item != null); + if (item == null) { return; } - ui.getTablePopupMenu().setEnabled(true); + int index = model.getSelectedIndex(); MetaData data = model.get(index); String text = data.getName() + " [" + data.getVersion() + "]"; Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/MainUIRefreshHelper.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/MainUIRefreshHelper.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/MainUIRefreshHelper.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -18,21 +18,7 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing; -import fr.cemagref.simexplorer.is.entities.data.LoggableElement; -import fr.cemagref.simexplorer.is.ui.SimExplorer; -import fr.cemagref.simexplorer.is.ui.swing.actions.util.ChangeI18nAbstractAction; -import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.HistoryModel; -import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; -import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; -import org.codelutin.i18n.CountryEnum; -import org.codelutin.i18n.LanguageEnum; - import javax.swing.AbstractButton; -import javax.swing.JTabbedPane; -import javax.swing.JTree; -import javax.swing.tree.TreePath; -import java.util.regex.Matcher; /** * Cette classe contient les méthodes utiles et réutilisables pour rafraichit @@ -50,160 +36,109 @@ */ public class MainUIRefreshHelper { - /** - * Rafraichit les actions i18n dans le menu en fonction de la locale - * actuellement utilisée. - * - * @param ui l'ui principale - */ - public static void refreshI18nActions(SimExplorerMainUI ui) { - LanguageEnum language = SimExplorer.getContext().getConfig().getUserLanguage(); - CountryEnum country = SimExplorer.getContext().getConfig().getUserCountry(); - String[] actions = SimExplorerActionManager.getFactory().getActionNames(); - for (String actionName : actions) { - Matcher matcher = ChangeI18nAbstractAction.PATTERN_NAME.matcher(actionName); - if (!matcher.matches()) { - continue; - } - AbstractButton button = (AbstractButton) ui.getObjectById(actionName); - ChangeI18nAbstractAction action = (ChangeI18nAbstractAction) button.getAction(); - boolean enable = !action.equalsLocale(language, country); - button.setEnabled(enable); - } - } - /** - * Rafraichit les uis après un changement de status de connexion de l'utilisateur. - * <p/> - * Si l'utilisateur est déconnecté, alors toutes les ui et actions liées au - * mode remote sont fermées et les actions correspondantes sont rendues - * inaccessibles. - * - * @param ui l'ui principale - * @param isConnected flag pour indique si l'utiliseur est connecté - * @param history l'historique de l'onglet de detail - */ - public static void refreshConnnectState(SimExplorerMainUI ui, final boolean isConnected, HistoryModel<LoggableElementTreeNode> history) { - - //SwingUtilities.invokeLater(new Runnable() { - // public void run() { - ui.getConnect().setEnabled(!isConnected); - ui.getUnconnect().setEnabled(isConnected); - ui.getShowTab_remote().setEnabled(isConnected); - ui.getToggleTab_remote().setEnabled(isConnected); - - JTabbedPane container = ui.getContent(); - DetailTabModel model = (DetailTabModel) SimExplorerTab.detail.getModel(); - JDetailTab tabUI = (JDetailTab) SimExplorerTab.detail.getUI(); - if (!isConnected) { - // close all connected ui - - if (SimExplorerTab.remote.isTabVisible(container)) { - // close tab - SimExplorerTab.remote.closeTab(container); + public static void refreshExportAction(boolean enabled, boolean remote, String text, AbstractButton button) { + String tooltip = null; + if (enabled) { + if (remote) { + tooltip = org.codelutin.i18n.I18n._("simexplorer.action.exportToLocal.tooltip", text); + } else { + tooltip = org.codelutin.i18n.I18n._("simexplorer.action.exportToRemote.tooltip", text); } - if (SimExplorerTab.synchronize.isTabVisible(container)) { - // close tab - SimExplorerTab.synchronize.closeTab(container); - } - if (SimExplorerTab.detail.isTabVisible(container) && history != null) { - if (history.isEmpty()) { - // close tab, no more history - SimExplorerTab.detail.closeTab(container); - } else { - // select current history element - LoggableElementTreeNode node = history.getCurrent(); - model.setRemote(node.isRemote()); - model.setRootNode((LoggableElement) node.getUserObject()); - DetailTabRefreshHelper.updateDetailNavigationTree(tabUI, model.getHistory()); - } - } } - if (SimExplorerTab.detail.isTabVisible(container)) { - DetailTabRefreshHelper.refreshSynchroniseAction(tabUI, model); - DetailTabRefreshHelper.refreshExportAction(tabUI, model); - } - - if (SimExplorerTab.local.isTabVisible(container)) { - ListTabRefreshHelper.refreshListTablePopupMenu((JListTab)SimExplorerTab.local.getUI(), (ListTabModel) SimExplorerTab.local.getModel()); - } - // } - //}); + updateButton(button, enabled, tooltip); } protected static void updateButton(AbstractButton button, boolean enabled, String tooltip) { button.setEnabled(enabled); - button.setToolTipText(enabled?tooltip:null); + button.setToolTipText(enabled ? tooltip : null); } protected MainUIRefreshHelper() { // do not instanciate me please } - public static void refreshTreeActions(AbstractButton collapseButton, AbstractButton expandButton, LoggableElementTreeNode node) { - String tooltip; - boolean enabled = node != null && !node.isLeaf() && node.getChildCount() > 0; - tooltip = !enabled ? null : org.codelutin.i18n.I18n._("simexplorer.action.collapseAll.tooltip", node.getUserObject()); - updateButton(collapseButton, enabled, tooltip); - tooltip = !enabled ? null : org.codelutin.i18n.I18n._("simexplorer.action.expandAll.tooltip", node.getUserObject()); - updateButton(expandButton, enabled, tooltip); - } +} - public static void refreshExportAction(boolean enabled, boolean remote, String text, AbstractButton button) { - String tooltip = null; - if (enabled) { - if (remote) { - tooltip = org.codelutin.i18n.I18n._("simexplorer.action.exportToLocal.tooltip", text); - } else { - tooltip = org.codelutin.i18n.I18n._("simexplorer.action.exportToRemote.tooltip", text); - } - } - updateButton(button, enabled, tooltip); - } +/** + * Rafraichit les uis après un changement de status de connexion de l'utilisateur. + * <p/> + * Si l'utilisateur est déconnecté, alors toutes les ui et actions liées au + * mode remote sont fermées et les actions correspondantes sont rendues + * inaccessibles. + * + * @param ui l'ui principale + * @param isConnected flag pour indique si l'utiliseur est connecté + * @param history l'historique de l'onglet de detail + */ +/* public static void refreshConnnectState(SimExplorerMainUI ui, final boolean isConnected, HistoryModel<EntityTreeNode> history) { - public static LoggableElementTreeNode getSelectedNodeOrRootNode(JTree tree) { - TreePath path = tree.getSelectionPath(); - LoggableElementTreeNode node = null; - if (path != null) { - Object o = path.getLastPathComponent(); - if (o != null && !(o instanceof LoggableElementTreeNode)) { - return null; - } - node = (LoggableElementTreeNode) o; + //SwingUtilities.invokeLater(new Runnable() { + // public void run() { + ui.getConnect().setEnabled(!isConnected); + ui.getUnconnect().setEnabled(isConnected); + ui.getShowTab_remote().setEnabled(isConnected); + ui.getToggleTab_remote().setEnabled(isConnected); + + JTabbedPane container = ui.getContent(); + DetailTabModel model = (DetailTabModel) SimExplorerTab.detail.getModel(); + JDetailTab tabUI = (JDetailTab) SimExplorerTab.detail.getUI(); + if (!isConnected) { + // close all connected ui + + if (SimExplorerTab.remote.isTabVisible(container)) { + // close tab + SimExplorerTab.remote.closeTab(container); } - if (node == null) { - // take the root node - Object root = tree.getModel().getRoot(); - if (root == null || !(root instanceof LoggableElementTreeNode)) { - return null; + if (SimExplorerTab.synchronize.isTabVisible(container)) { + // close tab + SimExplorerTab.synchronize.closeTab(container); + } + if (SimExplorerTab.detail.isTabVisible(container) && history != null) { + if (history.isEmpty()) { + // close tab, no more history + SimExplorerTab.detail.closeTab(container); + } else { + // select current history element + EntityTreeNode node = history.getCurrent(); + model.synch(node); + //model.setRemote(node.isRemote()); + //model.setRootNode((LoggableElement) node.getUserObject()); + DetailTabRefreshHelper.updateDetailNavigationTree(tabUI, model.getHistory()); } - node = (LoggableElementTreeNode) root; } - return node; } + if (SimExplorerTab.detail.isTabVisible(container)) { + DetailTabRefreshHelper.refreshSynchroniseAction(tabUI, model); + DetailTabRefreshHelper.refreshExportAction(tabUI, model); + } - public static LoggableElementTreeNode getSelectedNode(JTree tree) { - TreePath path = tree.getSelectionPath(); - LoggableElementTreeNode node = null; - if (path != null) { - Object o = path.getLastPathComponent(); - if (o != null && !(o instanceof LoggableElementTreeNode)) { - return null; - } - node = (LoggableElementTreeNode) o; - } - return node; + if (SimExplorerTab.local.isTabVisible(container)) { + ListTabRefreshHelper.refreshListTablePopupMenu((JListTab) SimExplorerTab.local.getUI(), (ListTabModel) SimExplorerTab.local.getModel()); } + // } + //}); +}*/ - public static LoggableElementTreeNode getRootNode(JTree tree) { - LoggableElementTreeNode node; - // take the root node - Object root = tree.getModel().getRoot(); - if (root == null || !(root instanceof LoggableElementTreeNode)) { - return null; +/** + * Rafraichit les actions i18n dans le menu en fonction de la locale + * actuellement utilisée. + * + * @param ui l'ui principale + */ +/*public static void refreshI18nActions(SimExplorerMainUI ui) { + LanguageEnum language = SimExplorer.getContext().getConfig().getUserLanguage(); + CountryEnum country = SimExplorer.getContext().getConfig().getUserCountry(); + String[] actions = SimExplorerActionManager.getFactory().getActionNames(); + for (String actionName : actions) { + Matcher matcher = ChangeI18nAbstractAction.PATTERN_NAME.matcher(actionName); + if (!matcher.matches()) { + continue; } - node = (LoggableElementTreeNode) root; - return node; + AbstractButton button = (AbstractButton) ui.getObjectById(actionName); + ChangeI18nAbstractAction action = (ChangeI18nAbstractAction) button.getAction(); + boolean enable = !action.equalsLocale(language, country); + button.setEnabled(enable); } -} +}*/ \ No newline at end of file Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerMainUI.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerMainUI.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerMainUI.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -18,6 +18,11 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing; +import fr.cemagref.simexplorer.is.ui.SimExplorer; +import fr.cemagref.simexplorer.is.ui.swing.actions.util.ChangeI18nAbstractAction; +import org.codelutin.i18n.CountryEnum; +import org.codelutin.i18n.LanguageEnum; + import javax.swing.AbstractAction; import javax.swing.AbstractButton; import javax.swing.JComponent; @@ -28,6 +33,7 @@ import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; +import java.util.regex.Matcher; /** * L'ui principale de l'application @@ -64,7 +70,7 @@ getRootPane().getActionMap().put("quit", SimExplorerActionManager.newAction("quit", (AbstractButton) null)); // repaint i18n actions - MainUIRefreshHelper.refreshI18nActions(this); + refreshI18nActions(); } public void setStatus(final String msg) { @@ -79,4 +85,25 @@ SwingUtilities.invokeLater(runnable); } + /** + * Rafraichit les actions i18n dans le menu en fonction de la locale + * actuellement utilisée. + */ + public void refreshI18nActions() { + + LanguageEnum language = SimExplorer.getContext().getConfig().getUserLanguage(); + CountryEnum country = SimExplorer.getContext().getConfig().getUserCountry(); + String[] actions = SimExplorerActionManager.getFactory().getActionNames(); + for (String actionName : actions) { + Matcher matcher = ChangeI18nAbstractAction.PATTERN_NAME.matcher(actionName); + if (!matcher.matches()) { + continue; + } + AbstractButton button = (AbstractButton) getObjectById(actionName); + ChangeI18nAbstractAction action = (ChangeI18nAbstractAction) button.getAction(); + boolean enable = !action.equalsLocale(language, country); + button.setEnabled(enable); + } + } + } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerTab.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerTab.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerTab.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -41,7 +41,10 @@ parentImpl = JTabbedPane.class, name = "simexplorer.tab.detail", shortDescription = "simexplorer.tab.detail.tooltip" - )detail, + )detail { + public <U extends JAXXTab, M extends SimExplorerTabModel> void updateUI(U ui, M model) { + DetailTabRefreshHelper.refreshDetailTab((JDetailTab) ui, (DetailTabModel) model); + }}, @TabContentConfig( impl = JListTab.class, @@ -50,7 +53,10 @@ useToogle = true, name = "simexplorer.tab.local", shortDescription = "simexplorer.tab.local.tooltip" - )local, + )local { + public <U extends JAXXTab, M extends SimExplorerTabModel> void updateUI(U ui, M model) { + ListTabRefreshHelper.refreshListTabUI((JListTab) ui, (ListTabModel) model); + }}, @TabContentConfig( impl = JListTab.class, @@ -59,7 +65,10 @@ useToogle = true, name = "simexplorer.tab.remote", shortDescription = "simexplorer.tab.remote.tooltip" - )remote, + )remote { + public <U extends JAXXTab, M extends SimExplorerTabModel> void updateUI(U ui, M model) { + ListTabRefreshHelper.refreshListTabUI((JListTab) ui, (ListTabModel) model); + }}, @TabContentConfig( impl = JSynchronizeTab.class, @@ -68,7 +77,11 @@ useToogle = false, name = "simexplorer.tab.synchronize", shortDescription = "simexplorer.tab.synchronize.tooltip" - )synchronize; + )synchronize { + public <U extends JAXXTab, M extends SimExplorerTabModel> void updateUI(U ui, M model) { + SynchronizeTabRefreshHelper.refreshSynchronizeTab((JSynchronizeTab) ui, (SynchronizeTabModel) model); + } + }; /** l'usine de tabs */ private static SimExplorerTabFactory factory; @@ -80,6 +93,8 @@ return factory; } + public abstract <U extends JAXXTab, M extends SimExplorerTabModel> void updateUI(U ui, M model); + public JAXXTab getUI() { return getFactory().getUI(name()); } @@ -94,10 +109,7 @@ } public boolean isTabSelected(JTabbedPane container) { - if (!isTabVisible(container)) { - return false; - } - return getFactory().getTabIndex(container, getUI()) == container.getSelectedIndex(); + return isTabVisible(container) && getFactory().getTabIndex(container, getUI()) == container.getSelectedIndex(); } public int getTabIndex(JTabbedPane container) { @@ -111,8 +123,13 @@ public void closeTab(JTabbedPane container) { getFactory().closeTab(container, name()); + getModel().setSelectedItem(null); } + public void updateUI() { + updateUI(getUI(), getModel()); + } + public void removePropertyChangeListeners() { getModel().removePropertyChangeListeners(); } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SynchronizeTabRefreshHelper.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SynchronizeTabRefreshHelper.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SynchronizeTabRefreshHelper.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -20,9 +20,8 @@ import fr.cemagref.simexplorer.is.entities.EntityHelper; import fr.cemagref.simexplorer.is.entities.data.LoggableElement; -import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; import fr.cemagref.simexplorer.is.ui.swing.model.SynchronizeTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.TreeNodeBuilder; import javax.swing.JTree; import javax.swing.tree.DefaultTreeModel; @@ -44,40 +43,16 @@ */ public class SynchronizeTabRefreshHelper { - public static void refreshExportElementToRemoteAction(JSynchronizeTab ui, SynchronizeTabModel model) { - LoggableElement sNode = model.getLocalSelectedNode(); - boolean enabled = EntityHelper.Action.EXPORT.accept(sNode); - String text = null; - if (enabled) { - text = sNode.getMetaData().getName() + " [" + sNode.getMetaData().getVersion() + "]"; - } - MainUIRefreshHelper.refreshExportAction(enabled, false, text, ui.getExportElementToRemote()); - } + protected static void refreshSynchronizeTab(JSynchronizeTab ui, SynchronizeTabModel model) { + SynchronizeTabRefreshHelper.refreshTreeLocalActions(ui, null); + SynchronizeTabRefreshHelper.refreshTreeRemoteActions(ui, null); + SynchronizeTabRefreshHelper.refreshExportElementToLocalAction(ui, model); + SynchronizeTabRefreshHelper.refreshExportElementToRemoteAction(ui, model); - public static void refreshExportElementToLocalAction(JSynchronizeTab ui, SynchronizeTabModel model) { - LoggableElement sNode = model.getRemoteSelectedNode(); - boolean enabled = EntityHelper.Action.EXPORT.accept(sNode); - String text = null; - if (enabled) { - text = sNode.getMetaData().getName() + " [" + sNode.getMetaData().getVersion() + "]"; - } - MainUIRefreshHelper.refreshExportAction(enabled, true, text, ui.getExportElementToLocal()); - } + boolean remote = model.isRemote(); + TreeNode sourceRoot = EntityTreeNodeHelper.build(model.getSource(), remote); + TreeNode destinationRoot = model.getDestination() == null ? null : EntityTreeNodeHelper.build(model.getDestination(), !remote); - public static void refreshTreeLocalActions(JSynchronizeTab ui, LoggableElementTreeNode node) { - MainUIRefreshHelper.refreshTreeActions(ui.getCollapseAllLocal(), ui.getExpandAllLocal(), node); - } - - public static void refreshTreeRemoteActions(JSynchronizeTab ui, LoggableElementTreeNode node) { - MainUIRefreshHelper.refreshTreeActions(ui.getCollapseAllRemote(), ui.getExpandAllRemote(), node); - } - - public static void updateSynchronizeNavigationTrees(JSynchronizeTab ui, SynchronizeTabModel model) { - - boolean remote = model.isRemote(); - TreeNode sourceRoot = TreeNodeBuilder.build(model.getSource(), remote); - TreeNode destinationRoot = model.getDestination() == null ? null : TreeNodeBuilder.build(model.getDestination(), !remote); - JTree sourceTree, destinationTree; if (remote) { // source is remote @@ -100,11 +75,38 @@ } else { destinationTree.setSelectionRow(0); } - //sourceTree.invalidate(); - //destinationTree.invalidate(); - //ui.repaint(); } + + public static void refreshExportElementToRemoteAction(JSynchronizeTab ui, SynchronizeTabModel model) { + LoggableElement sNode = model.getLocalSelectedNode(); + boolean enabled = EntityHelper.Action.EXPORT.accept(sNode); + String text = null; + if (enabled) { + text = sNode.getMetaData().getName() + " [" + sNode.getMetaData().getVersion() + "]"; + } + MainUIRefreshHelper.refreshExportAction(enabled, false, text, ui.getExportElementToRemote()); + } + public static void refreshExportElementToLocalAction(JSynchronizeTab ui, SynchronizeTabModel model) { + LoggableElement sNode = model.getRemoteSelectedNode(); + boolean enabled = EntityHelper.Action.EXPORT.accept(sNode); + String text = null; + if (enabled) { + text = sNode.getMetaData().getName() + " [" + sNode.getMetaData().getVersion() + "]"; + } + MainUIRefreshHelper.refreshExportAction(enabled, true, text, ui.getExportElementToLocal()); + } + + public static void refreshTreeLocalActions(JSynchronizeTab ui, EntityTreeNode node) { + EntityTreeNodeHelper.refreshTreeActions(ui.getCollapseAllLocal(), ui.getExpandAllLocal(), node); + } + + public static void refreshTreeRemoteActions(JSynchronizeTab ui, EntityTreeNode node) { + EntityTreeNodeHelper.refreshTreeActions(ui.getCollapseAllRemote(), ui.getExpandAllRemote(), node); + } + + + protected SynchronizeTabRefreshHelper() { // do not instanciate me please } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangePageAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangePageAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangePageAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -18,12 +18,12 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.actions; -import fr.cemagref.simexplorer.is.ui.swing.SimExplorerActionManager; import fr.cemagref.simexplorer.is.ui.swing.JListTab; import fr.cemagref.simexplorer.is.ui.swing.ListTabRefreshHelper; +import fr.cemagref.simexplorer.is.ui.swing.SimExplorerActionManager; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractTabAction; +import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; import fr.cemagref.simexplorer.is.ui.swing.model.ListTableModel; -import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; import fr.cemagref.simexplorer.is.ui.swing.model.PaginationModel; import javax.swing.AbstractAction; @@ -92,10 +92,18 @@ modelTab.setData(model.getList()); // refresh ui - ListTabRefreshHelper.refreshListTabUI(container, model); + //ListTabRefreshHelper.refreshListTabUI(container, model); } @Override + public void updateUI() { + super.updateUI(); + // refresh ui + getTab().updateUI(); + //ListTabRefreshHelper.refreshListTabUI((JListTab) getUI(), (ListTabModel) getModel()); + } + + @Override protected void clear() { setTab(null); newPage = null; Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangeSizorAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangeSizorAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangeSizorAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -89,10 +89,17 @@ modelTab.setData(model.getList()); // refresh ui - ListTabRefreshHelper.refreshListTabUI(container, model); + //ListTabRefreshHelper.refreshListTabUI(container, model); } @Override + public void updateUI() { + super.updateUI(); + // refresh ui + getTab().updateUI(); + } + + @Override protected void clear() { setTab(null); newWidth = null; Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/CollapseAllAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/CollapseAllAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/CollapseAllAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -20,9 +20,9 @@ import fr.cemagref.simexplorer.is.ui.swing.JDetailTab; import fr.cemagref.simexplorer.is.ui.swing.JSynchronizeTab; -import fr.cemagref.simexplorer.is.ui.swing.MainUIRefreshHelper; +import fr.cemagref.simexplorer.is.ui.swing.EntityTreeNodeHelper; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractTabAction; -import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; import javax.swing.JTree; import java.awt.event.ActionEvent; @@ -45,7 +45,7 @@ private static final long serialVersionUID = -3254708595851406041L; JTree tree; - LoggableElementTreeNode node; + EntityTreeNode node; public CollapseAllAction(String name) { super(name); @@ -72,7 +72,7 @@ // arbre non trouvé (cela devrait souleve une exception !) return false; } - node = MainUIRefreshHelper.getSelectedNodeOrRootNode(tree); + node = EntityTreeNodeHelper.getSelectedNodeOrRootNode(tree); boolean result; result = !(node == null || node.isLeaf()); return result; Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ConnectAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ConnectAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ConnectAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -18,21 +18,27 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.actions; -import static org.codelutin.i18n.I18n._; - -import java.awt.event.ActionEvent; - -import javax.swing.JOptionPane; - import fr.cemagref.simexplorer.is.exceptions.SimExplorerException; +import fr.cemagref.simexplorer.is.exceptions.SimExplorerRuntimeException; import fr.cemagref.simexplorer.is.service.AuthenticationServiceHelper; import fr.cemagref.simexplorer.is.service.StorageService; -import fr.cemagref.simexplorer.is.exceptions.SimExplorerRuntimeException; import fr.cemagref.simexplorer.is.ui.StorageServiceHelper; +import fr.cemagref.simexplorer.is.ui.swing.DetailTabRefreshHelper; +import fr.cemagref.simexplorer.is.ui.swing.JDetailTab; +import fr.cemagref.simexplorer.is.ui.swing.JListTab; +import fr.cemagref.simexplorer.is.ui.swing.ListTabRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.LoginUI; -import fr.cemagref.simexplorer.is.ui.swing.MainUIRefreshHelper; +import fr.cemagref.simexplorer.is.ui.swing.SimExplorerMainUI; +import fr.cemagref.simexplorer.is.ui.swing.SimExplorerTab; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractAction; +import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; +import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; +import static org.codelutin.i18n.I18n._; +import javax.swing.JOptionPane; +import javax.swing.JTabbedPane; +import java.awt.event.ActionEvent; + /** * Action de connexion au serveur distant * @@ -60,7 +66,7 @@ } public void disposeUI() { - ui=null; + ui = null; } @Override @@ -77,17 +83,52 @@ super.doAction(e); String login = getContext().getConfig().getRemoteLogin(); String hashPassword = getContext().getConfig().getRemotePassword(); - if (hashPassword == null || hashPassword.length()==0 || !loginUIHandler.connect(login, hashPassword)) { + if (hashPassword == null || hashPassword.length() == 0 || !loginUIHandler.connect(login, hashPassword)) { ui.launch(login); } } @Override protected void afterAction(ActionEvent e) throws Exception { - MainUIRefreshHelper.refreshConnnectState(getMainUI(), getContext().isConnected(), null); + updateUI(); } + /** + * Rafraichit les uis après un changement de status de connexion de l'utilisateur. + * <p/> + * Si l'utilisateur est déconnecté, alors toutes les ui et actions liées au + * mode remote sont fermées et les actions correspondantes sont rendues + * inaccessibles. + * + */ @Override + public void updateUI() { + SimExplorerMainUI ui = getMainUI(); + + //SwingUtilities.invokeLater(new Runnable() { + // public void run() { + ui.getConnect().setEnabled(false); + ui.getUnconnect().setEnabled(true); + ui.getShowTab_remote().setEnabled(true); + ui.getToggleTab_remote().setEnabled(true); + + JTabbedPane container = ui.getContent(); + DetailTabModel model = (DetailTabModel) SimExplorerTab.detail.getModel(); + JDetailTab tabUI = (JDetailTab) SimExplorerTab.detail.getUI(); + + if (SimExplorerTab.detail.isTabVisible(container)) { + DetailTabRefreshHelper.refreshSynchroniseAction(tabUI, model); + DetailTabRefreshHelper.refreshExportAction(tabUI, model); + } + + if (SimExplorerTab.local.isTabVisible(container)) { + ListTabRefreshHelper.refreshListTablePopupMenu((JListTab) SimExplorerTab.local.getUI(), (ListTabModel) SimExplorerTab.local.getModel()); + } + // } + //}); + } + + @Override protected void clear() { super.clear(); } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DetailToTreeAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DetailToTreeAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DetailToTreeAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -25,8 +25,8 @@ import fr.cemagref.simexplorer.is.ui.swing.JDetailTab; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractTabAction; import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; -import fr.cemagref.simexplorer.is.ui.swing.model.TreeNodeBuilder; +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; +import fr.cemagref.simexplorer.is.ui.swing.EntityTreeNodeHelper; import java.awt.event.ActionEvent; @@ -47,7 +47,7 @@ ) public class DetailToTreeAction extends SimExplorerAbstractTabAction { - LoggableElementTreeNode node; + EntityTreeNode node; LoggableElement element; String uuid; Version version; @@ -75,7 +75,7 @@ protected void doAction(ActionEvent e) throws Exception { model.setRootNode(element); // create navigation tree - LoggableElementTreeNode root = TreeNodeBuilder.build(model.getRootNode(), model.isRemote()); + EntityTreeNode root = EntityTreeNodeHelper.build(model.getRootNode(), model.isRemote()); model.getHistory().add(root); // push it in tree DetailTabRefreshHelper.updateDetailNavigationTree((JDetailTab) getUI(), model.getHistory()); Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExpandAllAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExpandAllAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExpandAllAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -20,9 +20,9 @@ import fr.cemagref.simexplorer.is.ui.swing.JDetailTab; import fr.cemagref.simexplorer.is.ui.swing.JSynchronizeTab; -import fr.cemagref.simexplorer.is.ui.swing.MainUIRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractTabAction; -import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; +import fr.cemagref.simexplorer.is.ui.swing.EntityTreeNodeHelper; import javax.swing.JTree; import java.awt.event.ActionEvent; @@ -46,7 +46,7 @@ private static final long serialVersionUID = 9033359716418852179L; JTree tree; - LoggableElementTreeNode node; + EntityTreeNode node; public ExpandAllAction(String name) { super(name); @@ -74,7 +74,7 @@ return false; } - node = MainUIRefreshHelper.getSelectedNodeOrRootNode(tree); + node = EntityTreeNodeHelper.getSelectedNodeOrRootNode(tree); boolean result; result = !(node == null || node.isLeaf()); return result; Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/HistoryNextAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/HistoryNextAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/HistoryNextAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -18,12 +18,11 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.actions; -import fr.cemagref.simexplorer.is.entities.data.LoggableElement; import fr.cemagref.simexplorer.is.ui.swing.DetailTabRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.JDetailTab; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractTabAction; import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; import java.awt.event.ActionEvent; @@ -58,9 +57,10 @@ @Override protected void doAction(ActionEvent e) throws Exception { - LoggableElementTreeNode node = model.getHistory().gotoNext(); - model.setRemote(node.isRemote()); - model.setRootNode((LoggableElement) node.getUserObject()); + EntityTreeNode node = model.getHistory().gotoNext(); + model.synch(node); + //model.setRemote(node.isRemote()); + //model.setRootNode((LoggableElement) node.getUserObject()); DetailTabRefreshHelper.updateDetailNavigationTree((JDetailTab) getUI(), model.getHistory()); } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/HistoryPreviousAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/HistoryPreviousAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/HistoryPreviousAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -18,12 +18,11 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.actions; -import fr.cemagref.simexplorer.is.entities.data.LoggableElement; import fr.cemagref.simexplorer.is.ui.swing.DetailTabRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.JDetailTab; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractTabAction; import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; import java.awt.event.ActionEvent; @@ -58,9 +57,8 @@ @Override protected void doAction(ActionEvent e) throws Exception { - LoggableElementTreeNode node = model.getHistory().gotoPrevious(); - model.setRemote(node.isRemote()); - model.setRootNode((LoggableElement) node.getUserObject()); + EntityTreeNode node = model.getHistory().gotoPrevious(); + model.synch(node); DetailTabRefreshHelper.updateDetailNavigationTree((JDetailTab) getUI(), model.getHistory()); } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ResetSearchAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ResetSearchAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ResetSearchAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -59,7 +59,8 @@ if (!model.getQuery().hasQuery()) { // directly refresh search actions // but do not realize action - ListTabRefreshHelper.refreshSearchActions(ui,model); + updateUI(); + //ListTabRefreshHelper.refreshSearchActions(ui,model); return false; } // only reset search if something was previously search @@ -87,10 +88,17 @@ modelTab.setData(model.getList()); // refresh ui - ListTabRefreshHelper.refreshListTabUI(container, model); + //ListTabRefreshHelper.refreshListTabUI(container, model); } @Override + public void updateUI() { + super.updateUI(); + // refresh ui + getTab().updateUI(); + } + + @Override protected void clear() { super.clear(); setTab(null); Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/SearchAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/SearchAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/SearchAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -79,10 +79,17 @@ modelTab.setData(model.getList()); // refresh ui - ListTabRefreshHelper.refreshListTabUI(container, model); + //ListTabRefreshHelper.refreshListTabUI(container, model); } @Override + public void updateUI() { + super.updateUI(); + // refresh ui + getTab().updateUI(); + } + + @Override protected void clear() { super.clear(); query = null; Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowDetailTabAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowDetailTabAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowDetailTabAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -23,13 +23,13 @@ import fr.cemagref.simexplorer.is.entities.metadata.Version; import fr.cemagref.simexplorer.is.ui.StorageServiceHelper; import fr.cemagref.simexplorer.is.ui.swing.DetailTabRefreshHelper; +import fr.cemagref.simexplorer.is.ui.swing.EntityTreeNodeHelper; import fr.cemagref.simexplorer.is.ui.swing.JDetailTab; -import fr.cemagref.simexplorer.is.ui.swing.MainUIRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerTab; import fr.cemagref.simexplorer.is.ui.swing.actions.util.ShowTabAbstractAction; +import fr.cemagref.simexplorer.is.ui.swing.model.DataEntityModel; import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; -import fr.cemagref.simexplorer.is.ui.swing.model.TreeNodeBuilder; +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; import javax.swing.DefaultComboBoxModel; import javax.swing.event.ListSelectionEvent; @@ -62,22 +62,17 @@ hideActionText = false ) public class ShowDetailTabAction extends ShowTabAbstractAction<JDetailTab, DetailTabModel> { + /** la donnée à afficher dans l'onglet de détail */ + protected DataEntityModel selected; + /** le listener de navigation dans l'arbre */ + protected NavigationSelectionListener navigationListener; + /** le listener de navigation dans les versions */ + protected VersionSelectionListener versionListener; + /** le listener de navigation dans les fichiers attachés */ + protected AttachmentSelectionListener attachmentListener; - /** flag pour indiquer si la source vient de la base locale ou distante */ - protected Boolean remote; - /** l'uuid de l'éléement dont on veut voir les details */ - protected String uuid; - /** la version de l'élément dont on veut voir les details */ - protected Version version; - private static final long serialVersionUID = 6643631041114311643L; - NavigationSelectionListener navigationListener; - - VersionSelectionListener versionListener; - - AttachmentSelectionListener attachmentListener; - public ShowDetailTabAction(String name) { super(name); navigationListener = new NavigationSelectionListener(); @@ -93,29 +88,24 @@ // préparation du modèle de détail DetailTabModel detailModel = (DetailTabModel) SimExplorerTab.detail.getModel(); + + // synchronisation de l'élément sélectionné + detailModel.setSelectedItem(selected); + // chargement de l'élément à partir du service - LoggableElement element = StorageServiceHelper.getElement(getContext(), remote, uuid, version.toString()); - // on supprime les anciennes données du modèle - detailModel.reset(); - // positionnement du type de détail (local ou remote) - detailModel.setRemote(remote); + // délégué au model de selection + LoggableElement element = (LoggableElement) detailModel.getSelectedItem().get(getContext()); + // positionnement du rootNode du modèle detailModel.setRootNode(element); - return element!=null; - } - public void setRemote(Boolean remote) { - this.remote = remote; + return element != null; } - public void setUuid(String uuid) { - this.uuid = uuid; + public void setSelected(DataEntityModel selected) { + this.selected = selected; } - public void setVersion(Version version) { - this.version = version; - } - protected void initFirstUsage(final JDetailTab ui, final DetailTabModel model) { // add a listener on navigation tree ui.getNavigationTree().addTreeSelectionListener(navigationListener); @@ -125,21 +115,10 @@ ui.getDetailAttachments().addListSelectionListener(attachmentListener); } - protected void initUI(JDetailTab ui, DetailTabModel model) { - DetailTabRefreshHelper.refreshTreeDetailActions(ui, null); - // create navigation tree - LoggableElementTreeNode root = TreeNodeBuilder.build(model.getRootNode(), model.isRemote()); - model.getHistory().add(root); - DetailTabRefreshHelper.updateDetailNavigationTree(ui, model.getHistory()); - } - @Override protected void clear() { super.clear(); - uuid=null; - version=null; - remote=null; - //setTab(null); + selected = null; } /** @@ -157,16 +136,11 @@ DetailTabModel model = getTabModel(); TreePath path = e.getNewLeadSelectionPath(); - LoggableElementTreeNode node = null; + EntityTreeNode node = null; if (path != null) { - node = (LoggableElementTreeNode) path.getLastPathComponent(); + node = (EntityTreeNode) path.getLastPathComponent(); } - //TODO on ne doit pas modifier les ui dans cette méthode - // on rafraichit toujours ici les actions de l'arbre qui sont - // indépendantes du model et dépendent juste dunoeud sélectionné - DetailTabRefreshHelper.refreshTreeDetailActions(getTabUI(), node); - Object o = node == null ? null : node.getUserObject(); // always reset version index, in that way, if there is no more // version list, nothing will be trigger by setting selectedVersion // null, it means also that we have to reset detail always from this @@ -175,7 +149,7 @@ model.resetSelectedVersion(); // update history list - LoggableElement element = node == null || !(node.getUserObject() instanceof LoggableElement) ? null : ((LoggableElement) node.getUserObject()); + LoggableElement element = node == null ? null : node.getLoggableElement(); boolean history = element != null; Version selectedVersion; Integer selectedAttachment; @@ -194,13 +168,18 @@ model.setDetail(element == null ? null : element.getMetaData()); // le node est acceptable uniquement si c'est un loggableElement - model.setSelectedNode((LoggableElement) (o instanceof LoggableElement ? o : null)); + model.setSelectedNode(element); // on positionne la version selectionnee model.setSelectedVersion(selectedVersion); // on positionne l'attachment selectionne model.setSelectedAttachmentIndex(selectedAttachment); + + //TODO on ne doit pas modifier les ui dans cette méthode + // on rafraichit toujours ici les actions de l'arbre qui sont + // indépendantes du model et dépendent juste du noeud sélectionné + DetailTabRefreshHelper.refreshTreeDetailActions(getTabUI(), node); } /** @@ -211,7 +190,9 @@ * @param evt event coming from DetailTabModel */ public void propertyChange(PropertyChangeEvent evt) { - log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + if (log.isDebugEnabled()) { + log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + } JDetailTab ui = getTabUI(); DetailTabModel model = getTabModel(); DefaultComboBoxModel historyModel = (DefaultComboBoxModel) ui.getDetailVersions().getModel(); @@ -227,10 +208,10 @@ versionListener.setEnabled(wasEnable); attachmentListener.setEnabled(wasEnable2); // update actions on toolbar - LoggableElementTreeNode node = MainUIRefreshHelper.getSelectedNode(ui.getNavigationTree()); + EntityTreeNode node = EntityTreeNodeHelper.getSelectedNode(ui.getNavigationTree()); DetailTabRefreshHelper.refreshDetailActions(ui, model, node); - LoggableElementTreeNode rootNode = MainUIRefreshHelper.getRootNode(ui.getNavigationTree()); + EntityTreeNode rootNode = EntityTreeNodeHelper.getRootNode(ui.getNavigationTree()); if (model.getDetail() != null && !node.equals(rootNode)) { // refresh detail to tree button only if required DetailTabRefreshHelper.refreshDetailToTreeAction(ui, model); @@ -254,15 +235,16 @@ JDetailTab ui = getTabUI(); DetailTabModel model = getTabModel(); - MetaData metas; - //int selectedVersionIndex = ui.getDetailVersions().getSelectedIndex(); + MetaData metas; Object selectedItem = ui.getDetailVersions().getSelectedItem(); if (selectedItem == null) { throw new NullPointerException("can not have a selectedItem null"); } Integer selectedAttachment; Version selectedVersion = Version.valueOf(selectedItem.toString()); - log.debug("selected version (" + selectedVersion + ") " + selectedItem); + if (log.isDebugEnabled()) { + log.debug("selected version (" + selectedVersion + ") " + selectedItem); + } metas = StorageServiceHelper.getMetaData( getContext(), model.isRemote(), @@ -292,7 +274,9 @@ * @param evt property changed event */ public void propertyChange(PropertyChangeEvent evt) { - log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + if (log.isDebugEnabled()) { + log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + } Integer index = (Integer) evt.getNewValue(); JDetailTab ui = getTabUI(); DetailTabModel model = getTabModel(); @@ -314,7 +298,7 @@ attachmentListener.setEnabled(wasEnable2); ui.getDetailAttachments().setSelectedIndex(0); // update actions on toolbar - LoggableElementTreeNode node = MainUIRefreshHelper.getSelectedNodeOrRootNode(ui.getNavigationTree()); + EntityTreeNode node = EntityTreeNodeHelper.getSelectedNodeOrRootNode(ui.getNavigationTree()); DetailTabRefreshHelper.refreshDetailActions(ui, model, node); } @@ -348,7 +332,9 @@ throw new NullPointerException("can not have a attachment null"); } Attachment attachment = (Attachment) selectedItem; - log.debug("selected attachment (" + attachment + ") " + selectedItem); + if (log.isDebugEnabled()) { + log.debug("selected attachment (" + attachment + ") " + selectedItem); + } // finally change selectedIndex model.setSelectedAttachmentIndex(ui.getDetailAttachments().getSelectedIndex()); @@ -362,7 +348,9 @@ * @param evt property changed event */ public void propertyChange(PropertyChangeEvent evt) { - log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + if (log.isDebugEnabled()) { + log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + } JDetailTab ui = getTabUI(); DetailTabModel model = getTabModel(); boolean wasEnable = isEnabled(); Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowSynchronizeTabAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowSynchronizeTabAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowSynchronizeTabAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -21,16 +21,21 @@ import fr.cemagref.simexplorer.is.entities.data.LoggableElement; import fr.cemagref.simexplorer.is.entities.metadata.Version; import fr.cemagref.simexplorer.is.ui.StorageServiceHelper; +import fr.cemagref.simexplorer.is.ui.swing.EntityTreeNodeHelper; import fr.cemagref.simexplorer.is.ui.swing.JSynchronizeTab; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerTab; import fr.cemagref.simexplorer.is.ui.swing.SynchronizeTabRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.actions.util.ShowTabAbstractAction; +import fr.cemagref.simexplorer.is.ui.swing.model.DataEntityModel; import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; import fr.cemagref.simexplorer.is.ui.swing.model.SynchronizeTabModel; +import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; @@ -52,12 +57,8 @@ ) public class ShowSynchronizeTabAction extends ShowTabAbstractAction<JSynchronizeTab, SynchronizeTabModel> { - /** flag pour indiquer si la source vient de la base locale ou distante */ - protected Boolean remote; - /** l'uuid de l'éléement que l'on veut synchroniser */ - protected String uuid; - /** la version de l'élément que l'on veut synchroniser */ - protected Version version; + protected DataEntityModel selected; + private static final long serialVersionUID = -3901398502496915785L; protected TreeSelectionListener navigationLocalListener; @@ -70,24 +71,16 @@ navigationRemoteListener = new NavigationRemoteSelectionListener(); } - public void setRemote(Boolean remote) { - this.remote = remote; + public void setSelected(DataEntityModel selected) { + this.selected = selected; } - public void setUuid(String uuid) { - this.uuid = uuid; - } - - public void setVersion(Version version) { - this.version = version; - } - @Override protected boolean beforeAction(ActionEvent e) throws Exception { if (!super.beforeAction(e)) { return false; } - if (remote == null || uuid == null || version == null) { + if (selected == null) { // trick : quand c'est null, cela veut dire que l'on vient de // l'onglet de detail, car dans les onglets de list, l'action est // toujours initialisée avant d'arriver ici, alors que dans le cas @@ -97,35 +90,47 @@ // l'onglet de detail, on a pas de moyen simple de reinitialiser cette // action, donc on ne l'initialise jamais d'avance dans ce cas. DetailTabModel model = (DetailTabModel) SimExplorerTab.detail.getModel(); - if (model.getDetail() != null) { - setRemote(model.isRemote()); - setUuid(model.getDetail().getUuid()); - setVersion(model.getDetail().getVersion()); - } + + selected = model.getSelectedItem(); + } - if (remote == null || uuid == null || version == null) { - // on restete l'accessibilite de l'action + if (selected == null) { + // on restete l'accessibilite de l'action return false; } - LoggableElement source = StorageServiceHelper.getElement(getContext(), remote, uuid, version.toString()); + boolean remote = selected.isRemote(); + String uuid = selected.getUuid(); + // preparation du model de l'onglet + SynchronizeTabModel model = (SynchronizeTabModel) SimExplorerTab.synchronize.getModel(); + + // l'élément selectionné est bien la source + model.setSelectedItem(selected); + + DataEntityModel save = model.getSelectedItem(); + LoggableElement source = save.getLe(getContext()); + + model.setSelectedItem(null); LoggableElement destination; // recuperation des versions de l'element destination Version[] versions = StorageServiceHelper.getVersions(getContext(), !remote, uuid); - if (versions.length == 0) { - destination = null; - } else { + Version requiredVersion = null; + if (versions.length != 0) { // on prend la dernière version disponible dans la base - destination = StorageServiceHelper.getElement(getContext(), !remote, uuid, versions[versions.length - 1].toString()); + requiredVersion = versions[versions.length - 1]; + //destination = StorageServiceHelper.getElement(getContext(), !remote, uuid, requiredVersion.toString()); } - // preparation du model de l'onglet - SynchronizeTabModel model = (SynchronizeTabModel) SimExplorerTab.synchronize.getModel(); - model.setRemote(remote); + model.synch(!remote, uuid, requiredVersion); + + destination = model.getSelectedItem().getLe(getContext()); + + // sauvegarde de la source model.setSource(source); + // sauvegarde de la destination model.setDestination(destination); - model.resetSelectedNodes(); + model.setSelectedItem(save); return true; } @@ -135,21 +140,10 @@ ui.getContentTreeRemote().addTreeSelectionListener(navigationRemoteListener); } - protected void initUI(JSynchronizeTab ui, SynchronizeTabModel model) { - SynchronizeTabRefreshHelper.refreshTreeLocalActions(ui, null); - SynchronizeTabRefreshHelper.refreshTreeRemoteActions(ui, null); - SynchronizeTabRefreshHelper.refreshExportElementToLocalAction(ui, model); - SynchronizeTabRefreshHelper.refreshExportElementToRemoteAction(ui, model); - - SynchronizeTabRefreshHelper.updateSynchronizeNavigationTrees(ui, model); - } - @Override protected void clear() { super.clear(); - remote = null; - uuid = null; - version = null; + selected = null; } /** @@ -167,9 +161,9 @@ SynchronizeTabModel model = getTabModel(); TreePath path = e.getNewLeadSelectionPath(); - LoggableElementTreeNode node = null; + EntityTreeNode node = null; if (path != null) { - node = (LoggableElementTreeNode) path.getLastPathComponent(); + node = (EntityTreeNode) path.getLastPathComponent(); } // on rafraichit toujours ici les actions de l'arbre qui sont // indépendantes du model et dépendent juste dunoeud sélectionné @@ -212,9 +206,9 @@ SynchronizeTabModel model = getTabModel(); TreePath path = e.getNewLeadSelectionPath(); - LoggableElementTreeNode node = null; + EntityTreeNode node = null; if (path != null) { - node = (LoggableElementTreeNode) path.getLastPathComponent(); + node = (EntityTreeNode) path.getLastPathComponent(); } // on rafraichit toujours ici les actions de l'arbre qui sont // indépendantes du model et dépendent juste dunoeud sélectionné Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/UnconnectAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/UnconnectAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/UnconnectAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -18,13 +18,19 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.actions; +import fr.cemagref.simexplorer.is.ui.swing.DetailTabRefreshHelper; +import fr.cemagref.simexplorer.is.ui.swing.JDetailTab; +import fr.cemagref.simexplorer.is.ui.swing.JListTab; +import fr.cemagref.simexplorer.is.ui.swing.ListTabRefreshHelper; +import fr.cemagref.simexplorer.is.ui.swing.SimExplorerMainUI; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerTab; -import fr.cemagref.simexplorer.is.ui.swing.MainUIRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractAction; import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; import fr.cemagref.simexplorer.is.ui.swing.model.HistoryModel; -import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; +import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; +import javax.swing.JTabbedPane; import java.awt.event.ActionEvent; import java.util.Iterator; import java.util.List; @@ -46,7 +52,7 @@ ) public class UnconnectAction extends SimExplorerAbstractAction { - HistoryModel<LoggableElementTreeNode> history; + HistoryModel<EntityTreeNode> history; private static final long serialVersionUID = 2248642521834932196L; @@ -72,10 +78,10 @@ // nothing to do return; } - LoggableElementTreeNode current = history.getCurrent(); + EntityTreeNode current = history.getCurrent(); - List<LoggableElementTreeNode> datas = history.getData(); - for (Iterator<LoggableElementTreeNode> it = datas.iterator(); it.hasNext();) + List<EntityTreeNode> datas = history.getData(); + for (Iterator<EntityTreeNode> it = datas.iterator(); it.hasNext();) { if (it.next().isRemote()) { it.remove(); @@ -100,10 +106,68 @@ @Override protected void afterAction(ActionEvent e) throws Exception { - MainUIRefreshHelper.refreshConnnectState(getMainUI(), false, history); + updateUI(); } + /** + * Rafraichit les uis après un changement de status de connexion de l'utilisateur. + * <p/> + * Si l'utilisateur est déconnecté, alors toutes les ui et actions liées au + * mode remote sont fermées et les actions correspondantes sont rendues + * inaccessibles. + */ @Override + public void updateUI() { + SimExplorerMainUI ui = getMainUI(); + + //SwingUtilities.invokeLater(new Runnable() { + // public void run() { + ui.getConnect().setEnabled(true); + ui.getUnconnect().setEnabled(false); + ui.getShowTab_remote().setEnabled(false); + ui.getToggleTab_remote().setEnabled(false); + + JTabbedPane container = ui.getContent(); + DetailTabModel model = (DetailTabModel) SimExplorerTab.detail.getModel(); + JDetailTab tabUI = (JDetailTab) SimExplorerTab.detail.getUI(); + + // close all connected ui + + if (SimExplorerTab.remote.isTabVisible(container)) { + // close tab + SimExplorerTab.remote.closeTab(container); + } + if (SimExplorerTab.synchronize.isTabVisible(container)) { + // close tab + SimExplorerTab.synchronize.closeTab(container); + } + if (SimExplorerTab.detail.isTabVisible(container) && history != null) { + if (history.isEmpty()) { + // close tab, no more history + SimExplorerTab.detail.closeTab(container); + } else { + // select current history element + EntityTreeNode node = history.getCurrent(); + model.synch(node); + //model.setRemote(node.isRemote()); + //model.setRootNode((LoggableElement) node.getUserObject()); + DetailTabRefreshHelper.updateDetailNavigationTree(tabUI, model.getHistory()); + } + } + + if (SimExplorerTab.detail.isTabVisible(container)) { + DetailTabRefreshHelper.refreshSynchroniseAction(tabUI, model); + DetailTabRefreshHelper.refreshExportAction(tabUI, model); + } + + if (SimExplorerTab.local.isTabVisible(container)) { + ListTabRefreshHelper.refreshListTablePopupMenu((JListTab) SimExplorerTab.local.getUI(), (ListTabModel) SimExplorerTab.local.getModel()); + } + // } + //}); + } + + @Override protected void clear() { super.clear(); history = null; Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowListTabAbstractAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowListTabAbstractAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowListTabAbstractAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -19,13 +19,13 @@ package fr.cemagref.simexplorer.is.ui.swing.actions.util; import fr.cemagref.simexplorer.is.entities.metadata.MetaData; -import fr.cemagref.simexplorer.is.entities.metadata.Version; import fr.cemagref.simexplorer.is.exceptions.SimExplorerRuntimeException; import fr.cemagref.simexplorer.is.ui.swing.JListTab; import fr.cemagref.simexplorer.is.ui.swing.ListTabRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerActionManager; import fr.cemagref.simexplorer.is.ui.swing.actions.ShowDetailTabAction; import fr.cemagref.simexplorer.is.ui.swing.actions.ShowSynchronizeTabAction; +import fr.cemagref.simexplorer.is.ui.swing.model.DataEntityModel; import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; import fr.cemagref.simexplorer.is.ui.swing.model.ListTableModel; import jaxx.runtime.swing.JAXXTab; @@ -33,8 +33,10 @@ import javax.swing.AbstractButton; import javax.swing.JTabbedPane; +import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; @@ -51,6 +53,11 @@ /** l'action d'affichage de l'onglet de détail */ ShowDetailTabAction detailAction; + /** l'action d'affichage de l'onglet synchronisation */ + ShowSynchronizeTabAction synchronizeAction; + + ListMetaSelectionListener listMetaSelectionListener; + public ShowListTabAbstractAction(String name, boolean remote) { super(name); this.remote = remote; @@ -81,6 +88,8 @@ protected void initFirstUsage(final JListTab ui, final ListTabModel model) { detailAction = (ShowDetailTabAction) SimExplorerActionManager.newAction("showTab_detail", (AbstractButton) null); + synchronizeAction = (ShowSynchronizeTabAction) SimExplorerActionManager.newAction("showTab_synchronize", (AbstractButton) null); + ui.getShowTab_synchronize().setHideActionText(false); ui.getExportElement().setHideActionText(false); ui.getDownloadElement().setHideActionText(false); @@ -89,18 +98,11 @@ ui.getImportElement().setEnabled(true); ui.getImportElement().getAction().setEnabled(true); ui.getImportElement().setToolTipText(model.isRemote() ? _("simexplorer.action.import.remote.tooltip") : _("simexplorer.action.import.local.tooltip")); - ui.getTable().getSelectionModel().addListSelectionListener(new ListSelectionListener() { - public void valueChanged(ListSelectionEvent e) { - int index = ui.getTable().getSelectedRow(); - model.setSelectedIndex(index); - ListTabRefreshHelper.refreshListTablePopupMenu(ui, model); - } - }); - // add a show detail action when double click on a row of the table - ui.getTable().addMouseListener(new MouseAdapter() { + listMetaSelectionListener = new ListMetaSelectionListener(ui, model); + ui.getTable().getSelectionModel().addListSelectionListener(listMetaSelectionListener); - ShowSynchronizeTabAction synchronizeAction = (ShowSynchronizeTabAction) SimExplorerActionManager.newAction("showTab_synchronize", (AbstractButton) null); + ui.getTable().addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { @@ -118,10 +120,8 @@ public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { try { - // récupération du metadata sélectionné - MetaData data = model.get(ui.getTable().getSelectedRow()); - prepareDetailModel(data); - + // synchronization du meta selectionne + synchSelected(ui, getRowAtPoint(ui, e.getPoint()), ui.getTable().getSelectionModel(), model); // lancement de l'action d'affichage du tab detailAction.actionPerformed(new ActionEvent(e.getSource(), ActionEvent.ACTION_FIRST, "showTab_detail")); } catch (Exception e1) { @@ -131,19 +131,10 @@ } protected void initPopup(MouseEvent e) { - int row = ui.getTable().rowAtPoint(e.getPoint()); - if (e.isPopupTrigger() && ui.getTablePopupMenu().isEnabled() && row == model.getSelectedIndex()) { - // récupération du metadata sélectionné - MetaData data = model.get(ui.getTable().getSelectedRow()); - if (data == null) { - // selected the row - - return; - } - prepareDetailModel(data); - synchronizeAction.setRemote(isRemote()); - synchronizeAction.setUuid(data.getUuid()); - synchronizeAction.setVersion(data.getVersion()); + if (e.isPopupTrigger()) { + // synchronization du meta selectionne + synchSelected(ui, getRowAtPoint(ui, e.getPoint()), ui.getTable().getSelectionModel(), model); + // affichage de la popup ui.getTablePopupMenu().show(ui.getTable(), e.getX(), e.getY()); } } @@ -153,27 +144,66 @@ ui.getSearchText().addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { + // rafraichissement des actions de recherche ListTabRefreshHelper.refreshSearchActions(ui, model); } }); + //TODO Est-ce vraiment le bon endroit pour faire ça ? // push model into tableModel ListTableModel modelTab = (ListTableModel) ui.getTable().getModel(); modelTab.setData(model.getList()); + // on force les valeurs nulles + model.setSelectedIndex(-1); + model.setSelectedItem(null); } - protected void prepareDetailModel(MetaData data) { - // récupération de l'uuid à afficher - String uuid = data.getUuid(); - // récupération de la version à afficher - Version version = data.getVersion(); - detailAction.setRemote(isRemote()); - detailAction.setUuid(data.getUuid()); - detailAction.setVersion(data.getVersion()); - log.info("prepare detail - uuid:" + uuid + ", version:" + version + " (remote ?" + remote + ")"); + protected void synchSelected(final JListTab ui, int rowAtPoint, ListSelectionModel selectionModel, ListTabModel model) { + DataEntityModel entityModel; + if (rowAtPoint == -1 || model.getSelectedIndex() != rowAtPoint || selectionModel.isSelectionEmpty() || selectionModel.getMinSelectionIndex() != rowAtPoint) { + if (rowAtPoint == -1) { + rowAtPoint = 0; + } + if (ui.getTable().getSelectedRow() != rowAtPoint) { + // select the row + boolean wasEnabled =listMetaSelectionListener.enabled; + listMetaSelectionListener.enabled=false; + selectionModel.setSelectionInterval(rowAtPoint, rowAtPoint); + listMetaSelectionListener.enabled=wasEnabled; + } + // the model is not yet ready + model.setSelectedIndex(rowAtPoint); + + model.synch(model.isRemote(), model.get(rowAtPoint)); + + entityModel = model.getSelectedItem(); + log.info("synch: " + entityModel); + ListTabRefreshHelper.refreshListTablePopupMenu(ui, model); + } + entityModel = model.getSelectedItem(); + detailAction.setSelected(entityModel); + synchronizeAction.setSelected(entityModel); } - protected void initUI(JListTab ui, ListTabModel model) { - ListTabRefreshHelper.refreshListTabUI(ui, model); + protected int getRowAtPoint(JListTab ui, Point e) { + return ui.getTable().rowAtPoint(e); } + + private class ListMetaSelectionListener implements ListSelectionListener { + boolean enabled; + private final JListTab ui; + private final ListTabModel model; + + public ListMetaSelectionListener(JListTab ui, ListTabModel model) { + this.ui = ui; + this.model = model; + enabled = true; + } + + public void valueChanged(ListSelectionEvent e) { + if (enabled) { + synchSelected(ui, ui.getTable().getSelectedRow(), ui.getTable().getSelectionModel(), model); + } + } + } } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowTabAbstractAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowTabAbstractAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowTabAbstractAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -18,8 +18,8 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.actions.util; -import jaxx.runtime.JAXXObject; -import jaxx.runtime.builder.TabModel; +import fr.cemagref.simexplorer.is.ui.swing.model.SimExplorerTabModel; +import jaxx.runtime.swing.JAXXTab; import java.awt.event.ActionEvent; @@ -28,19 +28,16 @@ * * @author chemit */ -public abstract class ShowTabAbstractAction<U extends JAXXObject, M extends TabModel> extends SimExplorerAbstractTabAction { +public abstract class ShowTabAbstractAction<U extends JAXXTab, M extends SimExplorerTabModel> extends SimExplorerAbstractTabAction { /** - * Methode utilisée lors du premier - * @param ui l'ui de l'onglet + * Methode utilisée lors du premier + * + * @param ui l'ui de l'onglet * @param model le model de l'onglet */ protected abstract void initFirstUsage(U ui, M model); - protected abstract void initUI(U ui, M model); - - /** - * flag pour indiquer s'il s'agit de la premier init de l'onglet. - */ + /** flag pour indiquer s'il s'agit de la premier init de l'onglet. */ protected Boolean firstTime; @@ -50,7 +47,6 @@ super(name, "showTab"); } - @Override protected boolean beforeAction(ActionEvent e) throws Exception { @@ -66,15 +62,18 @@ } @Override - protected void afterAction(ActionEvent e) throws Exception { - super.afterAction(e); + public void updateUI() { U ui = getTabUI(); M model = getTabModel(); - if (firstTime) { + if (isFirstTime()) { initFirstUsage(ui, model); } - initUI(ui, model); + updateUI(ui, model); + } + protected void updateUI(U ui, M model) { + // refresh ui + getTab().updateUI(ui, model); } @Override @@ -93,4 +92,7 @@ return (M) getModel(); } + public boolean isFirstTime() { + return firstTime != null && firstTime; + } } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -99,9 +99,13 @@ } protected void afterAction(ActionEvent e) throws Exception { + updateUI(); + } + + public void updateUI() { // nothing by default } - + protected void clear() { // nothing by default } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractTabAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractTabAction.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractTabAction.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -19,9 +19,9 @@ package fr.cemagref.simexplorer.is.ui.swing.actions.util; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerTab; -import jaxx.runtime.swing.JAXXTab; import jaxx.runtime.JAXXObject; import jaxx.runtime.builder.TabModel; +import jaxx.runtime.swing.JAXXTab; import org.apache.commons.beanutils.Converter; import org.codelutin.i18n.I18n; import org.codelutin.util.ConverterUtil; Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/DetailTabModel.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/DetailTabModel.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/DetailTabModel.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -78,7 +78,7 @@ */ protected MetaData detail; - protected HistoryModel<LoggableElementTreeNode> history; + protected HistoryModel<EntityTreeNode> history; public LoggableElement getRootNode() { return rootNode; @@ -112,9 +112,9 @@ return detail; } - public HistoryModel<LoggableElementTreeNode> getHistory() { + public HistoryModel<EntityTreeNode> getHistory() { if (history == null) { - history = new HistoryModel<LoggableElementTreeNode>(HISTORY_CAPACITY); + history = new HistoryModel<EntityTreeNode>(HISTORY_CAPACITY); } return history; } @@ -168,6 +168,7 @@ public void setDetail(MetaData detail) { this.detail = detail; + synch(isRemote(),detail); } public void reset() { @@ -187,5 +188,4 @@ selectedVersionIndex = null; selectedAttachmentIndex = null; } - } \ No newline at end of file Copied: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/EntityTreeNode.java (from rev 1038, trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/LoggableElementTreeNode.java) =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/EntityTreeNode.java (rev 0) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/EntityTreeNode.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -0,0 +1,123 @@ +/* +* ##% Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Code Lutin, +* Tony Chemit, Gabriel Landais +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* 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 Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* ##% */ +package fr.cemagref.simexplorer.is.ui.swing.model; + +import fr.cemagref.simexplorer.is.entities.data.Library; +import fr.cemagref.simexplorer.is.entities.data.LoggableElement; +import fr.cemagref.simexplorer.is.entities.data.Result; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.swing.JTree; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.TreePath; + +/** + * Le TreeNode de base pour afficher des Entities dans un arbre. + * <p/> + * <b>Attention, l'objet interne au node n'est pas forcement un LoggableElement, + * par exemple pour le noeud 'Components' qui sera un simple String.</b> + * + * @author chemit + */ +public class EntityTreeNode extends DefaultMutableTreeNode { + + static protected Log log = LogFactory.getLog(EntityTreeNode.class); + + private static final long serialVersionUID = -7544097600554338499L; + + protected String text; + + protected boolean remote; + + public EntityTreeNode(EntityTreeNode parent, Object userObject, boolean remote, boolean allowedChildren) { + this(parent, userObject.toString(), userObject, remote, allowedChildren); + } + + public EntityTreeNode(EntityTreeNode parent, String i18n, Object userObject, boolean remote, boolean allowedChildren) { + super(userObject, allowedChildren); + if (parent != null) { + parent.add(this); + } + text = i18n; + this.remote = remote; + log.debug("Parent " + parent + ", userObject : " + userObject + ", type : " + userObject.getClass().getSimpleName()); + } + + public Object get() { + LoggableElement le = getLoggableElement(); + if (le!=null) { + return le; + } + if (isResult()) { + return getUserObject(); + } + return null; + } + + public LoggableElement getLoggableElement() { + Object userObject = getUserObject(); + if (userObject instanceof LoggableElement) { + return (LoggableElement) userObject; + } + return null; + } + + public boolean isResult() { + return getLoggableElement() == null && getUserObject() instanceof Result; + } + + @Override + public String toString() { + return text; + } + + public boolean isRemote() { + return remote; + } + + public void collaspeAll(JTree tree) { + if (isLeaf()) { + return; + } + for (Object child : children) { + ((EntityTreeNode) child).collaspeAll(tree); + } + tree.collapsePath(new TreePath(getPath())); + } + + public void expandAll(JTree tree) { + if (isLeaf()) { + return; + } + tree.expandPath(new TreePath(getPath())); + for (Object child : children) { + ((EntityTreeNode) child).expandAll(tree); + } + } + + public boolean isLoggableElement() { + return userObject != null && userObject instanceof LoggableElement; + } + + public boolean isDownloadableElement() { + return userObject != null && (userObject instanceof Result || userObject instanceof Library); + } + +} Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/ListTabModel.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/ListTabModel.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/ListTabModel.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -110,7 +110,7 @@ public void initTabModel(SimExplorerContext context, boolean remote) throws Exception { // first local query, build model - setRemote(remote); + synch(remote,null,null); updateTabModel(context, remote); } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/SimExplorerTabModel.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/SimExplorerTabModel.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/SimExplorerTabModel.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -17,6 +17,10 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.model; +import fr.cemagref.simexplorer.is.entities.EntityHelper; +import fr.cemagref.simexplorer.is.entities.data.LoggableElement; +import fr.cemagref.simexplorer.is.entities.metadata.MetaData; +import fr.cemagref.simexplorer.is.entities.metadata.Version; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerTab; import jaxx.runtime.builder.TabModel; @@ -35,6 +39,9 @@ /** l'onglet associé au model */ protected SimExplorerTab tab; + /** le dernier élément sélectionné dans l'onglet */ + protected DataEntityModel selectedItem; + /** flag pour savoir si la source est remote ou non */ protected Boolean remote; @@ -51,16 +58,68 @@ return remote; } + public void synch(EntityTreeNode node) { + if (node == null) { + synch(remote, null, null); + return; + } + LoggableElement selectedElement; + if (node.isResult()) { + EntityTreeNode parent = (EntityTreeNode) node.getParent(); + selectedElement = parent.getLoggableElement(); + synch(node.isRemote(), selectedElement); + getSelectedItem().setType(EntityHelper.Type.Result); + } else { + selectedElement = node.getLoggableElement(); + synch(node.isRemote(), selectedElement); + } + } + + public void synch(boolean remote, LoggableElement selectedElement) { + if (selectedElement == null) { + synch(remote, null, null); + return; + } + synch(remote, selectedElement.getMetaData()); + getSelectedItem().setLe(selectedElement); + } + + public void synch(boolean remote, MetaData selectedMeta) { + if (selectedMeta == null) { + synch(remote, null, null); + return; + } + synch(remote, selectedMeta.getUuid(), selectedMeta.getVersion()); + getSelectedItem().setMeta(selectedMeta); + } + + public void synch(boolean remote, String uuid, Version version) { + this.remote = remote; + getSelectedItem().synch(remote, uuid, version); + } + + public DataEntityModel getSelectedItem() { + if (selectedItem == null) { + selectedItem = new DataEntityModel(); + //selectedItem.setRemote(remote); + } + return selectedItem; + } + public void setName(String name) { this.tab = SimExplorerTab.valueOf(name); } - public void setRemote(boolean remote) { - this.remote = remote; + public void setSelectedItem(DataEntityModel selectedItem) { + this.selectedItem = selectedItem; + if (selectedItem != null) { + remote = selectedItem.isRemote(); + } } public void reset() { remote = null; + selectedItem = null; } public synchronized void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/SynchronizeTabModel.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/SynchronizeTabModel.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/SynchronizeTabModel.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -62,7 +62,7 @@ } public void setSource(LoggableElement source) { - this.source = source; + this.source = source; } public void setDestination(LoggableElement destination) { @@ -81,13 +81,10 @@ firePropertyChange(SELECTED_REMOTE_NODE_PROPERTY_CHANGED, oldSelectedNode, remoteSelectedNode); } - public void resetSelectedNodes() { - localSelectedNode = remoteSelectedNode = null; - } - public void reset() { super.reset(); - resetSelectedNodes(); + localSelectedNode = remoteSelectedNode = null; source = destination = null; } + } \ No newline at end of file Deleted: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/TreeNodeBuilder.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/TreeNodeBuilder.java 2008-02-17 15:53:04 UTC (rev 1040) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/TreeNodeBuilder.java 2008-02-17 15:53:30 UTC (rev 1041) @@ -1,280 +0,0 @@ -/* -* ##% Copyright (C) 2007, 2008 Code Lutin, -* Tony Chemit, Gabriel Landais -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* 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 Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -* ##% */ -package fr.cemagref.simexplorer.is.ui.swing.model; - -import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.Code; -import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.Component; -import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.Constant; -import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.ConstantValue; -import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.ExplorationData; -import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.Library; -import static fr.cemagref.simexplorer.is.entities.EntityHelper.Type.Structure; -import fr.cemagref.simexplorer.is.entities.EntityVisitable; -import fr.cemagref.simexplorer.is.entities.SimpleEntityVisitor; -import fr.cemagref.simexplorer.is.entities.metadata.MetaData; -import fr.cemagref.simexplorer.is.entities.data.Code; -import fr.cemagref.simexplorer.is.entities.data.Component; -import fr.cemagref.simexplorer.is.entities.data.Constant; -import fr.cemagref.simexplorer.is.entities.data.ConstantValue; -import fr.cemagref.simexplorer.is.entities.data.ExplorationApplication; -import fr.cemagref.simexplorer.is.entities.data.ExplorationData; -import fr.cemagref.simexplorer.is.entities.data.Library; -import fr.cemagref.simexplorer.is.entities.data.LoggableElement; -import fr.cemagref.simexplorer.is.entities.data.Result; -import fr.cemagref.simexplorer.is.entities.data.Structure; - -import java.util.Collection; - -/** - * La classe responsable de la création des arbres de {@link LoggableElementTreeNode} - * à partir de {@link LoggableElement} . - * <p/> - * La classe possède une instance cachée par thread qui délègue la construction - * del'arbre de navigation à un visiteur de {@link LoggableElement}. - * <p/> - * - * @author chemit - */ -public class TreeNodeBuilder extends SimpleEntityVisitor { - - /** L'instance cachée par Thread. */ - protected static final ThreadLocal<TreeNodeBuilder> instance = - new ThreadLocal<TreeNodeBuilder>() { - @Override - protected TreeNodeBuilder initialValue() { - return new TreeNodeBuilder(); - } - }; - - /** le visiteur */ - protected LoggableElementVisitorBuilder visitor; - - /** - * Construit un arbre de navigation à partir d'un {@link LoggableElement}. - * - * @param v la donnée à visiter - * @param remote flag pour indiquer si on travaille sur des données locales - * ou en remote. - * @return le noeud parent de l'arbre de nivation construit. - */ - public static LoggableElementTreeNode build(LoggableElement v, boolean remote) { - TreeNodeBuilder instance; - synchronized (instance = TreeNodeBuilder.instance.get()) { - LoggableElementTreeNode result; - // walk - result = instance.visitor.visit(v, remote); - return result; - } - } - - /** Protected scope to disable instanciation, use cached instance instead. */ - protected TreeNodeBuilder() { - visitor = new LoggableElementVisitorBuilder(); - } - - /** - * Lazy visitor getter. - * - * @return the cached visitor instance - */ - public LoggableElementVisitorBuilder getVisitor() { - if (visitor == null) { - visitor = new LoggableElementVisitorBuilder(); - } - return visitor; - } - - - /** - * Implantation de {@link SimpleEntityVisitor} pour construire l'arbre - * de navigation d'un {@link LoggableElement}. - * <p/> - * Cette classe est stateless, tous ces états internes doivent être nettoyé - * après une visite, en utilisant la méthode {@link #reset()}. - * <p/> - */ - public static class LoggableElementVisitorBuilder extends SimpleEntityVisitor { - - /** - * le noeud parent de tous les autres. - * <p/> - * Ce noeud est positionné par la méthode - * {@link #markRootNode(LoggableElementTreeNode)}. - */ - protected LoggableElementTreeNode rootNode; - - /** - * flag qui indique si on travaille sur des objet locaux ou distants. - * <p/> - * Cette information est conservé dans les nodes pour permettre de gérer - * de manière transparent des objet locaux ou distants. - */ - protected Boolean remote; - - /** les nodes internes utilisés pendant la visite. */ - protected LoggableElementTreeNode explorationApplication, - component, - explorationData, - components, - explorationDatas, - libraries, - constants, - strutures, - codes, - constantValues; - - public LoggableElementTreeNode visit(EntityVisitable v, boolean remote) { - reset(); - try { - this.remote = remote; - super.visit(v); - return this.rootNode; - } finally { - reset(); - } - } - - @Override - public void visitMetaData(MetaData v) { - // do not visit meta data (for the moment we dont need thoses - // informations in navigation tree), but it could be interresting - // for example to display attchments here ? - } - - @Override - public void visitExplorationApplication(ExplorationApplication v) { - markRootNode(explorationApplication = new LoggableElementTreeNode(explorationDatas, v, remote, true)); - super.visitExplorationApplication(v); - } - - @Override - public void visitComponent(Component v) { - markRootNode(component = new LoggableElementTreeNode(components, v, remote, true)); - super.visitComponent(v); - } - - @Override - public void visitExplorationData(ExplorationData v) { - markRootNode(explorationData = new LoggableElementTreeNode(explorationDatas, v, remote, true)); - super.visitExplorationData(v); - } - - @Override - public void visitCodes(Collection<Code> vs) { - codes = new LoggableElementTreeNode(component, Code.getLibelles(), remote, true); - super.visitCodes(vs); - } - - @Override - public void visitComponents(Collection<Component> vs) { - components = new LoggableElementTreeNode(explorationApplication, Component.getLibelles(), remote, true); - super.visitComponents(vs); - } - - @Override - public void visitConstants(Collection<Constant> vs) { - constants = new LoggableElementTreeNode(component, Constant.getLibelles(), remote, true); - super.visitConstants(vs); - } - - @Override - public void visitConstantValues(Collection<ConstantValue> vs) { - constantValues = new LoggableElementTreeNode(explorationData, ConstantValue.getLibelles(), remote, true); - super.visitConstantValues(vs); - } - - @Override - public void visitExplorationDatas(Collection<ExplorationData> vs) { - explorationDatas = new LoggableElementTreeNode(explorationApplication, ExplorationData.getLibelles(), remote, true); - super.visitExplorationDatas(vs); - } - - @Override - public void visitLibraries(Collection<Library> vs) { - libraries = new LoggableElementTreeNode(component, Library.getLibelles(), remote, true); - super.visitLibraries(vs); - } - - @Override - public void visitStructures(Collection<Structure> vs) { - strutures = new LoggableElementTreeNode(component, Structure.getLibelles(), remote, true); - super.visitStructures(vs); - } - - @Override - public void visitConstant(Constant v) { - markRootNode(new LoggableElementTreeNode(constants, v, remote, false)); - } - - @Override - public void visitLibrary(Library v) { - markRootNode(new LoggableElementTreeNode(libraries, v, remote, false)); - } - - @Override - public void visitResult(Result v) { - if (v != null) { - markRootNode(new LoggableElementTreeNode(explorationData, v, remote, false)); - } - } - - @Override - public void visitCode(Code v) { - new LoggableElementTreeNode(codes, v, remote, false); - } - - @Override - public void visitConstantValue(ConstantValue v) { - new LoggableElementTreeNode( - new LoggableElementTreeNode(constantValues, v.getConstant().getName(), remote, true), - v.getValue(), remote, false); - } - - @Override - public void visitStructure(Structure v) { - new LoggableElementTreeNode(strutures, v, remote, false); - } - - /** - * Tente de marquerle node donné comme noeud ancêtre de tous les autres. - * <p/> - * Le positionnement n'a lieu que si on a pas encore de rootNode. - * - * @param node le node a positionner comme rootNode (si nessecaire) - */ - protected void markRootNode(LoggableElementTreeNode node) { - if (rootNode == null) { - rootNode = node; - } - } - - /** - * La méthode pour réinitialiser les états interne de la classe. - * <p/> - * Cette méthode doit être appeler après chaque visite, afin d'assurer - * la propriété stateless de la classe. - */ - protected void reset() { - remote = null; - rootNode = explorationApplication = explorationDatas = explorationData - = components = component = constants = codes = libraries - = constantValues = null; - } - } -}
participants (1)
-
tchemit@users.labs.libre-entreprise.org