Author: tchemit Date: 2008-02-06 16:39:17 +0000 (Wed, 06 Feb 2008) New Revision: 690 Added: trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/JDetailTableModel.java Modified: trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/StorageServiceHelper.java trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerUIRefreshHelper.java trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DeleteAction.java trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowDetailTabAction.java trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowTabAbstractAction.java trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractAction.java trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/DetailTabModel.java trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/JApplicationTableModel.java trunk/simexplorer-is-swing/src/uimodel/fr/cemagref/simexplorer/is/ui/swing/tab/JApplicationDetailTab.jaxx Log: mise en place des d?\195?\169tails Modified: trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/StorageServiceHelper.java =================================================================== --- trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/StorageServiceHelper.java 2008-02-06 16:38:51 UTC (rev 689) +++ trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/StorageServiceHelper.java 2008-02-06 16:39:17 UTC (rev 690) @@ -20,6 +20,8 @@ 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.service.SimExplorerServiceException; import fr.cemagref.simexplorer.is.service.StorageService; /** @@ -53,6 +55,7 @@ return data; } + public static LoggableElement getElement(SimExplorerContext context, boolean remote, String uuid, String version) throws Exception { StorageService service = context.getStorageService(remote); LoggableElement data; @@ -60,4 +63,33 @@ return data; } + public static Version[] getVersions(SimExplorerContext context, boolean remote, String uuid) { + StorageService service = context.getStorageService(remote); + MetaData[] data; + try { + data = service.getVersions(context.getToken(), uuid); + } catch (SimExplorerServiceException e) { + throw new SimExplorerRuntimeException(e); + } + if (data == null) { + return null; + } + Version[] result = new Version[data.length]; + for (int i = 0; i < data.length; i++) { + MetaData metaData = data[i]; + result[i] = metaData.getVersion(); + } + return result; + } + + public static MetaData getMetaData(SimExplorerContext context, boolean remote, String uuid, String version) { + try { + StorageService service = context.getStorageService(remote); + MetaData metas; + metas = service.getMetadata(context.getToken(), uuid, version); + return metas; + } catch (SimExplorerServiceException e1) { + throw new SimExplorerRuntimeException(e1); + } + } } Modified: trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerUIRefreshHelper.java =================================================================== --- trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerUIRefreshHelper.java 2008-02-06 16:38:51 UTC (rev 689) +++ trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/SimExplorerUIRefreshHelper.java 2008-02-06 16:39:17 UTC (rev 690) @@ -18,14 +18,17 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing; +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.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.JDetailTableModel; import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; +import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeHelper; import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; import fr.cemagref.simexplorer.is.ui.swing.model.PaginationModel; -import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeHelper; import fr.cemagref.simexplorer.is.ui.swing.tab.JApplicationDetailTab; import fr.cemagref.simexplorer.is.ui.swing.tab.JApplicationListTab; import org.codelutin.i18n.CountryEnum; @@ -33,13 +36,16 @@ import org.codelutin.i18n.LanguageEnum; import javax.swing.AbstractButton; -import javax.swing.DefaultListModel; +import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; -import javax.swing.JList; import javax.swing.JTabbedPane; -import javax.swing.JTree; +import javax.swing.JTable; import javax.swing.SwingUtilities; +import javax.swing.tree.TreeNode; +import javax.swing.tree.DefaultTreeModel; +import java.text.SimpleDateFormat; import java.util.regex.Matcher; +import java.awt.Dimension; /** * Cette classe contient les méthodes utiles et réutilisables pour rafraichit @@ -57,6 +63,8 @@ */ public class SimExplorerUIRefreshHelper { + public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSS"); + /** * Rafraichit un onglet de type liste à partir de son modèle. * @@ -93,67 +101,6 @@ } /** - * Rafraichit l'onglet de détail à partir de notre modèle de détail. - * - * @param ui l'onglet de détail - * @param model le modele de détail - */ - public static void refreshDetailTabUI(final JApplicationDetailTab ui, final DetailTabModel model) { - - SwingUtilities.invokeLater(new Runnable() { - public void run() { - JTree tree = ui.getNavigationTree(); - - // tree data model may have changed, must revalidate - tree.invalidate(); - - JList historyList = ui.getHistoryList(); - - DefaultListModel historyModel = (DefaultListModel) historyList.getModel(); - - Version[] versions = model.getVersions(); - historyList.setSelectedIndex(-1); - if (versions == null) { - historyModel.setSize(0); - } else { - Version currentVersion = model.getSelectedNode().getMetaData().getVersion(); - historyModel.setSize(versions.length); - - for (int i = 0; i < versions.length; i++) { - Version version = versions[i]; - historyModel.setElementAt(version, i); - if (version.equals(currentVersion)) { - historyList.setSelectedIndex(i); - } - } - } - - // history list may have changed, must revalidate - historyList.invalidate(); - - // parent must be repaint (will revalidate layout for tree) - ui.repaint(); - } - }); - } - - /** - * Rafraichit les actions d'un node dans l'arbre de navigation - * - * @param ui l'onglet de détail - * @param model le model du détail - * @param node le node sélectionné dans l'arbre de navigation - */ - public static void refreshDetailActions(JApplicationDetailTab ui, DetailTabModel model, LoggableElementTreeNode node) { - // refresh download button - refreshDownloadAction(ui, model, node); - // refresh delete button - refreshDeleteAction(ui, model, node); - // refresh export button - refreshExportAction(ui, model, node); - } - - /** * Rafraichit les actions i18n dans le menu en fonction de la locale * actuellement utilisée. * @@ -231,34 +178,49 @@ //}); } - protected static void refreshExportAction(JApplicationDetailTab ui, DetailTabModel model, LoggableElementTreeNode node) { - boolean export = LoggableElementTreeHelper.canExport(node); - ui.getExportApplication().setEnabled(export); - if (export) { - ui.getExportApplication().setToolTipText(_("simexplorer.action.export2", node.getUserObject())); - } else { - ui.getExportApplication().setToolTipText(null); + /** + * Rafraichit les actions d'un node dans l'arbre de navigation + * + * @param ui l'onglet de détail + * @param node le node sélectionné dans l'arbre de navigation + */ + public static void refreshDetailActions(JApplicationDetailTab ui, LoggableElementTreeNode node) { + // refresh download button + refreshDownloadAction(ui, node); + // refresh delete button + refreshDeleteAction(ui, node); + // refresh export button + refreshExportAction(ui, node); + } + + protected static void refreshDownloadAction(JApplicationDetailTab ui, LoggableElementTreeNode node) { + boolean download = LoggableElementTreeHelper.canDownload(node); + ui.getDownload().setEnabled(download); + String tooltip = null; + if (download) { + tooltip = _("simexplorer.action.dowload2", node.getUserObject()); } + ui.getDownload().setToolTipText(tooltip); } - protected static void refreshDeleteAction(JApplicationDetailTab ui, DetailTabModel model, LoggableElementTreeNode node) { + protected static void refreshDeleteAction(JApplicationDetailTab ui, LoggableElementTreeNode node) { boolean delete = LoggableElementTreeHelper.canDelete(node); ui.getDelete().setEnabled(delete); + String tooltip = null; if (delete) { - ui.getDelete().setToolTipText(_("simexplorer.action.delete2", node.getUserObject())); - } else { - ui.getDelete().setToolTipText(null); + tooltip = _("simexplorer.action.delete2", node.getUserObject()); } + ui.getDelete().setToolTipText(tooltip); } - protected static void refreshDownloadAction(JApplicationDetailTab ui, DetailTabModel model, LoggableElementTreeNode node) { - boolean download = LoggableElementTreeHelper.canDownload(node); - ui.getDownload().setEnabled(download); - if (download) { - ui.getDownload().setToolTipText(_("simexplorer.action.dowload2", node.getUserObject())); - } else { - ui.getDownload().setToolTipText(null); + protected static void refreshExportAction(JApplicationDetailTab ui, LoggableElementTreeNode node) { + boolean export = LoggableElementTreeHelper.canExport(node); + ui.getExportApplication().setEnabled(export); + String tooltip = null; + if (export) { + tooltip = _("simexplorer.action.export2", node.getUserObject()); } + ui.getExportApplication().setToolTipText(tooltip); } protected static void refreshPagination(JApplicationListTab ui, PaginationModel pagination) { @@ -291,7 +253,7 @@ while (size > combo.getItemCount()) { combo.addItem(combo.getItemCount()); } - } + } //System.out.println("new page size : " + combo.getItemCount()); combo.setSelectedIndex(model.getPagination().getCurrentPage()); @@ -300,6 +262,65 @@ ui.getCurrentPage().setEnabled(b); } + public static void resetHistory(JApplicationDetailTab ui, DetailTabModel model, DefaultComboBoxModel historyModel) { + historyModel.removeAllElements(); + LoggableElement selectedNode = model.getSelectedNode(); + Version[] versions = model.getVersions(); + boolean nodetail = versions == null || selectedNode == null; + // and the selection + if (nodetail) { + resetDetail(ui); + } else { + for (Version version : versions) { + historyModel.addElement(version); + } + boolean enabled = ui.getDetailVersions().getItemCount() > 1; + ui.getDetailVersions().setEnabled(enabled); + String text; + if (enabled) { + text = _("simexplorer.action.changeVersion.tooltip"); + } else { + text = null; + } + ui.getDetailVersions().setToolTipText(text); + } + } + + public static void resetDetail(final JApplicationDetailTab ui) { + ui.getDetailHeader().setText(_("simexplorer.node.nodetail")); + ui.getDetail().setVisible(false); + ((JDetailTableModel) ui.getDetailTable().getModel()).setData(null); + } + + public static void updateDetail(Integer index, final JApplicationDetailTab ui, DetailTabModel model, LoggableElement selectedNode) { + MetaData detail = model.getDetail(); + ui.getDetailVersions().setSelectedIndex(index); + ui.getDetailHeader().setText(_("simexplorer.node.detail", selectedNode.getMetaData().getName(), model.getSelectedVersion())); + ui.getDetailType().setText(detail.getType()); + ui.getDetailDescription().setText(detail.getDescription()); + ui.getDetailCreationDate().setText(DATE_FORMAT.format(detail.getCreationDate())); + ui.getDetail().setVisible(true); + JTable table = ui.getDetailTable(); + ((JDetailTableModel) table.getModel()).setData(detail); + int nbRows = table.getRowCount()+1; + if (nbRows>20) { + nbRows=20; + } + ui.getScrollTable().setPreferredSize(new Dimension((int) table.getSize().getWidth(),2+(nbRows*(4+table.getFont().getSize())))); + table.invalidate(); + ui.getScrollPane().repaint(); + ui.repaint(); + } + + public static void updateNavigationTree(JApplicationDetailTab ui, DetailTabModel model) { + // create navigation tree + TreeNode root = LoggableElementTreeHelper.buildLoggableElementNode(model.getRootNode()); + // push it in tree model + ((DefaultTreeModel) ui.getNavigationTree().getModel()).setRoot(root); + // by default select the root node + ui.getNavigationTree().setSelectionRow(0); + } + protected SimExplorerUIRefreshHelper() { // do not instanciate me please } Modified: trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DeleteAction.java =================================================================== --- trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DeleteAction.java 2008-02-06 16:38:51 UTC (rev 689) +++ trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DeleteAction.java 2008-02-06 16:39:17 UTC (rev 690) @@ -82,8 +82,6 @@ @Override protected void doAction(ActionEvent e) throws Exception { super.doAction(e); - //StorageService service = getContext().getStorageService(((DetailTabModel) getModel()).isRemote()); - //TODO } @Override Modified: trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowDetailTabAction.java =================================================================== --- trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowDetailTabAction.java 2008-02-06 16:38:51 UTC (rev 689) +++ trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowDetailTabAction.java 2008-02-06 16:39:17 UTC (rev 690) @@ -20,28 +20,28 @@ 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.service.SimExplorerServiceException; -import fr.cemagref.simexplorer.is.service.StorageService; -import fr.cemagref.simexplorer.is.ui.SimExplorerRuntimeException; +import fr.cemagref.simexplorer.is.ui.StorageServiceHelper; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerUIRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.actions.util.ShowTabAbstractAction; import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeHelper; import fr.cemagref.simexplorer.is.ui.swing.model.LoggableElementTreeNode; import fr.cemagref.simexplorer.is.ui.swing.tab.JApplicationDetailTab; -import javax.swing.JTree; -import javax.swing.ListModel; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; +import javax.swing.DefaultComboBoxModel; 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.ItemEvent; +import java.awt.event.ItemListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; /** - * Action pour afficher le tab de détail d'un LoggableElement + * Action pour afficher le tab de détail d'un LoggableElement. + * <p/> + * Les deux listeners (sur l'arbre de navigation et sur la liste des versions) + * écoutent les changements provenant du model de détail afin + * de pouvoir optimiser les rafraichissement d'ui. * * @author chemit */ @@ -58,104 +58,177 @@ private static final long serialVersionUID = 6643631041114311643L; + NavigationSelectionListener navigationListener; + + VersionSelectionListener versionListener; + public ShowDetailTabAction(String name) { super(name); + navigationListener = new NavigationSelectionListener(); + versionListener = new VersionSelectionListener(); } protected void initFirstUsage(final JApplicationDetailTab ui, final DetailTabModel model) { - // add a listener on navigation tree - ui.getNavigationTree().addTreeSelectionListener(new TreeSelectionListener() { - public void valueChanged(TreeSelectionEvent e) { - TreePath path = e.getNewLeadSelectionPath(); - LoggableElementTreeNode node = null; - if (path != null) { - node = (LoggableElementTreeNode) path.getLastPathComponent(); - } - StorageService service = getContext().getStorageService(model.isRemote()); - String token = getContext().getToken(); + ui.getNavigationTree().addTreeSelectionListener(navigationListener); + // add a listener on version list + ui.getDetailVersions().addItemListener(versionListener); + } - // update actions - SimExplorerUIRefreshHelper.refreshDetailActions(ui, model, node); + protected void initUI(JApplicationDetailTab ui, DetailTabModel model) { + SimExplorerUIRefreshHelper.updateNavigationTree(ui, model); + } - Object o = node == null ? null : node.getUserObject(); - // le node est acceptable uniquement si c'est un loggableElement - model.setSelectedNode((LoggableElement) (o instanceof LoggableElement ? o : null)); + /** + * The listener of the selection in navigation tree. + * + * @author chemit + */ + protected class NavigationSelectionListener implements TreeSelectionListener, PropertyChangeListener { - // update detail panel - //updateDetail(ui, model, node, service, token); + public NavigationSelectionListener() { + // only listen on SELECTED_VERSION_INDEX_PROPERTY_CHANGED + // to rebuild detail panel + getTabModel().addPropertyChangeListener(DetailTabModel.Properties.SELECTED_NODE_PROPERTY_CHANGED, this); + } - // update history list - updateHistoryList(ui, model, node, service, token); + public void valueChanged(TreeSelectionEvent e) { + JApplicationDetailTab ui = getTabUI(); + DetailTabModel model = getTabModel(); - // refresh ui - SimExplorerUIRefreshHelper.refreshDetailTabUI(ui, model); + TreePath path = e.getNewLeadSelectionPath(); + LoggableElementTreeNode node = null; + if (path != null) { + node = (LoggableElementTreeNode) path.getLastPathComponent(); } - }); + 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 + // class (in method propertyChange). + // The VersionListener will deal only with a real version selection. + model.resetSelectedVersion(); - // add a listener on history list - ui.getHistoryList().addListSelectionListener(new ListSelectionListener() { - public void valueChanged(ListSelectionEvent e) { - int index = e.getLastIndex(); - //int lastIndex = e.getLastIndex(); - log.info("last index : " + index); - ListModel listModel = ui.getHistoryList().getModel(); - if (index > -1 && listModel.getSize() > index && ui.getHistoryList().getSelectedIndex() != index) { - Object selectedVersion = listModel.getElementAt(index); - log.info("selected version " + selectedVersion); - //TODO load details for this version - } + // update history list + LoggableElement element = node == null || !(node.getUserObject() instanceof LoggableElement) ? null : ((LoggableElement) node.getUserObject()); + boolean history = element != null; + Version selectedVersion; + Version[] versions; + if (!history) { + versions = null; + selectedVersion = null; + } else { + versions = StorageServiceHelper.getVersions(getContext(), model.isRemote(), element.getMetaData().getUuid()); + selectedVersion = element.getMetaData().getVersion(); } - }); - } - protected void initUI(JApplicationDetailTab ui, DetailTabModel model) { - // création de l'arbre de navigation - TreeNode root = LoggableElementTreeHelper.buildLoggableElementNode(model.getRootNode()); - // push tree model - JTree tree = ui.getNavigationTree(); - DefaultTreeModel modelTree = (DefaultTreeModel) tree.getModel(); - modelTree.setRoot(root); - // by default select the root node (to display info about the exploration) - tree.setSelectionRow(0); - // refresh ui - SimExplorerUIRefreshHelper.refreshDetailTabUI(ui, model); - } + model.setVersions(versions); + model.setDetail(element == null ? null : element.getMetaData()); - public static void updateDetail(JApplicationDetailTab ui, DetailTabModel model, LoggableElementTreeNode node, StorageService service, String token) { - boolean detail = LoggableElementTreeHelper.isLoggableElement(node); - String text; - if (detail) { - LoggableElement element = (LoggableElement) node.getUserObject(); - model.setSelectedNode(element); - text = "detail [" + node.getUserObject().getClass().getSimpleName() + "]" + element; - } else { - text = "No detail"; + // le node est acceptable uniquement si c'est un loggableElement + model.setSelectedNode((LoggableElement) (o instanceof LoggableElement ? o : null)); + + // on positionne la version selectionnee + model.setSelectedVersion(selectedVersion); + + // update actions on selected node + SimExplorerUIRefreshHelper.refreshDetailActions(ui, node); } - ui.getDetailFake().setText(text); + + /** + * Notify a modification in the model. + * <p/> + * This method will update ui. + * + * @param evt event coming from DetailTabModel + */ + public void propertyChange(PropertyChangeEvent evt) { + log.info(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + JApplicationDetailTab ui = getTabUI(); + DetailTabModel model = getTabModel(); + DefaultComboBoxModel historyModel = (DefaultComboBoxModel) ui.getDetailVersions().getModel(); + + boolean wasEnable = versionListener.isEnabled(); + // disable version listener on selection (we already have updated model) + versionListener.setEnabled(false); + // refresh ui + SimExplorerUIRefreshHelper.resetHistory(ui, model, historyModel); + // push back previous state of version listener + versionListener.setEnabled(wasEnable); + } + } - public static void updateHistoryList(JApplicationDetailTab ui, DetailTabModel model, LoggableElementTreeNode node, StorageService service, String token) { - //boolean history = LoggableElementTreeHelper.isLoggableElement(node); - LoggableElement element = model.getSelectedNode(); - boolean history = element != null; - if (!history) { - model.setVersions(null); - model.setSelectedVersion(null); - return; + private class VersionSelectionListener implements PropertyChangeListener, ItemListener { + + protected boolean enabled; + + public VersionSelectionListener() { + enabled = true; + getTabModel().addPropertyChangeListener(DetailTabModel.Properties.SELECTED_VERSION_INDEX_PROPERTY_CHANGED, this); } - //LoggableElement element = (LoggableElement) node.getUserObject(); - try { - MetaData[] metas = service.getVersions(token, element.getMetaData().getUuid()); - Version[] versions = new Version[metas.length]; - for (int i = 0; i < metas.length; i++) { - MetaData meta = metas[i]; - versions[i] = meta.getVersion(); + + public void itemStateChanged(ItemEvent e) { + if (!isEnabled()) { + return; } - model.setVersions(versions); - model.setSelectedVersion(element.getMetaData().getVersion()); - } catch (SimExplorerServiceException e) { - throw new SimExplorerRuntimeException(e); + JApplicationDetailTab ui = getTabUI(); + DetailTabModel model = getTabModel(); + + MetaData metas; + //int selectedVersionIndex = ui.getDetailVersions().getSelectedIndex(); + Object selectedItem = ui.getDetailVersions().getSelectedItem(); + if (selectedItem == null) { + throw new NullPointerException("can not have a selectedItem null"); + } + Version selectedVersion = Version.valueOf(selectedItem.toString()); + log.info("selected version (" + selectedVersion+ ") " + selectedItem); + metas = StorageServiceHelper.getMetaData( + getContext(), + model.isRemote(), + model.getSelectedNode().getMetaData().getUuid(), + selectedVersion.toString() + ); + model.setDetail(metas); + + // finally change selectedIndex + model.setSelectedVersion(selectedVersion); } + + /** + * When the model modifies his data, ui must be updated. + * <p/> + * Note : <b>Only used when the selectedVersion is not null.</b> + * + * @param evt property changed event + */ + public void propertyChange(PropertyChangeEvent evt) { + log.info(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + Integer index = (Integer) evt.getNewValue(); + JApplicationDetailTab ui = getTabUI(); + DetailTabModel model = getTabModel(); + LoggableElement selectedNode = model.getSelectedNode(); + boolean wasEnable = isEnabled(); + // disable this listener, while updating list model, it will + // change the selection, and we don't want the model to be updated + // again + setEnabled(false); + if (index == null || index == -1) { + SimExplorerUIRefreshHelper.resetDetail(ui); + } else { + SimExplorerUIRefreshHelper.updateDetail(index, ui, model, selectedNode); + } + setEnabled(wasEnable); + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + } + } Modified: trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowTabAbstractAction.java =================================================================== --- trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowTabAbstractAction.java 2008-02-06 16:38:51 UTC (rev 689) +++ trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowTabAbstractAction.java 2008-02-06 16:39:17 UTC (rev 690) @@ -66,7 +66,7 @@ if (firstTime) { initFirstUsage(ui, model); } - initUI(ui,model); + initUI(ui, model); } Modified: trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractAction.java =================================================================== --- trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractAction.java 2008-02-06 16:38:51 UTC (rev 689) +++ trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractAction.java 2008-02-06 16:39:17 UTC (rev 690) @@ -104,4 +104,10 @@ } return (JComponent) container.getObjectById(name); } + + protected String getToken() { + String token; + token = getContext().getToken(); + return token; + } } Modified: trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/DetailTabModel.java =================================================================== --- trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/DetailTabModel.java 2008-02-06 16:38:51 UTC (rev 689) +++ trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/DetailTabModel.java 2008-02-06 16:39:17 UTC (rev 690) @@ -1,5 +1,5 @@ /* -* \#\#% Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Code Lutin, +* ##% 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 @@ -15,7 +15,7 @@ * 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.LoggableElement; @@ -23,9 +23,16 @@ import fr.cemagref.simexplorer.is.entities.metadata.Version; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerTab; import jaxx.runtime.builder.TabModel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; + /** - * Le model pour un Tab contenant le détail d'une application + * Le model pour un Tab contenant le détail d'une application. + * <p/> + * TODO * * @author chemit */ @@ -33,8 +40,15 @@ /** ? */ protected SimExplorerTab tab; + public enum Properties { + SELECTED_NODE_PROPERTY_CHANGED, + SELECTED_VERSION_INDEX_PROPERTY_CHANGED + } + private static final long serialVersionUID = 4851121531481734868L; + static protected Log log = LogFactory.getLog(DetailTabModel.class); + /** flag pour savoir si on est dans le cas local ou remote */ protected boolean remote; @@ -43,7 +57,7 @@ /** * le LoggableElement sélectionné dans l'arbre de navigation (ou null - * si le node sélectioné n'est pas un LoggableElement) + * si le node sélectionné n'est pas un LoggableElement) */ protected LoggableElement selectedNode; @@ -55,10 +69,10 @@ protected Version[] versions; /** - * la version sélectionnée dans la liste des versions (ou null si la liste - * des versions est nulle) + * l'index de la version sélectionnée dans la liste des versions (ou null + * si la liste des versions est nulle) */ - protected Version selectedVersion; + protected Integer selectedVersionIndex; /** * les métas à afficher dans le panel de détaillié à un uuid et à une version @@ -84,9 +98,13 @@ } public Version getSelectedVersion() { - return selectedVersion; + return versions == null || selectedVersionIndex == null || selectedVersionIndex == -1 ? null : versions[selectedVersionIndex]; } + public Version getSelectedVersion(int integer) { + return versions == null ? null : versions[integer]; + } + public Version[] getVersions() { return versions; } @@ -108,13 +126,31 @@ } public void setSelectedNode(LoggableElement selectedNode) { + LoggableElement oldSelectedNode = this.selectedNode; this.selectedNode = selectedNode; + // ui must build a list of versions for this node (if not null) + firePropertyChange(Properties.SELECTED_NODE_PROPERTY_CHANGED, oldSelectedNode, selectedNode); } - public void setSelectedVersion(Version selectedVersion) { - this.selectedVersion = selectedVersion; + public void setSelectedVersion(Version version) { + Integer index = getVersionIndex(version); + Integer oldSelectedVersionIndex = this.selectedVersionIndex; + this.selectedVersionIndex = index; + firePropertyChange(Properties.SELECTED_VERSION_INDEX_PROPERTY_CHANGED, oldSelectedVersionIndex, selectedVersionIndex); } + protected Integer getVersionIndex(Version version) { + if (versions != null && version != null) { + for (int i = 0; i < versions.length; i++) { + Version version1 = versions[i]; + if (version1.equals(version)) { + return i; + } + } + } + return null; + } + public void setVersions(Version[] versions) { this.versions = versions; } @@ -125,9 +161,62 @@ public void reset() { rootNode = null; + resetSelectedNode(); + } + + public void resetSelectedNode() { selectedNode = null; versions = null; - selectedVersion = null; - detail=null; + resetSelectedVersion(); + detail = null; } + + public void resetSelectedVersion() { + selectedVersionIndex = null; + } + + protected PropertyChangeSupport changeSupport; + + public synchronized void addPropertyChangeListener(Properties propertyName, PropertyChangeListener listener) { + if (listener == null) { + return; + } + if (changeSupport == null) { + changeSupport = new PropertyChangeSupport(this); + } + changeSupport.addPropertyChangeListener(propertyName.name(), listener); + } + + public synchronized void addPropertyChangeListener(PropertyChangeListener listener) { + if (listener == null) { + return; + } + if (changeSupport == null) { + changeSupport = new PropertyChangeSupport(this); + } + changeSupport.addPropertyChangeListener(listener); + } + + public synchronized void removePropertyChangeListener(PropertyChangeListener listener) { + if (listener == null || changeSupport == null) { + return; + } + changeSupport.removePropertyChangeListener(listener); + } + + public synchronized PropertyChangeListener[] getPropertyChangeListeners() { + if (changeSupport == null) { + return new PropertyChangeListener[0]; + } + return changeSupport.getPropertyChangeListeners(); + } + + public void firePropertyChange(Properties propertyName, Object oldValue, Object newValue) { + if (changeSupport == null || (oldValue == null && newValue == null) || + (oldValue != null && oldValue.equals(newValue))) { + return; + } + changeSupport.firePropertyChange(propertyName.name(), oldValue, newValue); + } + } \ No newline at end of file Modified: trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/JApplicationTableModel.java =================================================================== --- trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/JApplicationTableModel.java 2008-02-06 16:38:51 UTC (rev 689) +++ trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/JApplicationTableModel.java 2008-02-06 16:39:17 UTC (rev 690) @@ -1,5 +1,5 @@ /* -* \#\#% Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Code Lutin, +* ##% Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Code Lutin, * Tony Chemit * * This program is free software; you can redistribute it and/or @@ -15,7 +15,7 @@ * 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.metadata.MetaData; Added: trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/JDetailTableModel.java =================================================================== --- trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/JDetailTableModel.java (rev 0) +++ trunk/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/JDetailTableModel.java 2008-02-06 16:39:17 UTC (rev 690) @@ -0,0 +1,94 @@ +/* +* ##% Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Code Lutin, +* Tony Chemit +* +* 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.metadata.MetaData; +import static org.codelutin.i18n.I18n._; +import static org.codelutin.i18n.I18n.n_; + +import javax.swing.table.AbstractTableModel; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Table model to contains a MetaData details + * + * @author chemit + */ +public class JDetailTableModel extends AbstractTableModel { + + protected MetaData data; + protected List<String> descriptors; + private static final long serialVersionUID = -2377632046940030206L; + + protected final String[] columnNames = { + n_("simexplorer.common.key"), + n_("simexplorer.common.value") + }; + + public JDetailTableModel() { + } + + public int getRowCount() { + return getDescriptors().size(); + } + + public int getColumnCount() { + return columnNames.length; + } + + public Object getValueAt(int rowIndex, int columnIndex) { + Object result = null; + if (data == null) { + return null; + } + if (columnIndex == 0) { + // key + result = getDescriptors().get(rowIndex); + } else if (columnIndex == 1) { + // value + String propertyDescriptor = getDescriptors().get(rowIndex); + result = data.getDescriptors().get(propertyDescriptor); + } + return result; + } + + @Override + public String getColumnName(int column) { + return _(columnNames[column]); + } + + public List<String> getDescriptors() { + if (descriptors == null) { + descriptors = new ArrayList<String>(); + } + return descriptors; + } + + public void setData(MetaData data) { + this.data = data; + getDescriptors().clear(); + if (data != null) { + getDescriptors().addAll(data.getDescriptors().keySet()); + Collections.sort(getDescriptors()); + } + } + +} \ No newline at end of file Modified: trunk/simexplorer-is-swing/src/uimodel/fr/cemagref/simexplorer/is/ui/swing/tab/JApplicationDetailTab.jaxx =================================================================== --- trunk/simexplorer-is-swing/src/uimodel/fr/cemagref/simexplorer/is/ui/swing/tab/JApplicationDetailTab.jaxx 2008-02-06 16:38:51 UTC (rev 689) +++ trunk/simexplorer-is-swing/src/uimodel/fr/cemagref/simexplorer/is/ui/swing/tab/JApplicationDetailTab.jaxx 2008-02-06 16:39:17 UTC (rev 690) @@ -1,4 +1,7 @@ -<Table> +<Table> + <script> + import static org.codelutin.i18n.I18n._; + </script> <row> <cell fill='vertical'> <JToolBar id='toolbar' floatable='false' opaque='false' @@ -11,25 +14,70 @@ </JToolBar> </cell> </row> + <row> + <cell fill='vertical'> + <!--JPanel border='{javax.swing.border.LineBorder.createBlackLineBorder()}'--> + <JPanel id='detailHeaderPanel' background='{Color.WHITE}' border='{javax.swing.border.LineBorder.createBlackLineBorder()}'> + <JLabel id='detailHeader' text='{_("simexplorer.node.nodetail")}'/> + </JPanel> + </cell> + </row> <row fill="both" weightx="1" weighty="1"> <cell> <JSplitPane id='splitOne' orientation="horizontal" resizeWeight="0.4" oneTouchExpandable='true'> <JScrollPane columnHeaderView='{toolbar}'> <JTree id="navigationTree" model='{new javax.swing.tree.DefaultTreeModel(null)}'/> </JScrollPane> - <JScrollPane id="scrollPane"> - <JSplitPane id='splitTwo' orientation="vertical" resizeWeight="0.6" oneTouchExpandable='true'> - <JScrollPane horizontalScrollBarPolicy="horizontal_scrollbar_never"> - <JPanel id="detail"> - <JLabel id='detailFake' text="DetailPanel"/> - </JPanel> - </JScrollPane> - <JScrollPane horizontalScrollBarPolicy="horizontal_scrollbar_never"> - <!--JPanel id="history"--> - <JList id='historyList' model='{new DefaultListModel()}'/> - <!--/JPanel--> - </JScrollPane> - </JSplitPane> + <JScrollPane id="scrollPane" columnHeaderView='{detailHeaderPanel}'> + <!--JScrollPane id="scrollPane" verticalScrollBarPolicy="vertical_scrollbar_never" columnHeaderView='{detailHeaderPanel}'--> + <Table id='detail' insets='2,2,2,1'> + <row fill='vertical'> + <cell anchor='west'> + <JLabel text='{_("simexplorer.common.type")}'/> + </cell> + <cell weightx="1" anchor='east'> + <JLabel id='detailType'/> + </cell> + </row> + <row> + <cell anchor='west'> + <JLabel text='{_("simexplorer.common.version")}'/> + </cell> + <cell weightx="1" anchor='east'> + <JComboBox id='detailVersions' model='{new DefaultComboBoxModel()}'/> + </cell> + </row> + <row fill='vertical'> + <cell anchor='west'> + <JLabel text='{_("simexplorer.common.description")}'/> + </cell> + <cell weightx="1" anchor='east'> + <JLabel id='detailDescription'/> + </cell> + </row> + <row fill='vertical'> + <cell anchor='west'> + <JLabel text='{_("simexplorer.common.creationDate")}'/> + </cell> + <cell anchor='east'> + <JLabel id='detailCreationDate'/> + </cell> + </row> + <row> + <cell columns='2' fill='horizontal'> + <JScrollPane id='scrollTable'> + <JTable id="detailTable" model='{new fr.cemagref.simexplorer.is.ui.swing.model.JDetailTableModel()}' focusable='false' enabled='false'/> + </JScrollPane> + </cell> + </row> + <row weighty="1" weightx="2" > + <cell fill='both' columns='2'> + <JPanel> + <JLabel text=''/> + </JPanel> + </cell> + </row> + </Table> </JScrollPane> </JSplitPane> </cell>