r1218 - in trunk/simexplorer-is/simexplorer-is-swing/src: java/fr/cemagref/simexplorer/is/ui/swing/ui test/fr/cemagref/simexplorer/is/ui/swing/ui
Author: tchemit Date: 2008-02-24 19:51:08 +0000 (Sun, 24 Feb 2008) New Revision: 1218 Added: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/DetailTabUpdater.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/ListTabUpdater.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SimExplorerAbstractTabUpdater.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SynchronizeTabUpdater.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/TreeActionsUpdater.java Removed: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/DetailTabRefreshHelper.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/ListTabRefreshHelper.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SynchronizeTabRefreshHelper.java Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/EntityTreeNodeHelper.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SimExplorerMainUI.java trunk/simexplorer-is/simexplorer-is-swing/src/test/fr/cemagref/simexplorer/is/ui/swing/ui/SimExplorerUIRefreshHelperTest.java Log: utilisation object de type Updater pour gerer la mise a jour des ui suite a une modification dans le modele d'onglet Deleted: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/DetailTabRefreshHelper.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/DetailTabRefreshHelper.java 2008-02-24 19:49:59 UTC (rev 1217) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/DetailTabRefreshHelper.java 2008-02-24 19:51:08 UTC (rev 1218) @@ -1,304 +0,0 @@ -/* -* ##% 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.ui; - -import fr.cemagref.simexplorer.is.entities.EntityHelper; -import fr.cemagref.simexplorer.is.entities.attachment.Attachment; -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.SimExplorerContext; -import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.DetailTableModel; -import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; -import fr.cemagref.simexplorer.is.ui.swing.model.HistoryModel; -import static org.codelutin.i18n.I18n._; - -import javax.swing.DefaultComboBoxModel; -import javax.swing.DefaultListModel; -import javax.swing.JList; -import javax.swing.JTable; -import javax.swing.tree.DefaultTreeModel; -import java.awt.Dimension; -import java.awt.Rectangle; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.List; - -/** - * Cette classe contient les méthodes utiles et réutilisables pour rafraichir - * l'onglet de detail. - * <p/> - * Les méthodes utilisent les données stockées dans les modèles pour rafraichir - * les uis concernées. - * <p/> - * Note : <b>Dans toutes ces méthodes, NOS modèles ne doivent en aucun cas être modifiés</b> - * <p/> - * Par contre les modèles des ui peuvent être modifiés (par exemple modèle d'arbre, de liste) - * mais uniquement à partir de nos modèles. - * - * @author chemit - */ -public class DetailTabRefreshHelper { - - public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSS"); - - public static void refreshDetailTab(SimExplorerMainUI mainUi, 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(mainUi,ui, model.getHistory()); - } - - /** - * Rafraichit les actions d'un node dans l'arbre de navigation - * - * @param mainUI l'ui principale - * @param context le context de l'appplication - * @param ui l'onglet de détail - * @param model le model de d'onglet detail - * @param node le node sélectionné dans l'arbre de navigation - */ - public static void refreshDetailActions(SimExplorerMainUI mainUI, SimExplorerContext context, JDetailTab ui, DetailTabModel model, EntityTreeNode node) { - // refresh synchronize action button - refreshSynchroniseAction(context, ui, model); - // refresh download LoggableElement button - refreshDownloadElementAction(ui, model, node); - // refresh delete button - refreshDeleteAction(ui, model); - // refresh export button - refreshExportAction(mainUI,context,ui, model); - // refresh download Attachment button - refreshDownloadAttachmentAction(ui, model); - } - - public static void refreshTreeDetailActions(JDetailTab ui, EntityTreeNode node) { - EntityTreeNodeHelper.refreshTreeActions(ui.getCollapseAllDetail(), ui.getExpandAllDetail(), node); - } - - public static void refreshDownloadElementAction(JDetailTab ui, DetailTabModel model, EntityTreeNode node) { - MetaData detail = model.getDetail(); - boolean enabled = EntityHelper.Action.DOWNLOAD.accept(node); - SimExplorerMainUI.UpdateButton(ui.getDownloadElement(), enabled, enabled ? detail == null ? node.getUserObject() : detail.getName() + " [" + model.getSelectedVersion() + "]" : null); - } - - protected static void refreshDeleteAction(JDetailTab ui, DetailTabModel model) { - MetaData detail = model.getDetail(); - boolean enabled = EntityHelper.Action.DELETE.accept(detail); - SimExplorerMainUI.UpdateButton(ui.getDeleteElement(), enabled, enabled ? detail.getName() + " [" + model.getSelectedVersion() + "]" : null); - } - - public static void refreshDownloadAttachmentAction(JDetailTab ui, DetailTabModel model) { - Attachment attachment = model.getSelectedAttachment(); - boolean enabled = model.getDetail() != null && attachment != null; - SimExplorerMainUI.UpdateButton(ui.getDownloadAttachment(), enabled, enabled ? attachment : null); - } - - public static void refreshDetailToTreeAction(JDetailTab ui, DetailTabModel model) { - MetaData detail = model.getDetail(); - EntityTreeNode rootNode = model.getHistory().getCurrent(); - LoggableElement rootElement = (LoggableElement) rootNode.getUserObject(); - MetaData data = rootElement.getMetaData(); - Version version = model.getSelectedVersion(); - if (version == null) { - // la version peut être null, ce qui veut dire que l'on vient d'un changement - // de node dans l'arbre de navigation et donc la version est celle du detai - version = detail.getVersion(); - } - boolean enabled = !(detail.getName().equals(data.getName()) && data.getVersion().equals(version)); - - SimExplorerMainUI.UpdateButton(ui.getDetailToTree(), enabled, enabled ? detail.getName() + " [" + version + "]" : null); - } - - public static void refreshSynchroniseAction(SimExplorerContext context, JDetailTab ui, DetailTabModel model) { - MetaData detail = model.getDetail(); - boolean enabled = detail != null && context.isConnected(); - SimExplorerMainUI.UpdateButton(ui.getShowTab_synchronize(), enabled, enabled ? detail.getName() + " [" + model.getSelectedVersion() + "]" : null); - } - - public static void refreshExportAction(SimExplorerMainUI mainUI, SimExplorerContext context, JDetailTab ui, DetailTabModel model) { - LoggableElement sNode = model.getSelectedNode(); - mainUI.refreshExportElement(context,ui.getExportElement(),model.isRemote(),sNode); - } - - public static void resetHistory(JDetailTab ui, DetailTabModel model, DefaultComboBoxModel historyModel) { - historyModel.removeAllElements(); - LoggableElement selectedNode = model.getSelectedNode(); - Version[] versions = model.getVersions(); - boolean nodetail = versions == null || selectedNode == null; - if (nodetail) { - resetDetailPanel(ui); - } else { - ui.getDetailHeaderFromLocal().setVisible(!model.isRemote()); - ui.getDetailHeaderFromRemote().setVisible(model.isRemote()); - for (Version version : versions) { - historyModel.addElement(version); - } - boolean enabled = ui.getDetailVersions().getItemCount() > 1; - ui.getDetailVersions().setEnabled(enabled); - String text; - text = !enabled ? null : _("simexplorer.action.changeVersion.tooltip"); - ui.getDetailVersions().setToolTipText(text); - } - // can not synchronize to tree - SimExplorerMainUI.UpdateButton(ui.getDetailToTree(), false); - } - - public static void resetDetailPanel(final JDetailTab ui) { - ui.getDetailVersions().setVisible(false); - ui.getDetailHeader().setText(_("simexplorer.node.nodetail")); - ui.getDetailAttachmentsHeader().setText(_("simexplorer.node.noattachments")); - JList listAttchments = ui.getDetailAttachments(); - listAttchments.clearSelection(); - DefaultListModel listModel = (DefaultListModel) listAttchments.getModel(); - listModel.setSize(0); - listModel.trimToSize(); - ui.getDetail().setVisible(false); - ((DetailTableModel) ui.getDetailTable().getModel()).setData(null); - } - - public static void updateDetailNavigationTree(SimExplorerMainUI mainUi, JDetailTab ui, HistoryModel<EntityTreeNode> model) { - // push it in tree model - ((DefaultTreeModel) ui.getNavigationTree().getModel()).setRoot(model.getCurrent()); - // by default select the root node - if (ui.getNavigationTree().getModel().getRoot() != null) { - ui.getNavigationTree().setSelectionRow(0); - } - boolean enabled; - enabled = model.size() > 1 && model.hasPrevious(); - SimExplorerMainUI.UpdateButton(ui.getHistoryPrevious(), enabled, !enabled ? null : model.getPrevious()); - enabled = model.size() > 1 && model.hasNext(); - SimExplorerMainUI.UpdateButton(ui.getHistoryNext(), enabled, !enabled ? null : model.getNext()); - - SimExplorerMainUI.UpdateButton(mainUi.getHistoryReset(), !model.isEmpty()); - - } - - public static void updateDetailPanel(Integer index, final JDetailTab ui, DetailTabModel model, LoggableElement selectedNode) { - MetaData detail = model.getDetail(); - ui.getDetailVersions().setVisible(true); - if (ui.getDetailVersions().getItemCount() > 0) { - ui.getDetailVersions().setSelectedIndex(index); - } - ui.getDetailHeader().setText(selectedNode.getMetaData().getName()); - // FIXME !!! -// ui.getDetailDescriptorsHeader().setText(_("simexplorer.node.descriptors", detail.getDescriptors().size())); - ui.getDetailDescriptorsHeader().setText(_("simexplorer.node.descriptors", 0)); - ui.getDetailType().setText(EntityHelper.Type.getLibelle(detail.getElementClass())); - String s = detail.getDescription(); - String tooltip = s; - if (s.length() > 32) { - s = s.substring(0, 32) + "..."; - } - ui.getDetailDescription().setText(s); - if (!s.equals(tooltip)) { - ui.getDetailDescription().setToolTipText(tooltip); - } - ui.getDetailCreationDate().setText(DATE_FORMAT.format(detail.getCreationDate())); - ui.getDetail().setVisible(true); - JTable table = ui.getDetailTable(); - // FIXME !!! - ((DetailTableModel) table.getModel()).setData(null); -// ((DetailTableModel) table.getModel()).setData(detail); - int nbDescriptorRows = table.getRowCount(); - - // FIXME !!! -// List<Attachment> attachments = detail.getAttachments(); - List<Attachment> attachments = new ArrayList<Attachment>(); - JList listAttachments = ui.getDetailAttachments(); - DefaultListModel listModel = (DefaultListModel) listAttachments.getModel(); - listModel.setSize(0); - listModel.trimToSize(); - int nbAttachmentRows; - if (attachments.isEmpty()) { - ui.getDetailAttachmentsHeader().setText(_("simexplorer.node.noattachments")); - ui.getScrollAttachments().setVisible(false); - nbAttachmentRows = 0; - } else { - ui.getDetailAttachmentsHeader().setText(EntityHelper.Type.Attachment.getLibelles() + " (" + attachments.size() + ")"); - for (Attachment attachment : attachments) { - listModel.addElement(attachment); - } - listAttachments.setSelectedIndex(0); - nbAttachmentRows = listModel.getSize(); - ui.getScrollAttachments().setVisible(true); - } - - int[] rows = computeRows(nbDescriptorRows, nbAttachmentRows); - - Dimension dimOneRow = table.getUI().getPreferredSize(table.getTableHeader()); - - ui.getScrollTable().setPreferredSize(new Dimension((int) dimOneRow.getWidth(), 2 + ((rows[0] + 1) * (4 + table.getFont().getSize())))); - //ui.getScrollTable().setPreferredSize(new Dimension((int) table.getSize().getWidth(), 2 + (nbDescriptorRows * (4 + table.getFont().getSize())))); - if (nbAttachmentRows > 0) { - Rectangle rect = listAttachments.getUI().getCellBounds(listAttachments, 0, 0); - ui.getScrollAttachments().setPreferredSize(new Dimension((int) rect.getWidth() - 4, (int) (3 + rows[1] * rect.getHeight()))); - } - - table.invalidate(); - listAttachments.invalidate(); - ui.getScrollPane().invalidate(); - ui.repaint(); - } - - protected static int[] computeRows(int nbDescriptorRows, int nbAttachmentRows) { - int[] result = new int[2]; - int max = 14; - int maxOne = max / 2; - if (nbDescriptorRows == 0) { - result[0] = 0; - result[1] = nbAttachmentRows > max ? max : nbAttachmentRows; - return result; - } - if (nbAttachmentRows == 0) { - result[0] = nbDescriptorRows > max ? max : nbDescriptorRows; - result[1] = 0; - return result; - } - if (nbAttachmentRows < maxOne + 1 && nbDescriptorRows < maxOne + 1) { - result[0] = nbDescriptorRows; - result[1] = nbAttachmentRows; - return result; - } - if (nbDescriptorRows > maxOne && nbAttachmentRows > maxOne) { - result[0] = result[1] = maxOne; - return result; - } - if (nbDescriptorRows < maxOne + 1) { - result[0] = nbDescriptorRows; - int i = max - nbDescriptorRows; - result[1] = nbAttachmentRows < i ? nbAttachmentRows : i; - return result; - } - if (nbAttachmentRows < maxOne + 1) { - int i = max - nbAttachmentRows; - result[0] = nbDescriptorRows < i ? nbDescriptorRows : i; - result[1] = nbAttachmentRows; - return result; - } - throw new IllegalStateException("can not come her :)"); - } - - protected DetailTabRefreshHelper() { - // do not instanciate me please - } -} \ No newline at end of file Added: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/DetailTabUpdater.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/DetailTabUpdater.java (rev 0) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/DetailTabUpdater.java 2008-02-24 19:51:08 UTC (rev 1218) @@ -0,0 +1,383 @@ +/* +* ##% 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.ui; + +import fr.cemagref.simexplorer.is.entities.EntityHelper; +import fr.cemagref.simexplorer.is.entities.attachment.Attachment; +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.SimExplorerContext; +import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; +import fr.cemagref.simexplorer.is.ui.swing.model.DetailTableModel; +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; +import fr.cemagref.simexplorer.is.ui.swing.model.HistoryModel; +import static org.codelutin.i18n.I18n._; + +import javax.swing.DefaultComboBoxModel; +import javax.swing.DefaultListModel; +import javax.swing.JComboBox; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.tree.DefaultTreeModel; +import java.awt.Dimension; +import java.awt.Rectangle; +import java.beans.PropertyChangeEvent; +import java.text.SimpleDateFormat; +import java.util.List; + +/** + * TODO javadoc + * + * @author chemit + */ +public class DetailTabUpdater extends SimExplorerAbstractTabUpdater<JDetailTab, DetailTabModel> { + + public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSS"); + + public DetailTabUpdater(SimExplorerContext context) { + super(context, SimExplorerTab.detail); + } + + public void propertyChange(PropertyChangeEvent evt) { + String evtName = evt.getPropertyName(); + if (log.isDebugEnabled()) { + log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + } + + if (evtName.equals(DetailTabModel.ROOT_NODE_PROPERTY_CHANGED)) { + fireRootSelected(getUi(), getModel(), evt); + return; + } + if (evtName.equals(DetailTabModel.SELECTED_NODE_PROPERTY_CHANGED)) { + fireNodeSelected(getUi(), getModel(), evt); + return; + } + if (evtName.equals(DetailTabModel.SELECTED_VERSION_INDEX_PROPERTY_CHANGED)) { + fireVersionSelected(getUi(), getModel(), evt); + return; + } + if (evtName.equals(DetailTabModel.SELECTED_ATTACHMENT_INDEX_PROPERTY_CHANGED)) { + fireAttachmentSelected(getUi(), getModel(), evt); + return; + } + + throw new IllegalStateException("could not treate property " + evtName); + + } + + protected void fireRootSelected(JDetailTab ui, DetailTabModel model, PropertyChangeEvent evt) { + log.info(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + + EntityTreeNode node = (EntityTreeNode) evt.getNewValue(); + + ((DefaultTreeModel) ui.getNavigationTree().getModel()).setRoot(node); + + if (node == null) { + ui.getNavigationTree().clearSelection(); + return; + } + + // refresh tree toolbar label + ui.getDetailHeaderFromLocal().setVisible(!model.isRemote()); + ui.getDetailHeaderFromRemote().setVisible(model.isRemote()); + + HistoryModel<EntityTreeNode> history = model.getHistory(); + + // reset history action + SimExplorerMainUI.UpdateButton(getMainUI().getHistoryReset(), history.size() > 0); + + // history next action + if (history.size() > 1 && history.hasPrevious()) { + SimExplorerMainUI.EnableButton(ui.getHistoryPrevious(), history.getPrevious()); + } else { + SimExplorerMainUI.DisableButton(ui.getHistoryPrevious()); + } + + // history previous action + if (history.size() > 1 && history.hasNext()) { + SimExplorerMainUI.EnableButton(ui.getHistoryNext(), history.getNext()); + } else { + SimExplorerMainUI.DisableButton(ui.getHistoryNext()); + } + + // select root node (will trigger fireNodeSelected) + ui.getNavigationTree().setSelectionRow(0); + } + + protected void fireNodeSelected(JDetailTab ui, DetailTabModel model, PropertyChangeEvent evt) { + log.info(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + + LoggableElement newSelectedNode = (LoggableElement) evt.getNewValue(); + + boolean noNode = newSelectedNode == null; + + resetDetailPanel(noNode); + + if (noNode) { + return; + } + + // add versions + DefaultComboBoxModel historyModel = (DefaultComboBoxModel) ui.getDetailVersions().getModel(); + Version newVersion = newSelectedNode.getMetaData().getVersion(); + + Version[] versions = model.getVersions(); + Integer newIndex=null; + if (versions != null) { + for (int i = 0; i < versions.length; i++) { + Version version = versions[i]; + historyModel.addElement(version); + if (version.equals(newVersion)) { + newIndex=i; + } + } + } + + if (newIndex!=null) { + ui.getDetailVersions().setSelectedIndex(newIndex); + } + // add accessibility on combo + boolean enabled = ui.getDetailVersions().getItemCount() > 1; + SimExplorerMainUI.UpdateCombo(ui.getDetailVersions(), enabled, !enabled ? null : _("simexplorer.action.changeVersion.tooltip")); + + } + + protected void fireVersionSelected(JDetailTab ui, DetailTabModel model, PropertyChangeEvent evt) { + log.info(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + + Integer index = (Integer) evt.getNewValue(); + + if (index == null || index == -1) { + resetDetailPanel(true); + return; + } + + EntityTreeNode node = EntityTreeNodeHelper.getSelectedNode(ui.getNavigationTree()); + + MetaData detail = null; + if (model.getDetailNode() != null) { + detail = model.getDetailNode().getMetaData(); + } + + JList listAttachments = ui.getDetailAttachments(); + + DefaultListModel listModel = (DefaultListModel) listAttachments.getModel(); + + List<Attachment> attachments = model.getDetailNode() == null ? null : model.getDetailNode().getAttachments(); + + if (attachments != null && !attachments.isEmpty()) { + for (Attachment attachment : attachments) { + listModel.addElement(attachment); + } + ui.getScrollAttachments().setVisible(true); + ui.getDetailAttachments().setSelectedIndex(0); + } else { + ui.getDetailAttachments().getSelectionModel().clearSelection(); + // if we had a previous empty list, no trigger to fireAttachmentSelected + SimExplorerMainUI.DisableButton(ui.getDownloadAttachment()); + ui.getScrollAttachments().setVisible(false); + } + + if (ui.getDetailVersions().getSelectedIndex()!=index) { + ui.getDetailVersions().setSelectedIndex(index); + } + + refreshDetailPanelActions(ui, model, detail, node); + + LoggableElement element = model.getDetailNode(); + if (element == null) { + return; + } + + updateDetailPanel(ui, detail, listAttachments, element); + } + + private void refreshDetailPanelActions(JDetailTab ui, DetailTabModel model, MetaData detail, EntityTreeNode node) { + boolean enabled; + + // refresh synchronize and export actions + refreshWithConnectAction(); + + // refresh download LoggableElement button + enabled = detail != null && EntityHelper.Action.DOWNLOAD.accept(node); + SimExplorerMainUI.UpdateButton(ui.getDownloadElement(), enabled, enabled ? detail == null ? node.getUserObject() : detail.getName() + " [" + model.getSelectedVersion() + "]" : null); + + // refresh delete button + + enabled = detail != null && EntityHelper.Action.DELETE.accept(detail); + SimExplorerMainUI.UpdateButton(ui.getDeleteElement(), enabled, enabled ? detail.getName() + " [" + model.getSelectedVersion() + "]" : null); + + // refresh detail to tree button + + EntityTreeNode rootNode = model.getHistory().getCurrent(); + LoggableElement rootElement = (LoggableElement) rootNode.getUserObject(); + MetaData data = rootElement.getMetaData(); + Version version = model.getSelectedVersion(); + if (version == null && detail != null) { + // la version peut être null, ce qui veut dire que l'on vient d'un changement + // de node dans l'arbre de navigation et donc la version est celle du detai + version = detail.getVersion(); + } + enabled = detail != null && !(detail.getName().equals(data.getName()) && data.getVersion().equals(version)); + + SimExplorerMainUI.UpdateButton(ui.getDetailToTree(), enabled, enabled ? detail.getName() + " [" + version + "]" : null); + } + + protected void fireAttachmentSelected(JDetailTab ui, DetailTabModel model, PropertyChangeEvent evt) { + log.info(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + Attachment attachment = model.getSelectedAttachment(); + boolean enabled = model.getDetailNode() != null && attachment != null; + SimExplorerMainUI.UpdateButton(ui.getDownloadAttachment(), enabled, enabled ? attachment : null); + } + + public void refreshWithConnectAction() { + DetailTabModel model = getModel(); + JDetailTab ui = getUi(); + boolean b = model.getDetailNode() != null; + boolean enabled = b && context.isConnected(); + + MetaData detail = b ? model.getDetailNode().getMetaData() : null; + SimExplorerMainUI.UpdateButton(ui.getShowTab_synchronize(), enabled, enabled ? detail.getName() + " [" + model.getSelectedVersion() + "]" : null); + LoggableElement sNode = model.getSelectedNode(); + getMainUI().refreshExportElement(context, ui.getExportElement(), model.isRemote(), sNode); + } + + public void initListeners() { + DetailTabModel model = getModel(); + model.addPropertyChangeListener(DetailTabModel.ROOT_NODE_PROPERTY_CHANGED, this); + model.addPropertyChangeListener(DetailTabModel.SELECTED_NODE_PROPERTY_CHANGED, this); + model.addPropertyChangeListener(DetailTabModel.SELECTED_VERSION_INDEX_PROPERTY_CHANGED, this); + model.addPropertyChangeListener(DetailTabModel.SELECTED_ATTACHMENT_INDEX_PROPERTY_CHANGED, this); + } + + protected void resetDetailPanel(boolean disable) { + JDetailTab ui = getUi(); + JComboBox versions = ui.getDetailVersions(); + JList attchments = ui.getDetailAttachments(); + + ui.getDetailHeader().setText(_("simexplorer.node.nodetail")); + ui.getDetailAttachmentsHeader().setText(_("simexplorer.node.noattachments")); + + if (disable) { + versions.setVisible(false); + ui.getDetail().setVisible(false); + SimExplorerMainUI.DisableButton( + ui.getDetailToTree(), + ui.getShowTab_synchronize(), + ui.getExportElement(), + ui.getDownloadAttachment(), + ui.getDownloadElement(), + ui.getDeleteElement() + ); + } + + // clean versions combo + DefaultComboBoxModel comboModel = (DefaultComboBoxModel) versions.getModel(); + comboModel.removeAllElements(); + + // clean descriptors table + ((DetailTableModel) ui.getDetailTable().getModel()).setData(null); + + // clean attachments list + attchments.clearSelection(); + DefaultListModel listModel = (DefaultListModel) attchments.getModel(); + listModel.setSize(0); + listModel.trimToSize(); + + } + + protected void updateDetailPanel(JDetailTab ui, MetaData detail, JList listAttachments, LoggableElement element) { + + ui.getDetailHeader().setText(detail.getName()); + ui.getDetailDescriptorsHeader().setText(_("simexplorer.node.descriptors", element.getDescriptors().size())); + ui.getDetailType().setText(EntityHelper.Type.getLibelle(detail.getElementClass())); + + String s = detail.getDescription(); + String tooltip = s; + if (s.length() > 32) { + s = s.substring(0, 32) + "..."; + } + ui.getDetailDescription().setText(s); + ui.getDetailDescription().setToolTipText(tooltip); + + ui.getDetailCreationDate().setText(DATE_FORMAT.format(detail.getCreationDate())); + ui.getDetail().setVisible(true); + ui.getDetailVersions().setVisible(true); + JTable table = ui.getDetailTable(); + + ((DetailTableModel) table.getModel()).setData(element); + + int nbDescriptorRows = table.getRowCount(); + int nbAttachmentRows = listAttachments.getModel().getSize(); + + int[] rows = computeRows(nbDescriptorRows, nbAttachmentRows); + + Dimension dimOneRow = table.getUI().getPreferredSize(table.getTableHeader()); + + ui.getScrollTable().setPreferredSize(new Dimension((int) dimOneRow.getWidth(), 2 + ((rows[0] + 1) * (4 + table.getFont().getSize())))); + //ui.getScrollTable().setPreferredSize(new Dimension((int) table.getSize().getWidth(), 2 + (nbDescriptorRows * (4 + table.getFont().getSize())))); + if (nbAttachmentRows > 0) { + ui.getDetailAttachmentsHeader().setText(EntityHelper.Type.Attachment.getLibelles() + " (" + nbAttachmentRows + ")"); + Rectangle rect = listAttachments.getUI().getCellBounds(listAttachments, 0, 0); + ui.getScrollAttachments().setPreferredSize(new Dimension((int) rect.getWidth() - 4, (int) (3 + rows[1] * rect.getHeight()))); + } + table.invalidate(); + listAttachments.invalidate(); + ui.getScrollPane().invalidate(); + ui.repaint(); + } + + protected int[] computeRows(int nbDescriptorRows, int nbAttachmentRows) { + int[] result = new int[2]; + int max = 14; + int maxOne = max / 2; + if (nbDescriptorRows == 0) { + result[0] = 0; + result[1] = nbAttachmentRows > max ? max : nbAttachmentRows; + return result; + } + if (nbAttachmentRows == 0) { + result[0] = nbDescriptorRows > max ? max : nbDescriptorRows; + result[1] = 0; + return result; + } + if (nbAttachmentRows < maxOne + 1 && nbDescriptorRows < maxOne + 1) { + result[0] = nbDescriptorRows; + result[1] = nbAttachmentRows; + return result; + } + if (nbDescriptorRows > maxOne && nbAttachmentRows > maxOne) { + result[0] = result[1] = maxOne; + return result; + } + if (nbDescriptorRows < maxOne + 1) { + result[0] = nbDescriptorRows; + int i = max - nbDescriptorRows; + result[1] = nbAttachmentRows < i ? nbAttachmentRows : i; + return result; + } + if (nbAttachmentRows < maxOne + 1) { + int i = max - nbAttachmentRows; + result[0] = nbDescriptorRows < i ? nbDescriptorRows : i; + result[1] = nbAttachmentRows; + return result; + } + throw new IllegalStateException("can not come her :)"); + } +} Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/EntityTreeNodeHelper.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/EntityTreeNodeHelper.java 2008-02-24 19:49:59 UTC (rev 1217) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/EntityTreeNodeHelper.java 2008-02-24 19:51:08 UTC (rev 1218) @@ -46,6 +46,9 @@ import javax.swing.tree.TreePath; import java.util.Collection; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + /** * La classe responsable de la création des arbres de {@link fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode} * à partir de {@link LoggableElement} . @@ -58,6 +61,8 @@ */ public class EntityTreeNodeHelper { + protected static Log log = LogFactory.getLog(EntityTreeNodeHelper.class); + /** L'instance cachée de builder par Thread. */ protected static final ThreadLocal<EntityVisitorBuilder> builder = new ThreadLocal<EntityVisitorBuilder>() { @@ -81,10 +86,23 @@ EntityTreeNode result; // walk result = instance.visit(v, remote); + log.info(v+" ("+remote+") "); return result; } } + public static LoggableElement getSelectedLoggableElement(TreeSelectionEvent e) { + TreePath path = e.getNewLeadSelectionPath(); + EntityTreeNode node = null; + if (path != null) { + Object o = path.getLastPathComponent(); + if (o instanceof EntityTreeNode) { + node = (EntityTreeNode) o; + } + } + return node==null?null:node.getLoggableElement(); + } + public static EntityTreeNode getSelectedNode(TreeSelectionEvent e) { TreePath path = e.getNewLeadSelectionPath(); EntityTreeNode node = null; Deleted: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/ListTabRefreshHelper.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/ListTabRefreshHelper.java 2008-02-24 19:49:59 UTC (rev 1217) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/ListTabRefreshHelper.java 2008-02-24 19:51:08 UTC (rev 1218) @@ -1,171 +0,0 @@ -/* -* ##% 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.ui; - -import fr.cemagref.simexplorer.is.entities.EntityHelper; -import fr.cemagref.simexplorer.is.entities.metadata.MetaData; -import fr.cemagref.simexplorer.is.ui.swing.SimExplorerContext; -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 javax.swing.JComboBox; -import javax.swing.ListSelectionModel; -import javax.swing.SwingUtilities; - -/** - * Cette classe contient les méthodes utiles et réutilisables pour rafraichir - * les onglets de liste. - * <p/> - * Les méthodes utilisent les données stockées dans les modèles pour rafraichir - * les uis concernées. - * <p/> - * Note : <b>Dans toutes ces méthodes, NOS modèles ne doivent en aucun cas être modifiés</b> - * <p/> - * Par contre les modèles des ui peuvent être modifiés (par exemple modèle d'arbre, de liste) - * mais uniquement à partir de nos modèles. - * - * @author chemit - */ -public class ListTabRefreshHelper { - - /** - * Rafraichit un onglet de type liste à partir de son modèle. - * - * @param mainUi main ui - * @param ui l'onglet de liste à utiliser - * @param model le modèle de liste à utiliser - */ - public static void refreshListTabUI(final SimExplorerMainUI mainUi, final JListTab ui, final ListTabModel model) { - - SwingUtilities.invokeLater(new Runnable() { - public void run() { - - // refresh search text - ui.getSearchText().setText(model.getQuery().getQuery()); - - // refresh search actions - refreshSearchActions(ui, model); - - // 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(); - - // repaint the frame - mainUi.repaint(); - } - }); - } - - public static void refreshListTablePopupMenu(SimExplorerMainUI mainUi, SimExplorerContext context, final JListTab ui, final ListTabModel model) { - DataEntityModel item = model.getSelectedItem(); - ui.getTablePopupMenu().setEnabled(item != null); - int index = model.getSelectedIndex(); - if (item == null || index == -1 || model.isEmpty()) { - return; - } - MetaData data = model.get(index); - - String text = data.getName() + " [" + data.getVersion() + "]"; - - SimExplorerMainUI.UpdateButton(ui.getDownloadElement(), EntityHelper.Action.DOWNLOAD.accept(data), text); - SimExplorerMainUI.UpdateButton(ui.getDeleteElement(), EntityHelper.Action.DELETE.accept(data), text); - mainUi.refreshExportElement(context,ui.getExportElement(), model.isRemote(), data); - SimExplorerMainUI.UpdateButton(ui.getShowTab_detail(), true, text); - SimExplorerMainUI.UpdateButton(ui.getShowTab_synchronize(), context.isConnected(), text); - } - - /** - * Rafraichit les actions de recherche d'un onglet de type liste. - * - * @param ui l'onglet de liste à utiliser - * @param model le modèle de liste à utiliser - */ - public static void refreshSearchActions(JListTab ui, ListTabModel model) { - String text = ui.getSearchText().getText(); - boolean hasQuery = model.getQuery().hasQuery(); - ui.getSearch().setEnabled(hasQuery || !text.isEmpty()); - ui.getResetSearch().setEnabled(hasQuery || !text.isEmpty()); - } - - public static void refreshPagination(JListTab ui, PaginationModel pagination) { - - // refresh changePage combobox - refreshChangePageCombo(ui, pagination); - - // refresh changeSizor combo - refreshChangeSizorCombo(ui, pagination); - - int page = pagination.getCurrentPage(); - boolean notLast = page + 1 < pagination.getNbPages(); - ui.getGoNextPage().setEnabled(notLast); - ui.getGoLastPage().setEnabled(notLast); - boolean notFirstPage = !(pagination.getSize() < 2 || page < 1); - ui.getGoFirstPage().setEnabled(notFirstPage); - ui.getGoPreviousPage().setEnabled(notFirstPage); - } - - public static void refreshChangeSizorCombo(JListTab ui, PaginationModel pagination) { - JComboBox combo = ui.getChangeSizor(); - String s = pagination.getWidth() + ""; - if (!s.equals(String.valueOf(combo.getSelectedItem()))) { - combo.setEnabled(false); - combo.setSelectedItem(s); - combo.setEnabled(true); - } - } - - public static void refreshChangePageCombo(JListTab ui, PaginationModel pagination) { - JComboBox combo = ui.getGoPage(); - long size = pagination.getNbPages(); - combo.setEnabled(false); - //System.out.println("page old size : " + combo.getItemCount() + " new size : " + size); - if (size < combo.getItemCount()) { - while (size < combo.getItemCount()) { - combo.removeItemAt(combo.getItemCount() - 1); - } - } else { - while (size > combo.getItemCount()) { - combo.addItem(combo.getItemCount()); - } - } - //System.out.println("new page size : " + combo.getItemCount()); - if (combo.getItemCount() > 0) { - combo.setSelectedIndex(pagination.getCurrentPage()); - } - boolean b = combo.getItemCount() > 1; - combo.setEnabled(b); - ui.getCurrentPage().setEnabled(b); - } - - protected ListTabRefreshHelper() { - // do not instanciate me please - } -} \ No newline at end of file Added: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/ListTabUpdater.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/ListTabUpdater.java (rev 0) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/ListTabUpdater.java 2008-02-24 19:51:08 UTC (rev 1218) @@ -0,0 +1,202 @@ +/* +* ##% 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.ui; + +import fr.cemagref.simexplorer.is.entities.EntityHelper; +import fr.cemagref.simexplorer.is.entities.metadata.MetaData; +import fr.cemagref.simexplorer.is.ui.swing.SimExplorerContext; +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 fr.cemagref.simexplorer.is.ui.swing.model.PaginationModel; +import fr.cemagref.simexplorer.is.ui.swing.model.QueryModel; + +import javax.swing.JComboBox; +import java.beans.PropertyChangeEvent; +import java.text.SimpleDateFormat; + +/** + * La classe responsable du rafrachissement des ui de l'onglet de liste. + * + * @author chemit + */ +public class ListTabUpdater extends SimExplorerAbstractTabUpdater<JListTab, ListTabModel> { + + public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSS"); + + public ListTabUpdater(SimExplorerContext context, boolean remote) { + super(context, remote ? SimExplorerTab.remote : SimExplorerTab.local); + } + + public void propertyChange(PropertyChangeEvent evt) { + String evtName = evt.getPropertyName(); + if (log.isDebugEnabled()) { + log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + } + + if (evtName.equals(ListTabModel.SELECTED_ROW_PROPERTY_CHANGED)) { + fireRowSelected(getUi(), getModel(), evt); + return; + } + + if (evtName.equals(ListTabModel.QUERY_PROPERTY_CHANGED)) { + fireQueryChanged(getUi(), getModel(), evt); + return; + } + + if (evtName.equals(ListTabModel.PAGINATION_PROPERTY_CHANGED)) { + firePaginationChanged(getUi(), getModel(), evt); + return; + } + + throw new IllegalStateException("could not treate property " + evtName); + } + + protected void fireRowSelected(JListTab ui, ListTabModel model, PropertyChangeEvent evt) { + log.info(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + + if (!model.isEmpty()) { + ui.getTable().getSelectionModel().setSelectionInterval(model.getSelectedIndex(), model.getSelectedIndex()); + } else { + ui.getTable().getSelectionModel().clearSelection(); + } + + // refresh popup + refreshListTablePopupMenu(model); + } + + protected void fireQueryChanged(JListTab ui, ListTabModel model, PropertyChangeEvent evt) { + log.info(evt.getPropertyName() + "\n\told:" + evt.getOldValue() + ",\n\tnew:" + evt.getNewValue()); + QueryModel query = (QueryModel) evt.getNewValue(); + if (query == null) { + resetSearch(); + return; + } + + ui.getSearchText().setText(query.getQuery()); + + refreshSearchActions(); + + refreshPaginationActions(model.getPagination()); + + ((ListTableModel) ui.getTable().getModel()).setData(model.getList()); + + // on selectionne le premier item + if (!model.isEmpty()) { + ui.getTable().getSelectionModel().setSelectionInterval(0,0); + } + } + + protected void firePaginationChanged(JListTab ui, ListTabModel model, PropertyChangeEvent evt) { + log.info(evt.getPropertyName() + "\n\told:" + evt.getOldValue() + ",\n\tnew:" + evt.getNewValue()); + + ui.getSearchText().setText(model.getQuery()); + + refreshSearchActions(); + + refreshPaginationActions(model.getPagination()); + + ((ListTableModel) ui.getTable().getModel()).setData(model.getList()); + + if (!model.isEmpty()) { + ui.getTable().getSelectionModel().setSelectionInterval(0,0); + } + } + + protected void refreshPaginationActions(PaginationModel pagination) { + JListTab ui = getUi(); + JComboBox combo = ui.getGoPage(); + long size = pagination.getNbPages(); + combo.setEnabled(false); + //System.out.println("page old size : " + combo.getItemCount() + " new size : " + size); + if (size < combo.getItemCount()) { + while (size < combo.getItemCount()) { + combo.removeItemAt(combo.getItemCount() - 1); + } + } else { + while (size > combo.getItemCount()) { + combo.addItem(combo.getItemCount()); + } + } + //System.out.println("new page size : " + combo.getItemCount()); + if (combo.getItemCount() > 0) { + combo.setSelectedIndex(pagination.getCurrentPage()); + } + boolean b = combo.getItemCount() > 1; + combo.setEnabled(b); + ui.getCurrentPage().setEnabled(b); + + combo = ui.getChangeSizor(); + //String s = pagination.getWidth() + ""; + if (!pagination.getWidth().equals(combo.getSelectedItem())) { + combo.setEnabled(false); + combo.setSelectedItem(pagination.getWidth()); + combo.setEnabled(true); + } + + int page = pagination.getCurrentPage(); + boolean notLast = page + 1 < pagination.getNbPages(); + ui.getGoNextPage().setEnabled(notLast); + ui.getGoLastPage().setEnabled(notLast); + boolean notFirstPage = !(pagination.getSize() < 2 || page < 1); + ui.getGoFirstPage().setEnabled(notFirstPage); + ui.getGoPreviousPage().setEnabled(notFirstPage); + } + + public void initListeners() { + ListTabModel model = getModel(); + model.addPropertyChangeListener(ListTabModel.SELECTED_ROW_PROPERTY_CHANGED, this); + model.addPropertyChangeListener(ListTabModel.PAGINATION_PROPERTY_CHANGED, this); + model.addPropertyChangeListener(ListTabModel.QUERY_PROPERTY_CHANGED, this); + } + + + public void resetSearch() { + getUi().getSearchText().setText(null); + SimExplorerMainUI.DisableButton(getUi().getResetSearch(), getUi().getSearch()); + } + + /** Rafraichit les actions de recherche d'un onglet de type liste. */ + public void refreshSearchActions() { + JListTab ui = getUi(); + String text = ui.getSearchText().getText(); + boolean hasQuery = getModel().hasQuery() || !text.isEmpty(); + SimExplorerMainUI.UpdateButton(ui.getSearch(), hasQuery); + SimExplorerMainUI.UpdateButton(ui.getResetSearch(), hasQuery); + } + + public void refreshListTablePopupMenu(final ListTabModel model) { + JListTab ui = getUi(); + DataEntityModel item = model.getSelectedItem(); + ui.getTablePopupMenu().setEnabled(item != null); + int index = model.getSelectedIndex(); + if (item == null || index == -1 || model.isEmpty()) { + return; + } + MetaData data = model.get(index); + + String text = data.getName() + " [" + data.getVersion() + "]"; + + SimExplorerMainUI.UpdateButton(ui.getDownloadElement(), EntityHelper.Action.DOWNLOAD.accept(data), text); + SimExplorerMainUI.UpdateButton(ui.getDeleteElement(), EntityHelper.Action.DELETE.accept(data), text); + SimExplorerMainUI.UpdateButton(ui.getShowTab_detail(), true, text); + SimExplorerMainUI.UpdateButton(ui.getShowTab_synchronize(), getContext().isConnected(), text); + + getMainUI().refreshExportElement(getContext(), ui.getExportElement(), model.isRemote(), data); + } +} \ No newline at end of file Added: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SimExplorerAbstractTabUpdater.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SimExplorerAbstractTabUpdater.java (rev 0) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SimExplorerAbstractTabUpdater.java 2008-02-24 19:51:08 UTC (rev 1218) @@ -0,0 +1,66 @@ +/* +* ##% 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.ui; + +import fr.cemagref.simexplorer.is.ui.swing.SimExplorerContext; +import fr.cemagref.simexplorer.is.ui.swing.model.SimExplorerTabModel; +import jaxx.runtime.swing.JAXXTab; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.beans.PropertyChangeListener; + +/** + * TODO javadoc + * + * @author chemit + */ +public abstract class SimExplorerAbstractTabUpdater<U extends JAXXTab, M extends SimExplorerTabModel> implements PropertyChangeListener { + protected static Log log = LogFactory.getLog(DetailTabUpdater.class); + final protected SimExplorerContext context; + protected SimExplorerTab tab; + + protected abstract void initListeners(); + + public void removeListeners() { + getModel().removePropertyChangeListener(this); + } + + public SimExplorerAbstractTabUpdater(SimExplorerContext context, SimExplorerTab tab) { + this.context = context; + this.tab = tab; + } + + public SimExplorerContext getContext() { + return context; + } + + protected SimExplorerMainUI getMainUI() { + return SimExplorerMainUI.getUI(); + } + + @SuppressWarnings({"unchecked"}) + public M getModel() { + return (M) tab.getModel(); + } + + @SuppressWarnings({"unchecked"}) + public U getUi() { + return (U) tab.getUI(); + } +} Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SimExplorerMainUI.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SimExplorerMainUI.java 2008-02-24 19:49:59 UTC (rev 1217) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SimExplorerMainUI.java 2008-02-24 19:51:08 UTC (rev 1218) @@ -34,6 +34,7 @@ import javax.swing.JComponent; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; +import javax.swing.JComboBox; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.util.regex.Matcher; @@ -81,7 +82,7 @@ protected void finalizeInit(SimExplorerContext context) { // chargement dans l'ui des actions - SimExplorerActionManager.loadActions(this, null); + SimExplorerActionManager.loadActions(this); // add Ctrl-W to close current tab getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, InputEvent.CTRL_MASK), "closeTab"); @@ -136,6 +137,16 @@ button.setToolTipText(t); } + public static void DisableButton(AbstractButton... buttons) { + for (AbstractButton button : buttons) { + UpdateButton(button, false); + } + } + + public static void EnableButton(AbstractButton button, Object... params) { + UpdateButton(button,true,params); + } + public static void UpdateButton(AbstractButton button, boolean enabled, Object... params) { button.setEnabled(enabled); if (!enabled) { @@ -146,4 +157,18 @@ button.setToolTipText(t); } } + + public static void UpdateCombo(JComboBox button, boolean enabled, Object... params) { + button.setEnabled(enabled); + if (!enabled) { + button.setToolTipText(null); + } else { + SimExplorerAbstractAction action = (SimExplorerAbstractAction) button.getAction(); + if (action!=null) { + String t = _(action.getI18nToolTipText(), params); + button.setToolTipText(t); + } + } + } + } Deleted: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SynchronizeTabRefreshHelper.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SynchronizeTabRefreshHelper.java 2008-02-24 19:49:59 UTC (rev 1217) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SynchronizeTabRefreshHelper.java 2008-02-24 19:51:08 UTC (rev 1218) @@ -1,107 +0,0 @@ -/* -* ##% 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.ui; - -import fr.cemagref.simexplorer.is.entities.data.LoggableElement; -import fr.cemagref.simexplorer.is.ui.swing.SimExplorerContext; -import fr.cemagref.simexplorer.is.ui.swing.model.SynchronizeTabModel; - -import javax.swing.JTabbedPane; -import javax.swing.JTree; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreeNode; - -/** - * Cette classe contient les méthodes utiles et réutilisables pour rafraichir - * les onglets de liste. - * <p/> - * Les méthodes utilisent les données stockées dans les modèles pour rafraichir - * les uis concernées. - * <p/> - * Note : <b>Dans toutes ces méthodes, NOS modèles ne doivent en aucun cas être modifiés</b> - * <p/> - * Par contre les modèles des ui peuvent être modifiés (par exemple modèle d'arbre, de liste) - * mais uniquement à partir de nos modèles. - * - * @author chemit - */ -public class SynchronizeTabRefreshHelper { - - protected static void refreshSynchronizeTab(SimExplorerMainUI mainUi,SimExplorerContext context, JSynchronizeTab ui, SynchronizeTabModel model) { - - EntityTreeNodeHelper.refreshTreeActions(ui.getCollapseButton(false), ui.getExpandButton(false), null); - EntityTreeNodeHelper.refreshTreeActions(ui.getCollapseButton(true), ui.getExpandButton(true), null); - - mainUi.refreshExportElement(context, ui.getExportButton(false), false, model.getSelectedNode(false)); - mainUi.refreshExportElement(context, ui.getExportButton(true), true, model.getSelectedNode(true)); - - refreshRootNode(mainUi,context,ui, model, false); - refreshRootNode(mainUi,context,ui, model, true); - } - - public static void updateTree(SimExplorerMainUI mainUi,SimExplorerContext context, JTabbedPane container, LoggableElement oldLocalRoot, LoggableElement oldRemoteRoot) { - - SimExplorerTab tab = SimExplorerTab.synchronize; - - SynchronizeTabModel model = (SynchronizeTabModel) tab.getModel(); - if (model.getRootNode(false) == null && model.getRootNode(true) == null) { - // on doit supprimer la vue - tab.closeTab(mainUi, container); - } - - JSynchronizeTab ui = (JSynchronizeTab) tab.getUI(); - - if (model.getRootNode(false) != oldLocalRoot) { - // rebuild node ? - refreshRootNode(mainUi,context,ui, model, false); - } - - if (model.getRootNode(true) != oldRemoteRoot) { - // rebuild node ? - refreshRootNode(mainUi,context,ui, model, true); - } - } - - protected static void refreshRootNode(SimExplorerMainUI mainUi,SimExplorerContext context,JSynchronizeTab ui, SynchronizeTabModel model, boolean remote) { - - LoggableElement element; - TreeNode root = null; - - element = model.getRootNode(remote); - if (element != null) { - root = EntityTreeNodeHelper.build(element, remote); - } - - JTree tree = ui.getTree(remote); - - ((DefaultTreeModel) tree.getModel()).setRoot(root); - - if (root == null) { - tree.getSelectionModel().clearSelection(); - LoggableElement sNode = model.getSelectedNode(remote); - mainUi.refreshExportElement(context, ui.getExportButton(remote), remote, sNode); - } else { - tree.setSelectionRow(0); - } - } - - protected SynchronizeTabRefreshHelper() { - // do not instanciate me please - } -} \ No newline at end of file Added: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SynchronizeTabUpdater.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SynchronizeTabUpdater.java (rev 0) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/SynchronizeTabUpdater.java 2008-02-24 19:51:08 UTC (rev 1218) @@ -0,0 +1,134 @@ +/* +* ##% 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.ui; + +import fr.cemagref.simexplorer.is.entities.data.LoggableElement; +import fr.cemagref.simexplorer.is.ui.swing.SimExplorerContext; +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.tree.DefaultTreeModel; +import java.beans.PropertyChangeEvent; + +/** + * TODO javadoc + * + * @author chemit + */ +public class SynchronizeTabUpdater extends SimExplorerAbstractTabUpdater<JSynchronizeTab, SynchronizeTabModel> { + + public SynchronizeTabUpdater(SimExplorerContext context) { + super(context, SimExplorerTab.synchronize); + } + + public void propertyChange(PropertyChangeEvent evt) { + String evtName = evt.getPropertyName(); + if (log.isDebugEnabled()) { + log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + } + + if (evtName.equals(SynchronizeTabModel.SOURCES_PROPERTY_CHANGED)) { + fireSources(evt); + return; + } + if (evtName.equals(SynchronizeTabModel.LOCAL_ROOT_NODE_PROPERTY_CHANGED)) { + fireRootSelected(evt, false); + return; + } + if (evtName.equals(SynchronizeTabModel.LOCAL_SELECTED_NODE_PROPERTY_CHANGED)) { + fireNodeSelected(evt, false); + return; + } + if (evtName.equals(SynchronizeTabModel.REMOTE_ROOT_NODE_PROPERTY_CHANGED)) { + fireRootSelected(evt, true); + return; + } + if (evtName.equals(SynchronizeTabModel.REMOTE_SELECTED_NODE_PROPERTY_CHANGED)) { + fireNodeSelected(evt, true); + return; + } + + throw new IllegalStateException("could not treate property " + evtName); + } + + public void initListeners() { + SynchronizeTabModel model = getModel(); + model.addPropertyChangeListener(SynchronizeTabModel.LOCAL_ROOT_NODE_PROPERTY_CHANGED, this); + model.addPropertyChangeListener(SynchronizeTabModel.LOCAL_SELECTED_NODE_PROPERTY_CHANGED, this); + model.addPropertyChangeListener(SynchronizeTabModel.REMOTE_ROOT_NODE_PROPERTY_CHANGED, this); + model.addPropertyChangeListener(SynchronizeTabModel.REMOTE_SELECTED_NODE_PROPERTY_CHANGED, this); + model.addPropertyChangeListener(SynchronizeTabModel.SOURCES_PROPERTY_CHANGED, this); + } + + private void fireSources(PropertyChangeEvent evt) { + log.info(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + LoggableElement[] oldSources = (LoggableElement[]) evt.getOldValue(); + LoggableElement[] sources = (LoggableElement[]) evt.getNewValue(); + if (sources[0] == null && sources[1] == null) { + // close tab + SimExplorerTab.synchronize.closeTab(getMainUI(), getMainUI().getContent()); + } + + if (sources[0]==null && oldSources[0]==null) { + // disable local + SimExplorerMainUI.DisableButton(getUi().getExportButton(false), getUi().getShowDetailButton(false),getUi().getCollapseButton(false),getUi().getExpandButton(false)); + } + + if (sources[1]==null&& oldSources[1]==null) { + // disable remote + SimExplorerMainUI.DisableButton(getUi().getExportButton(true), getUi().getShowDetailButton(true),getUi().getCollapseButton(true),getUi().getExpandButton(true)); + } + // by default disable the action + //SimExplorerMainUI.DisableButton(getUi().getExportButton(false), getUi().getExportButton(true)); + + } + + protected void fireRootSelected(PropertyChangeEvent evt, boolean remote) { + log.info(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + + LoggableElement le = (LoggableElement) evt.getNewValue(); + + JTree tree = getUi().getTree(remote); + DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel(); + + if (le == null) { + treeModel.setRoot(null); + tree.clearSelection(); + return; + } + + EntityTreeNode root = EntityTreeNodeHelper.build(le, remote); + treeModel.setRoot(root); + + // select root node (will trigger fireNodeSelected) + tree.setSelectionRow(0); + + } + + protected void fireNodeSelected(PropertyChangeEvent evt, boolean remote) { + log.info(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); + + LoggableElement newSelectedNode = (LoggableElement) evt.getNewValue(); + + getMainUI().refreshExportElement(getContext(), getUi().getExportButton(remote), remote, newSelectedNode); + + } + + +} \ No newline at end of file Added: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/TreeActionsUpdater.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/TreeActionsUpdater.java (rev 0) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/ui/TreeActionsUpdater.java 2008-02-24 19:51:08 UTC (rev 1218) @@ -0,0 +1,43 @@ +/* +* ##% 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.ui; + +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; + +import javax.swing.AbstractButton; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; + +/** + * Un updater sur les actions d'unarbre de navigation. + * + * @author chemit + */ +public abstract class TreeActionsUpdater implements TreeSelectionListener { + + protected abstract AbstractButton getExpandAction(); + + protected abstract AbstractButton getCollapseAction(); + + public void valueChanged(TreeSelectionEvent e) { + + EntityTreeNode node = EntityTreeNodeHelper.getSelectedNode(e); + + EntityTreeNodeHelper.refreshTreeActions(getCollapseAction(), getExpandAction(), node); + } +} Modified: trunk/simexplorer-is/simexplorer-is-swing/src/test/fr/cemagref/simexplorer/is/ui/swing/ui/SimExplorerUIRefreshHelperTest.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/test/fr/cemagref/simexplorer/is/ui/swing/ui/SimExplorerUIRefreshHelperTest.java 2008-02-24 19:49:59 UTC (rev 1217) +++ trunk/simexplorer-is/simexplorer-is-swing/src/test/fr/cemagref/simexplorer/is/ui/swing/ui/SimExplorerUIRefreshHelperTest.java 2008-02-24 19:51:08 UTC (rev 1218) @@ -1,7 +1,6 @@ package fr.cemagref.simexplorer.is.ui.swing.ui; import junit.framework.TestCase; -import fr.cemagref.simexplorer.is.ui.swing.ui.DetailTabRefreshHelper; /** * SimExplorerUIRefreshHelper Tester. @@ -12,19 +11,21 @@ */ public class SimExplorerUIRefreshHelperTest extends TestCase { int max = 14; + static DetailTabUpdater updater =new DetailTabUpdater(null); + public SimExplorerUIRefreshHelperTest(String name) { super(name); } public void testComputeRowLimitCases() throws Exception { for (int i = 0; i < max+1; i++) { - assertComputeRow(0, i, DetailTabRefreshHelper.computeRows(0, i)); + assertComputeRow(0, i, updater.computeRows(0, i)); } for (int i = 0; i < max+1; i++) { - assertComputeRow(i, 0, DetailTabRefreshHelper.computeRows(i, 0)); + assertComputeRow(i, 0, updater.computeRows(i, 0)); } - assertComputeRow(0, max, DetailTabRefreshHelper.computeRows(0, max+1)); - assertComputeRow(max, 0, DetailTabRefreshHelper.computeRows(max+1, 0)); + assertComputeRow(0, max, updater.computeRows(0, max+1)); + assertComputeRow(max, 0, updater.computeRows(max+1, 0)); } @@ -43,14 +44,14 @@ public void testComputeRowAttachment(int nb) throws Exception { int pivot = max - nb; for (int i = 0; i < pivot + 1; i++) { - assertComputeRow(i, nb, DetailTabRefreshHelper.computeRows(i, nb)); + assertComputeRow(i, nb, updater.computeRows(i, nb)); } for (int i = pivot + 1; i < max+1; i++) { if (nb + i > max) { - int[] res = DetailTabRefreshHelper.computeRows(i, nb); + int[] res = updater.computeRows(i, nb); assertEquals(max, res[0] + res[1]); } else { - assertComputeRow(pivot, nb, DetailTabRefreshHelper.computeRows(i, nb)); + assertComputeRow(pivot, nb, updater.computeRows(i, nb)); } } } @@ -58,14 +59,14 @@ public void testComputeRowDescriptor(int nb) throws Exception { int pivot = max - nb; for (int i = 0; i < pivot + 1; i++) { - assertComputeRow(nb, i, DetailTabRefreshHelper.computeRows(nb, i)); + assertComputeRow(nb, i, updater.computeRows(nb, i)); } for (int i = pivot + 1; i < max+1; i++) { if (nb + i > max) { - int[] res = DetailTabRefreshHelper.computeRows(nb, i); + int[] res = updater.computeRows(nb, i); assertEquals(max, res[0] + res[1]); } else { - assertComputeRow(nb, pivot, DetailTabRefreshHelper.computeRows(nb, i)); + assertComputeRow(nb, pivot, updater.computeRows(nb, i)); } } }
participants (1)
-
tchemit@users.labs.libre-entreprise.org