Author: tchemit Date: 2008-02-24 19:54:25 +0000 (Sun, 24 Feb 2008) New Revision: 1219 Added: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryAddAction.java Removed: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExportElementToLocalAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExportElementToRemoteAction.java Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangePageAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangeSizorAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/CollapseAllAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ConnectAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DeleteElementAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DetailToTreeAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DownloadAttachmentAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExpandAllAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExportElementAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ResetSearchAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/SearchAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowDetailTabAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowSynchronizeTabAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/UnconnectAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryAbstractAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryDeleteAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryDeleteExportAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowListTabAbstractAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowTabAbstractAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractTabAction.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/DetailTabModel.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/HistoryModel.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/ListTabModel.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/ListTableModel.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/PaginationModel.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/QueryModel.java trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/SynchronizeTabModel.java Log: utilisation object de type Updater pour gerer la mise a jour des ui suite a une modification dans le modele d'onglet Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangePageAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangePageAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangePageAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -18,12 +18,9 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.actions; -import fr.cemagref.simexplorer.is.ui.swing.ui.JListTab; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerActionManager; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractTabAction; import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.ListTableModel; -import fr.cemagref.simexplorer.is.ui.swing.model.PaginationModel; import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerTab; import jaxx.runtime.JAXXObject; import jaxx.runtime.swing.JAXXTab; @@ -65,40 +62,22 @@ JComboBox jComboBox = getChangePageComboBox(myTab.getUI()); if (jComboBox == null || !jComboBox.isEnabled()) { return false; - } - ListTabModel model = (ListTabModel) myTab.getModel(); - Integer oldPage = model.getPagination().getCurrentPage(); + } + Integer oldPage = ((ListTabModel) myTab.getModel()).getPagination().getCurrentPage(); + Object o = jComboBox.getSelectedItem(); - if (o != null) { - newPage = Integer.valueOf(o + ""); - } - return o != null && !oldPage.equals(newPage); + log.info("selected number page "+o.getClass()+" : "+o); + newPage = o != null?null:Integer.valueOf(o + ""); + return newPage != null && !oldPage.equals(newPage); } @Override - protected void doAction(ActionEvent e) throws Exception { - // user ask to change page - final ListTabModel model = (ListTabModel) getModel(); - final PaginationModel pagination = model.getPagination(); - - int width = pagination.getWidth(); - long newFirstIndex = newPage * width; - - // save new firstIndex in model - pagination.setFirstIndex(newFirstIndex); - - // update model - model.updateTabModel(getContext(), (ListTableModel) ((JListTab) getUI()).getTable().getModel(), false); + protected void doAction(ActionEvent e) throws Exception { + ListTabModel model = (ListTabModel) getModel(); + model.setPageNumber(newPage); } @Override - public void updateUI() { - super.updateUI(); - // refresh ui - getTab().updateUI(getContext(),getMainUI()); - } - - @Override protected void clear() { setTab(null); newPage = null; Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangeSizorAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangeSizorAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ChangeSizorAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -18,11 +18,9 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.actions; -import fr.cemagref.simexplorer.is.entities.metadata.MetaData; -import fr.cemagref.simexplorer.is.ui.swing.ui.JListTab; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractTabAction; import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.ListTableModel; +import jaxx.util.SimplePaginationEnum; import javax.swing.Action; import javax.swing.JComboBox; @@ -43,7 +41,7 @@ public class ChangeSizorAction extends SimExplorerAbstractTabAction { private static final long serialVersionUID = 5137512273375524199L; - protected Integer newWidth; + protected SimplePaginationEnum newWidth; protected ListTabModel model; public ChangeSizorAction(String name) { @@ -57,10 +55,10 @@ return false; } model = (ListTabModel) getModel(); - Integer oldIndex = model.getPagination().getWidth(); + SimplePaginationEnum oldIndex = model.getPagination().getWidth(); Object o = jComboBox.getSelectedItem(); if (o != null) { - newWidth = Integer.valueOf(o + ""); + newWidth = (SimplePaginationEnum) o; } return o != null && !oldIndex.equals(newWidth); } @@ -69,24 +67,15 @@ protected void doAction(ActionEvent e) throws Exception { // on sauvegarde dans la config la nouvelle valeur boolean remote = model.isRemote(); - if (remote) { + /*if (remote) { getContext().getConfig().setRemoteSizor(newWidth); } else { getContext().getConfig().setLocalSizor(newWidth); - } - model.synch(remote, (MetaData) null); - // update model - model.updateTabModel(getContext(), (ListTableModel) ((JListTab) getUI()).getTable().getModel(), true); + }*/ + model.setWidth(newWidth); } @Override - public void updateUI() { - super.updateUI(); - // refresh ui - getTab().updateUI(getContext(),getMainUI()); - } - - @Override protected void clear() { // multi-tab action setTab(null); Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/CollapseAllAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/CollapseAllAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/CollapseAllAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -60,7 +60,7 @@ return false; } - tree = getTreeForAction("collapseAll", getActionName()); + tree = getTreeForAction(getUI(),"collapseAll", getActionName()); node = EntityTreeNodeHelper.getSelectedNodeOrRootNode(tree); return !(node == null || node.isLeaf()); } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ConnectAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ConnectAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ConnectAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -22,15 +22,10 @@ import fr.cemagref.simexplorer.is.exceptions.SimExplorerRuntimeException; import fr.cemagref.simexplorer.is.exceptions.UnreachableServiceException; import fr.cemagref.simexplorer.is.service.AuthenticationServiceHelper; -import fr.cemagref.simexplorer.is.ui.swing.ui.JDetailTab; -import fr.cemagref.simexplorer.is.ui.swing.ui.JListTab; import fr.cemagref.simexplorer.is.ui.swing.ui.LoginUI; import fr.cemagref.simexplorer.is.ui.swing.StorageServiceHelper; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractAction; -import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; -import fr.cemagref.simexplorer.is.ui.swing.ui.DetailTabRefreshHelper; -import fr.cemagref.simexplorer.is.ui.swing.ui.ListTabRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerMainUI; import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerTab; import static org.codelutin.i18n.I18n._; @@ -110,18 +105,15 @@ ui.getToggleTab_remote().setEnabled(true); JTabbedPane container = ui.getContent(); - DetailTabModel model = (DetailTabModel) SimExplorerTab.detail.getModel(); - JDetailTab tabUI = (JDetailTab) SimExplorerTab.detail.getUI(); if (SimExplorerTab.detail.isTabVisible(container)) { - DetailTabRefreshHelper.refreshSynchroniseAction(getContext(), tabUI, model); - DetailTabRefreshHelper.refreshExportAction(getMainUI(),getContext(),tabUI, model); + getDetailUpdater(this).refreshWithConnectAction(); } if (SimExplorerTab.local.isTabVisible(container)) { ListTabModel localListModel = (ListTabModel) SimExplorerTab.local.getModel(); if (!localListModel.isEmpty()) { - ListTabRefreshHelper.refreshListTablePopupMenu(ui,getContext(), (JListTab) SimExplorerTab.local.getUI(), localListModel); + getListUpdater(this,false).refreshListTablePopupMenu(localListModel); } } // } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DeleteElementAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DeleteElementAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DeleteElementAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -23,12 +23,8 @@ import fr.cemagref.simexplorer.is.ui.swing.StorageServiceHelper; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractTabAction; 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.SynchronizeTabModel; -import fr.cemagref.simexplorer.is.ui.swing.ui.JListTab; import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerTab; -import fr.cemagref.simexplorer.is.ui.swing.ui.SynchronizeTabRefreshHelper; import static org.codelutin.i18n.I18n._; import javax.swing.JOptionPane; @@ -91,7 +87,6 @@ return selectedUuid; } - @Override protected void doAction(ActionEvent e) throws Exception { super.doAction(e); @@ -99,48 +94,23 @@ // effectue la suppression boolean remote = selected.isRemote(); - StorageServiceHelper.deleteElement(getContext(), remote, selected.getUuid(), selected.getVersion().toString()); + String uuid = selected.getUuid(); + StorageServiceHelper.deleteElement(getContext(), remote, uuid, selected.getVersion().toString()); - { - ListTabModel model = SimExplorerTab.getListModel(remote); - JListTab ui = SimExplorerTab.getListUI(remote); - model.updateTabModel(getContext(), (ListTableModel) ui.getTable().getModel(), true); - } + SimExplorerTab.getListModel(remote).reload(); if (SimExplorerTab.synchronize.isTabVisible(getTabContainer())) { + SynchronizeTabModel model = (SynchronizeTabModel) SimExplorerTab.synchronize.getModel(); - LoggableElement item = model.getRootNode(remote); - if (item != null && item.getMetaData().getUuid().equals(selected.getUuid())) { - synchronizeModified = true; - oldLocalRoot = model.getRootNode(false); - oldRemoteRoot = model.getRootNode(true); - if (model.getRootNode(!remote)==null) { - model.setRootNode(null,false); - model.setRootNode(null,false); - } - selected.setRemote(!remote); - model.updateTabModel(getContext(), selected); - selected.setRemote(remote); - } + + model.reloadSources(getContext(), uuid, !remote,remote,!remote,remote); } // suppression de l'élément de l'historique (si present) - SimExplorerActionManager.fireAction("historyDelete", e.getSource()); + SimExplorerActionManager.fireSelectedAction("historyDelete", e.getSource(), selected); } - @Override - public void updateUI() { - SimExplorerTab.getListTab(selected.isRemote()).updateUI(getContext(), getMainUI()); - - // update detail model (delegue a l'action d'historique) - - if (synchronizeModified != null && synchronizeModified) { - SynchronizeTabRefreshHelper.updateTree(getMainUI(),getContext(), getTabContainer(), oldLocalRoot, oldRemoteRoot); - } - } - - @Override protected void clear() { super.clear(); Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DetailToTreeAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DetailToTreeAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DetailToTreeAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -19,14 +19,9 @@ package fr.cemagref.simexplorer.is.ui.swing.actions; import fr.cemagref.simexplorer.is.entities.data.LoggableElement; -import fr.cemagref.simexplorer.is.entities.metadata.Version; -import fr.cemagref.simexplorer.is.ui.swing.ui.JDetailTab; -import fr.cemagref.simexplorer.is.ui.swing.StorageServiceHelper; +import fr.cemagref.simexplorer.is.ui.swing.SimExplorerActionManager; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractTabAction; -import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; -import fr.cemagref.simexplorer.is.ui.swing.ui.DetailTabRefreshHelper; -import fr.cemagref.simexplorer.is.ui.swing.ui.EntityTreeNodeHelper; +import fr.cemagref.simexplorer.is.ui.swing.model.DataEntityModel; import java.awt.event.ActionEvent; @@ -47,13 +42,10 @@ ) public class DetailToTreeAction extends SimExplorerAbstractTabAction { - EntityTreeNode node; LoggableElement element; - String uuid; - Version version; - DetailTabModel model; private static final long serialVersionUID = 2165684159831076054L; + protected DataEntityModel selected; public DetailToTreeAction(String name) { super(name); @@ -64,34 +56,27 @@ if (!super.beforeAction(e)) { return false; } - model = (DetailTabModel) getModel(); - uuid = model.getDetail().getUuid(); - version = model.getSelectedVersion(); - element = StorageServiceHelper.getElement(getContext(), model.isRemote(), uuid, version.toString()); - return element != null; + if (selected == null) { + // on doit retrouver l'élément à traiter à partir de la source + selected = findSelectedItem(e); + } + return selected != null && selected.getUuid() != null; } @Override protected void doAction(ActionEvent e) throws Exception { - model.setRootNode(element); - // create navigation tree - EntityTreeNode root = EntityTreeNodeHelper.build(model.getRootNode(), model.isRemote()); - model.getHistory().add(root); - } + // on synchronise le nouvel element + //LoggableElement element1 = selected.getLe(getContext()); - @Override - public void updateUI() { - // push it in tree - DetailTabRefreshHelper.updateDetailNavigationTree(getMainUI(), (JDetailTab) getUI(), model.getHistory()); + //log.info("detailToTree selected : "+selected); + //getModel().synch(selected.isRemote(), element1); + // ajout de l'élément dans l'historique + SimExplorerActionManager.fireSelectedAction("historyAdd", e.getSource(),selected); } @Override protected void clear() { super.clear(); - node = null; - element = null; - version = null; - uuid = null; - model = null; + selected = null; } } \ No newline at end of file Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DownloadAttachmentAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DownloadAttachmentAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/DownloadAttachmentAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -40,7 +40,8 @@ longDescription = "simexplorer.action.downloadAttachment.help", smallIcon = "action/download-attachment.png", mnemonic = 'x', - hideActionText = true + hideActionText = true, + enabled = false ) public class DownloadAttachmentAction extends DownloadAbstractAction { @@ -57,24 +58,24 @@ DetailTabModel model = (DetailTabModel) getModel(); Integer selectedAttachment = model.getSelectedAttachmentIndex(); // FIXME !!! - return null; -// attachment = selected.getLe(context) getAttachment(selectedAttachment); -// if (attachment == null) { -// return null; -// } -// // ask user path where to save data -// String dir = FileUtil.getDirectory(_("simexplorer.action.download.attachment", attachment.getFileName(), selected.getMeta().getName() + " [" + selected.getVersion() + "]"), _("simexplorer.choose.dir")); -// if (dir == null) { -// // user cancel action -// return null; -// } -// File parent = new File(dir); -// if (!parent.exists()) { -// parent.mkdirs(); -// } -// File file; -// file = new File(parent, attachment.getFileName()); -// return file; + //return null; + attachment = selected.getLe(getContext()).getAttachment(selectedAttachment); + if (attachment == null) { + return null; + } + // ask user path where to save data + String dir = FileUtil.getDirectory(_("simexplorer.action.download.attachment", attachment.getFileName(), selected.getMeta().getName() + " [" + selected.getVersion() + "]"), _("simexplorer.choose.dir")); + if (dir == null) { + // user cancel action + return null; + } + File parent = new File(dir); + if (!parent.exists()) { + parent.mkdirs(); + } + File file; + file = new File(parent, attachment.getFileName()); + return file; } protected BufferedInputStream getInputStream() { Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExpandAllAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExpandAllAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExpandAllAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -60,7 +60,7 @@ if (!super.beforeAction(e)) { return false; } - tree = getTreeForAction("expandAll", getActionName()); + tree = getTreeForAction(getUI(), "expandAll", getActionName()); node = EntityTreeNodeHelper.getSelectedNodeOrRootNode(tree); return !(node == null || node.isLeaf()); } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExportElementAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExportElementAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExportElementAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -27,12 +27,9 @@ import fr.cemagref.simexplorer.is.ui.swing.model.DataEntityModel; import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.ListTableModel; import fr.cemagref.simexplorer.is.ui.swing.model.SimExplorerTabModel; import fr.cemagref.simexplorer.is.ui.swing.model.SynchronizeTabModel; -import fr.cemagref.simexplorer.is.ui.swing.ui.JListTab; import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerTab; -import fr.cemagref.simexplorer.is.ui.swing.ui.SynchronizeTabRefreshHelper; import jaxx.runtime.UIHelper; import jaxx.runtime.builder.TabModel; import static org.codelutin.i18n.I18n.n_; @@ -60,12 +57,6 @@ protected StorageService toService; /** le modèle de sélection */ protected DataEntityModel selected; - /** flag pour indiquer si le model de l'onglet de synchro a ete modifie */ - protected Boolean synchronizeModified; - /** l'ancien local root node de la synchro */ - protected LoggableElement oldLocalRoot; - /** l'ancien remote root node de la synchro */ - protected LoggableElement oldRemoteRoot; private static final long serialVersionUID = 7535647131305304738L; @@ -150,52 +141,40 @@ @Override protected void doAction(ActionEvent e) throws Exception { boolean remote = selected.isRemote(); + StorageService fromService = StorageServiceHelper.getService(getContext(), remote); StorageService toService = StorageServiceHelper.getService(getContext(), !remote); + log.info("fromService : " + fromService); log.info("toService : " + toService); log.info("selected : " + selected); - fr.cemagref.simexplorer.is.service.StorageServiceHelper.exportElementTo(getContext().getToken(), fromService, toService, selected.getUuid(), selected.getVersion().toString()); - { - ListTabModel model = SimExplorerTab.getListModel(!remote); - JListTab ui = SimExplorerTab.getListUI(!remote); - model.updateTabModel(getContext(), (ListTableModel) ui.getTable().getModel(), true); - } + String uuid = selected.getUuid(); + fr.cemagref.simexplorer.is.service.StorageServiceHelper.exportElementTo(getContext().getToken(), fromService, toService, uuid, selected.getVersion().toString()); + SimExplorerTab.getListModel(!remote).reload(); + if (SimExplorerTab.synchronize.isTabVisible(getTabContainer())) { SynchronizeTabModel model = (SynchronizeTabModel) SimExplorerTab.synchronize.getModel(); - LoggableElement item = model.getRootNode(remote); - if (item != null && item.getMetaData().getUuid().equals(selected.getUuid())) { - synchronizeModified = true; - oldLocalRoot = model.getRootNode(false); - oldRemoteRoot = model.getRootNode(true); - model.updateTabModel(getContext(), selected); - } + + model.reloadSources(getContext(), uuid, false,false,remote,!remote); } // suppression de l'élément de l'historique (si present) - SimExplorerActionManager.fireAction("historyDeleteExport", e.getSource()); + SimExplorerActionManager.fireSelectedAction("historyDeleteExport", e.getSource(), selected); } @Override public void updateUI() { - SimExplorerTab.getListTab(!selected.isRemote()).updateUI(getContext(), getMainUI()); - // update detail model (delegue a l'action d'historique) - if (synchronizeModified != null && synchronizeModified) { - SynchronizeTabRefreshHelper.updateTree(getMainUI(), getContext(), getTabContainer(), oldLocalRoot, oldRemoteRoot); - } } @Override protected void clear() { selected = null; fromService = toService = null; - oldLocalRoot = oldRemoteRoot = null; - synchronizeModified = null; // l'action est multi-tab setTab(null); } Deleted: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExportElementToLocalAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExportElementToLocalAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExportElementToLocalAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -1,63 +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.actions; - -import fr.cemagref.simexplorer.is.entities.EntityHelper; -import fr.cemagref.simexplorer.is.entities.data.LoggableElement; -import fr.cemagref.simexplorer.is.ui.swing.model.DataEntityModel; -import fr.cemagref.simexplorer.is.ui.swing.model.SynchronizeTabModel; - -import java.awt.event.ActionEvent; - -/** - * Action pour exporter un élément vers la base locale - * - * @author chemit - */ - at jaxx.runtime.builder.ActionConfig( - actionCommand = "exportElementToLocal", - name = "simexplorer.action.exportElementToLocal", - longDescription = "simexplorer.action.exportElementToLocal.help", - smallIcon = "action/export-element-to-local.png", - mnemonic = 'x', - hideActionText = true -) -public class ExportElementToLocalAction extends ExportElementAction { - - private static final long serialVersionUID = 7535647131305304738L; - - public ExportElementToLocalAction(String name) { - super(name); - } - - @Override - protected boolean beforeAction(ActionEvent e) throws Exception { - if (!super.beforeAction(e)) { - return false; - } - SynchronizeTabModel model = (SynchronizeTabModel) getModel(); - LoggableElement element = model.getSelectedNode(true); - boolean result; - if (result = EntityHelper.Action.EXPORT.accept(element)) { - selected = new DataEntityModel(); - selected.synch(true, element); - } - return result; - } -} \ No newline at end of file Deleted: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExportElementToRemoteAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExportElementToRemoteAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ExportElementToRemoteAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -1,63 +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.actions; - -import fr.cemagref.simexplorer.is.entities.EntityHelper; -import fr.cemagref.simexplorer.is.entities.data.LoggableElement; -import fr.cemagref.simexplorer.is.ui.swing.model.DataEntityModel; -import fr.cemagref.simexplorer.is.ui.swing.model.SynchronizeTabModel; - -import java.awt.event.ActionEvent; - -/** - * Action pour exporter un élément vers la base distante - * - * @author chemit - */ - at jaxx.runtime.builder.ActionConfig( - actionCommand = "exportElementToRemote", - name = "simexplorer.action.exportElementToRemote", - longDescription = "simexplorer.action.exportElementToRemote.help", - smallIcon = "action/export-element-to-remote.png", - mnemonic = 'x', - hideActionText = true -) -public class ExportElementToRemoteAction extends ExportElementAction { - - private static final long serialVersionUID = 7535647131305304738L; - - public ExportElementToRemoteAction(String name) { - super(name); - } - - @Override - protected boolean beforeAction(ActionEvent e) throws Exception { - if (!super.beforeAction(e)) { - return false; - } - SynchronizeTabModel model = (SynchronizeTabModel) getModel(); - LoggableElement element = model.getSelectedNode(false); - boolean result; - if (result = EntityHelper.Action.EXPORT.accept(element)) { - selected = new DataEntityModel(); - selected.synch(false, element); - } - return result; - } -} \ No newline at end of file Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ResetSearchAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ResetSearchAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ResetSearchAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -18,11 +18,8 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.actions; -import fr.cemagref.simexplorer.is.entities.metadata.MetaData; -import fr.cemagref.simexplorer.is.ui.swing.ui.JListTab; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractTabAction; import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.ListTableModel; import java.awt.event.ActionEvent; @@ -52,14 +49,11 @@ @Override protected boolean beforeAction(ActionEvent e) throws Exception { ListTabModel model = (ListTabModel) getModel(); - JListTab ui = (JListTab) getUI(); - // always clean the input text (should be done in jaxx) - ui.getSearchText().setText(null); - if (!model.getQuery().hasQuery()) { + + if (!model.hasQuery()) { // directly refresh search actions // but do not realize action - updateUI(); - //ListTabRefreshHelper.refreshSearchActions(ui,model); + getListUpdater(this, model.isRemote()).resetSearch(); return false; } // only reset search if something was previously search @@ -68,27 +62,11 @@ @Override protected void doAction(ActionEvent e) throws Exception { - - ListTabModel model = (ListTabModel) getModel(); - // reset query in model - model.setQuery(null); - // reset selected item - model.synch(model.isRemote(), (MetaData) null); - log.info("sync " + model.getSelectedItem()); - - // update model - model.updateTabModel(getContext(), (ListTableModel) ((JListTab) getUI()).getTable().getModel(), true); + ((ListTabModel) getModel()).resetQuery(); } @Override - public void updateUI() { - super.updateUI(); - // refresh ui - getTab().updateUI(getContext(),getMainUI()); - } - - @Override protected void clear() { super.clear(); setTab(null); Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/SearchAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/SearchAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/SearchAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -18,11 +18,8 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.actions; -import fr.cemagref.simexplorer.is.entities.metadata.MetaData; -import fr.cemagref.simexplorer.is.ui.swing.ui.JListTab; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractTabAction; import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; -import fr.cemagref.simexplorer.is.ui.swing.model.ListTableModel; import javax.swing.JTextField; import java.awt.event.ActionEvent; @@ -56,32 +53,17 @@ JTextField uiObject = (JTextField) getUIObject("searchText"); query = uiObject.getText(); ListTabModel model = (ListTabModel) getModel(); - return !query.isEmpty() && !query.equals(model.getQuery().getQuery()); + return !query.isEmpty() && !query.equals(model.getQuery()); } @Override protected void doAction(ActionEvent e) throws Exception { - ListTabModel model = (ListTabModel) getModel(); - model.getQuery().setQuery(query); - // on supprime la selection courante avant tout - model.synch(model.isRemote(), (MetaData) null); - model.setSelectedIndex(-1); - - //model.getQuery().setSortAscending(false); - //model.getQuery().setSortColumn(SortColumn.None); - - // update model - model.updateTabModel(getContext(), (ListTableModel) ((JListTab) getUI()).getTable().getModel(), true); + ListTabModel model = (ListTabModel) getModel(); + model.setQuery(query); } @Override - public void updateUI() { - // refresh tab ui - getTab().updateUI(getContext(),getMainUI()); - } - - @Override protected void clear() { query = null; setTab(null); Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowDetailTabAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowDetailTabAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowDetailTabAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -19,29 +19,29 @@ 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.ui.JDetailTab; +import fr.cemagref.simexplorer.is.ui.swing.SimExplorerActionManager; import fr.cemagref.simexplorer.is.ui.swing.StorageServiceHelper; import fr.cemagref.simexplorer.is.ui.swing.actions.util.ShowTabAbstractAction; +import fr.cemagref.simexplorer.is.ui.swing.actions.util.SelectedAction; import fr.cemagref.simexplorer.is.ui.swing.model.DataEntityModel; import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; -import fr.cemagref.simexplorer.is.ui.swing.ui.DetailTabRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.ui.EntityTreeNodeHelper; +import fr.cemagref.simexplorer.is.ui.swing.ui.JDetailTab; import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerTab; +import fr.cemagref.simexplorer.is.ui.swing.ui.TreeActionsUpdater; -import javax.swing.DefaultComboBoxModel; +import javax.swing.AbstractButton; +import javax.swing.JTree; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.TreePath; +import java.awt.Component; import java.awt.event.ActionEvent; 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. @@ -59,36 +59,48 @@ longDescription = "simexplorer.action.showTab_detail.help", smallIcon = "action/show-tab-detail.png", mnemonic = 'd', - hideActionText = false + hideActionText = true ) -public class ShowDetailTabAction extends ShowTabAbstractAction<JDetailTab, DetailTabModel> { +public class ShowDetailTabAction extends ShowTabAbstractAction<JDetailTab, DetailTabModel> implements SelectedAction { + /** la donnée à afficher dans l'onglet de détail */ protected DataEntityModel selected; - /** le listener de navigation dans l'arbre */ - protected NavigationSelectionListener navigationListener; - /** le listener de navigation dans les versions */ - protected VersionSelectionListener versionListener; - /** le listener de navigation dans les fichiers attachés */ - protected AttachmentSelectionListener attachmentListener; private static final long serialVersionUID = 6643631041114311643L; public ShowDetailTabAction(String name) { super(name); - navigationListener = new NavigationSelectionListener(); - versionListener = new VersionSelectionListener(); - attachmentListener = new AttachmentSelectionListener(); } @Override + public String getI18nToolTipText() { + return "simexplorer.action.showTab_detail.tooltip"; + } + + @Override protected boolean beforeAction(ActionEvent e) throws Exception { if (!super.beforeAction(e)) { return false; } if (selected == null) { - // on doit retrouver l'élément à traiter à partir de la source - selected = findSelectedItem(e); - } + SimExplorerTab sourceTab = SimExplorerTab.findTab((Component) e.getSource()); + if (sourceTab == SimExplorerTab.synchronize) { + // find the tree + JTree tree = getTreeForAction(SimExplorerTab.synchronize.getUI(), "showTab", getParam()); + //JTree tree = getTreeForAction("showTab", getParam().substring(7)); + if (tree != null) { + log.debug("---------------------- incoming tree " + tree); + EntityTreeNode node = EntityTreeNodeHelper.getSelectedNode(tree); + if (node != null) { + selected = new DataEntityModel(); + selected.synch(node); + } + } + } else { + // on doit retrouver l'élément à traiter à partir de la source + selected = findSelectedItem(e); + } + } boolean selectedUuid = selected != null && selected.getUuid() != null; if (!selectedUuid) { return false; @@ -101,25 +113,70 @@ detailModel.setSelectedItem(selected); // chargement de l'élément à partir du service - // délégué au model de selection - LoggableElement element = (LoggableElement) detailModel.getSelectedItem().get(getContext()); - - // positionnement du rootNode du modèle - detailModel.setRootNode(element); - - return element != null; + // délégué au model de selection + return detailModel.getSelectedItem().getLe(getContext()) != null; } + NavigationSelectionListener navigationSelectionListener; + TreeActionUpdater treeActionUpdater; + VersionSelectionListener versionSelectionListener; + AttachmentSelectionListener attachmentSelectionListener; + protected void initFirstUsage(final JDetailTab ui, final DetailTabModel model) { // add a listener on navigation tree - ui.getNavigationTree().addTreeSelectionListener(navigationListener); + navigationSelectionListener = new NavigationSelectionListener(); + ui.getNavigationTree().addTreeSelectionListener(navigationSelectionListener); + + // add a listener to refresh navigation toolbar actions + treeActionUpdater = new TreeActionUpdater(); + ui.getNavigationTree().addTreeSelectionListener(treeActionUpdater); + // add a listener on versions list - ui.getDetailVersions().addItemListener(versionListener); + versionSelectionListener = new VersionSelectionListener(); + ui.getDetailVersions().addItemListener(versionSelectionListener); + // add a listener on attachments list - ui.getDetailAttachments().addListSelectionListener(attachmentListener); + attachmentSelectionListener = new AttachmentSelectionListener(); + ui.getDetailAttachments().addListSelectionListener(attachmentSelectionListener); + + // init updater listens the model + getDetailUpdater(this).initListeners(); } + public void setSelected(DataEntityModel selected) { + this.selected = selected; + } + @Override + protected void updateUI(JDetailTab ui, DetailTabModel model) { + + // ajout de l'élément dans l'historique + SimExplorerActionManager.fireSelectedAction("historyAdd", e.getSource(),selected); + } + + @Override + public void disposeUI() { + super.disposeUI(); + if (navigationSelectionListener!=null) { + getTabUI().getNavigationTree().removeTreeSelectionListener(navigationSelectionListener); + navigationSelectionListener=null; + } + if (treeActionUpdater!=null) { + getTabUI().getNavigationTree().removeTreeSelectionListener(treeActionUpdater); + treeActionUpdater=null; + } + if (versionSelectionListener!=null) { + getTabUI().getDetailVersions().removeItemListener(versionSelectionListener); + versionSelectionListener=null; + } + + if (attachmentSelectionListener!=null) { + getTabUI().getDetailAttachments().removeListSelectionListener(attachmentSelectionListener); + attachmentSelectionListener=null; + } + } + + @Override protected void clear() { super.clear(); selected = null; @@ -130,203 +187,75 @@ * * @author chemit */ - protected class NavigationSelectionListener implements TreeSelectionListener, PropertyChangeListener { + protected class NavigationSelectionListener implements TreeSelectionListener { - public NavigationSelectionListener() { - getTabModel().addPropertyChangeListener(DetailTabModel.SELECTED_NODE_PROPERTY_CHANGED, this); - } - public void valueChanged(TreeSelectionEvent e) { + DetailTabModel model = getTabModel(); - TreePath path = e.getNewLeadSelectionPath(); - EntityTreeNode node = null; - if (path != null) { - node = (EntityTreeNode) path.getLastPathComponent(); - } - - // 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. + // always reset version index and attachment, since it will be + // write again, this will prevent us to have two events : once for + // XXX -> null, then null -> YYY model.resetSelectedVersion(); - // update history list - LoggableElement element = node == null ? null : node.getLoggableElement(); - boolean history = element != null; - Version selectedVersion; - Integer selectedAttachment; - Version[] versions; - if (!history) { - versions = null; - selectedVersion = null; - selectedAttachment = null; - } else { - versions = StorageServiceHelper.getVersions(getContext(), model.isRemote(), element.getMetaData().getUuid()); - selectedVersion = element.getMetaData().getVersion(); - selectedAttachment = element.getAttachments().isEmpty() ? null : 0; - } + // update versions list + EntityTreeNode node = EntityTreeNodeHelper.getSelectedNode(e); - model.setVersions(versions); - model.setDetail(element == null ? null : element.getMetaData()); + LoggableElement element = null; + if (node != null) { + element = node.getLoggableElement(); + if (node.isLoggableElement()) { + + Version[] versions; + versions = StorageServiceHelper.getVersions(getContext(), node.isRemote(), element.getMetaData().getUuid()); + model.setVersions(versions); + } + } // le node est acceptable uniquement si c'est un loggableElement model.setSelectedNode(element); - - // on positionne la version selectionnee - model.setSelectedVersion(selectedVersion); - - // on positionne l'attachment selectionne - model.setSelectedAttachmentIndex(selectedAttachment); - - //TODO on ne doit pas modifier les ui dans cette méthode - // on rafraichit toujours ici les actions de l'arbre qui sont - // indépendantes du model et dépendent juste du noeud sélectionné - DetailTabRefreshHelper.refreshTreeDetailActions(getTabUI(), node); } - /** - * Notify a modification in the model. - * <p/> - * This method will update ui. - * - * @param evt event coming from DetailTabModel - */ - public void propertyChange(PropertyChangeEvent evt) { - if (log.isDebugEnabled()) { - log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); - } - JDetailTab ui = getTabUI(); - DetailTabModel model = getTabModel(); - DefaultComboBoxModel historyModel = (DefaultComboBoxModel) ui.getDetailVersions().getModel(); - - boolean wasEnable = versionListener.isEnabled(); - boolean wasEnable2 = attachmentListener.isEnabled(); - // disable version listener on selection (we already have updated model) - versionListener.setEnabled(false); - attachmentListener.setEnabled(false); - // refresh ui - DetailTabRefreshHelper.resetHistory(ui, model, historyModel); - // push back previous state of version listener - versionListener.setEnabled(wasEnable); - attachmentListener.setEnabled(wasEnable2); - // update actions on toolbar - EntityTreeNode node = EntityTreeNodeHelper.getSelectedNode(ui.getNavigationTree()); - DetailTabRefreshHelper.refreshDetailActions(getMainUI(),getContext(), ui, model, node); - - EntityTreeNode rootNode = EntityTreeNodeHelper.getRootNode(ui.getNavigationTree()); - if (model.getDetail() != null && !node.equals(rootNode)) { - // refresh detail to tree button only if required - DetailTabRefreshHelper.refreshDetailToTreeAction(ui, model); - } - } } - private class VersionSelectionListener implements PropertyChangeListener, ItemListener { + private class VersionSelectionListener implements ItemListener { - protected boolean enabled; - - public VersionSelectionListener() { - enabled = true; - getTabModel().addPropertyChangeListener(DetailTabModel.SELECTED_VERSION_INDEX_PROPERTY_CHANGED, this); - } - public void itemStateChanged(ItemEvent e) { - if (!isEnabled()) { - return; - } + JDetailTab ui = getTabUI(); - DetailTabModel model = getTabModel(); - MetaData metas; Object selectedItem = ui.getDetailVersions().getSelectedItem(); if (selectedItem == null) { - throw new NullPointerException("can not have a selectedItem null"); + // no item selected, so nothing to do + return; } - Integer selectedAttachment; - Version selectedVersion = Version.valueOf(selectedItem.toString()); - if (log.isDebugEnabled()) { - log.debug("selected version (" + selectedVersion + ") " + selectedItem); - } - metas = StorageServiceHelper.getMetaData( - getContext(), - model.isRemote(), - model.getSelectedNode().getMetaData().getUuid(), - selectedVersion.toString() - ); - // FIXME !!! - selectedAttachment = null; -// selectedAttachment = metas.getAttachments().isEmpty() ? null : 0; + DetailTabModel model = getTabModel(); - model.setDetail(metas); + Version selectedVersion = Version.valueOf(selectedItem.toString()); + //if (log.isDebugEnabled()) { + log.info("selected version (" + selectedVersion + ") " + selectedItem); + //} - // finally change selectedIndex - model.setSelectedVersion(selectedVersion); + DataEntityModel item = model.getSelectedItem().cloneSafe(); - // on positionne l'attachment selectionne - model.setSelectedAttachmentIndex(selectedAttachment); + item.synch(item.isRemote(), model.getDetailNode().getMetaData().getUuid(), selectedVersion); - // refresh detail to tree button - DetailTabRefreshHelper.refreshDetailToTreeAction(ui, model); - } + // synchronize model + model.setSelectedItem(item); - /** - * 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) { - if (log.isDebugEnabled()) { - log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); - } - Integer index = (Integer) evt.getNewValue(); - JDetailTab ui = getTabUI(); - DetailTabModel model = getTabModel(); - LoggableElement selectedNode = model.getSelectedNode(); - boolean wasEnable = isEnabled(); - boolean wasEnable2 = attachmentListener.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); - attachmentListener.setEnabled(false); + LoggableElement element = item.getLe(getContext()); - if (index == null || index == -1) { - DetailTabRefreshHelper.resetDetailPanel(ui); - } else { - DetailTabRefreshHelper.updateDetailPanel(index, ui, model, selectedNode); - } - setEnabled(wasEnable); - attachmentListener.setEnabled(wasEnable2); - ui.getDetailAttachments().setSelectedIndex(0); - // update actions on toolbar - EntityTreeNode node = EntityTreeNodeHelper.getSelectedNodeOrRootNode(ui.getNavigationTree()); - DetailTabRefreshHelper.refreshDetailActions(getMainUI(),getContext(), ui, model, node); - } + log.info("----- new detaul " + element); + model.setDetailNode(element); - public boolean isEnabled() { - return enabled; - } + model.setSelectedVersion(selectedVersion); - public void setEnabled(boolean enabled) { - this.enabled = enabled; } - } - private class AttachmentSelectionListener implements PropertyChangeListener, ListSelectionListener { + private class AttachmentSelectionListener implements ListSelectionListener { - protected boolean enabled; - - public AttachmentSelectionListener() { - enabled = true; - getTabModel().addPropertyChangeListener(DetailTabModel.SELECTED_ATTACHMENT_INDEX_PROPERTY_CHANGED, this); - } - public void valueChanged(ListSelectionEvent e) { if (!isEnabled()) { return; @@ -334,47 +263,28 @@ JDetailTab ui = getTabUI(); DetailTabModel model = getTabModel(); Object selectedItem = ui.getDetailAttachments().getSelectedValue(); - if (selectedItem == null) { - throw new NullPointerException("can not have a attachment null"); + Integer index = null; + + if (selectedItem != null) { + Attachment attachment = (Attachment) selectedItem; + if (log.isDebugEnabled()) { + log.debug("selected attachment (" + attachment + ") " + selectedItem); + } + index = ui.getDetailAttachments().getSelectedIndex(); } - Attachment attachment = (Attachment) selectedItem; - if (log.isDebugEnabled()) { - log.debug("selected attachment (" + attachment + ") " + selectedItem); - } - // finally change selectedIndex - model.setSelectedAttachmentIndex(ui.getDetailAttachments().getSelectedIndex()); + model.setSelectedAttachmentIndex(index); } + } - /** - * 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) { - if (log.isDebugEnabled()) { - log.debug(evt.getPropertyName() + " old:" + evt.getOldValue() + ", new:" + evt.getNewValue()); - } - JDetailTab ui = getTabUI(); - DetailTabModel model = getTabModel(); - 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); - DetailTabRefreshHelper.refreshDownloadAttachmentAction(ui, model); - setEnabled(wasEnable); - } + private class TreeActionUpdater extends TreeActionsUpdater { - public boolean isEnabled() { - return enabled; + protected AbstractButton getExpandAction() { + return getTabUI().getExpandAllDetail(); } - public void setEnabled(boolean enabled) { - this.enabled = enabled; + protected AbstractButton getCollapseAction() { + return getTabUI().getCollapseAllDetail(); } } - } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowSynchronizeTabAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowSynchronizeTabAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/ShowSynchronizeTabAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -25,13 +25,14 @@ import fr.cemagref.simexplorer.is.ui.swing.model.SynchronizeTabModel; import fr.cemagref.simexplorer.is.ui.swing.ui.EntityTreeNodeHelper; import fr.cemagref.simexplorer.is.ui.swing.ui.JSynchronizeTab; +import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerMainUI; import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerTab; +import fr.cemagref.simexplorer.is.ui.swing.ui.TreeActionsUpdater; +import javax.swing.AbstractButton; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import java.awt.event.ActionEvent; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; /** * Action pour afficher le tab de synchronisation @@ -61,6 +62,8 @@ protected TreeSelectionListener navigationRemoteListener; protected TreeSelectionListener navigationActionsRemoteListener; + protected LoggableElement[] sources; + public ShowSynchronizeTabAction(String name) { super(name); } @@ -76,42 +79,62 @@ return false; } - SynchronizeTabModel model = (SynchronizeTabModel) SimExplorerTab.synchronize.getModel(); - // init synchronize tab model - model.updateTabModel(getContext(), selected); + sources = ((SynchronizeTabModel) SimExplorerTab.synchronize.getModel()).guessSources(getContext(), selected); return true; } protected void initFirstUsage(JSynchronizeTab ui, SynchronizeTabModel model) { - navigationLocalListener = new NavigationSelectionListener(false); - navigationRemoteListener = new NavigationSelectionListener(true); + navigationLocalListener = new NavigationSelectionListener(model, false); + navigationRemoteListener = new NavigationSelectionListener(model, true); navigationActionsLocalListener = new NavigationActionsSelectionListener(ui, false); navigationActionsRemoteListener = new NavigationActionsSelectionListener(ui, true); + // add a listener on navigation tree ui.getTree(false).addTreeSelectionListener(navigationLocalListener); ui.getTree(false).addTreeSelectionListener(navigationActionsLocalListener); ui.getTree(true).addTreeSelectionListener(navigationRemoteListener); ui.getTree(true).addTreeSelectionListener(navigationActionsRemoteListener); + // init updater listens the model + getSynchronizeUpdater(this).initListeners(); + + ui.getShowTabLocal_detail().setHideActionText(true); + ui.getShowTabRemote_detail().setHideActionText(true); } @Override + protected void updateUI(JSynchronizeTab ui, SynchronizeTabModel model) { + model.setSources(sources); + } + + @Override public void disposeUI() { super.disposeUI(); JSynchronizeTab ui = getTabUI(); if (navigationActionsLocalListener != null) { - ui.getTree(false).removeTreeSelectionListener(navigationLocalListener); - ui.getTree(false).removeTreeSelectionListener(navigationActionsLocalListener); - ui.getTree(true).removeTreeSelectionListener(navigationRemoteListener); - ui.getTree(true).removeTreeSelectionListener(navigationActionsRemoteListener); + ui.getTree(false).removeTreeSelectionListener(navigationActionsLocalListener ); + navigationActionsLocalListener=null; } + if (navigationActionsRemoteListener!= null) { + ui.getTree(false).removeTreeSelectionListener(navigationActionsRemoteListener); + navigationActionsRemoteListener=null; + } + if (navigationLocalListener!= null) { + ui.getTree(true).removeTreeSelectionListener(navigationLocalListener); + navigationLocalListener=null; + } + if (navigationActionsRemoteListener != null) { + ui.getTree(true).removeTreeSelectionListener(navigationActionsRemoteListener ); + navigationActionsRemoteListener =null; + } } @Override protected void clear() { super.clear(); selected = null; + sources = null; } /** @@ -119,7 +142,7 @@ * * @author chemit */ - protected class NavigationActionsSelectionListener implements TreeSelectionListener { + protected static class NavigationActionsSelectionListener extends TreeActionsUpdater { protected final boolean remote; protected JSynchronizeTab ui; @@ -129,12 +152,21 @@ this.ui = ui; } + @Override public void valueChanged(TreeSelectionEvent e) { - // get EntityTreeNode + super.valueChanged(e); EntityTreeNode node = EntityTreeNodeHelper.getSelectedNode(e); - // refresh tree actions - EntityTreeNodeHelper.refreshTreeActions(ui.getCollapseButton(remote), ui.getExpandButton(remote), node); + boolean enable = node != null && node.isLoggableElement(); + SimExplorerMainUI.UpdateButton(ui.getShowDetailButton(remote), enable, !enable ? null : node.getLoggableElement()); } + + protected AbstractButton getExpandAction() { + return ui.getExpandButton(remote); + } + + protected AbstractButton getCollapseAction() { + return ui.getCollapseButton(remote); + } } /** @@ -142,38 +174,24 @@ * * @author chemit */ - protected class NavigationSelectionListener implements TreeSelectionListener, PropertyChangeListener { + protected static class NavigationSelectionListener implements TreeSelectionListener { protected boolean remote; + SynchronizeTabModel model; - public NavigationSelectionListener(boolean remote) { + public NavigationSelectionListener(SynchronizeTabModel model, boolean remote) { this.remote = remote; - SynchronizeTabModel model = getTabModel(); - getTabModel().addPropertyChangeListener(model.getSelectedProperty(remote), this); + this.model = model; + } public void valueChanged(TreeSelectionEvent e) { - SynchronizeTabModel model = getTabModel(); - EntityTreeNode node = EntityTreeNodeHelper.getSelectedNode(e); LoggableElement element = node == null ? null : node.getLoggableElement(); model.setSelectedNode(element, remote); } - - /** - * 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()); - LoggableElement sNode = getTabModel().getSelectedNode(remote); - getMainUI().refreshExportElement(getContext(), getTabUI().getExportButton(remote), remote, sNode); - } } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/UnconnectAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/UnconnectAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/UnconnectAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -18,18 +18,14 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.actions; -import fr.cemagref.simexplorer.is.ui.swing.ui.JDetailTab; -import fr.cemagref.simexplorer.is.ui.swing.ui.JListTab; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerActionManager; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractAction; -import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; import fr.cemagref.simexplorer.is.ui.swing.model.HistoryModel; import fr.cemagref.simexplorer.is.ui.swing.model.ListTabModel; -import fr.cemagref.simexplorer.is.ui.swing.ui.DetailTabRefreshHelper; -import fr.cemagref.simexplorer.is.ui.swing.ui.ListTabRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerMainUI; import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerTab; +import fr.cemagref.simexplorer.is.ui.swing.ui.ListTabUpdater; import javax.swing.JTabbedPane; import java.awt.event.ActionEvent; @@ -96,8 +92,6 @@ ui.getToggleTab_remote().setEnabled(false); JTabbedPane container = ui.getContent(); - DetailTabModel model = (DetailTabModel) SimExplorerTab.detail.getModel(); - JDetailTab tabUI = (JDetailTab) SimExplorerTab.detail.getUI(); // close all connected ui @@ -117,20 +111,17 @@ // select current history element EntityTreeNode node = history.getCurrent(); - model.synch(node); - //model.setRemote(node.isRemote()); - //model.setRootNode((LoggableElement) node.getUserObject()); - DetailTabRefreshHelper.updateDetailNavigationTree(tabUI, model.getHistory()); + model.synch(node); + getDetailUpdater(this).updateDetailNavigationTree(tabUI, model.getHistory()); } }*/ if (SimExplorerTab.detail.isTabVisible(container)) { - DetailTabRefreshHelper.refreshSynchroniseAction(getContext(), tabUI, model); - DetailTabRefreshHelper.refreshExportAction(getMainUI(),getContext(),tabUI, model); + getDetailUpdater(this).refreshWithConnectAction(); } if (SimExplorerTab.local.isTabVisible(container)) { - ListTabRefreshHelper.refreshListTablePopupMenu(ui,getContext(), (JListTab) SimExplorerTab.local.getUI(), (ListTabModel) SimExplorerTab.local.getModel()); + getListUpdater(this,false).refreshListTablePopupMenu((ListTabModel) SimExplorerTab.local.getModel()); } // } //}); Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryAbstractAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryAbstractAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryAbstractAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -17,15 +17,12 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.actions.history; -import fr.cemagref.simexplorer.is.entities.metadata.MetaData; -import fr.cemagref.simexplorer.is.ui.swing.ui.JDetailTab; +import fr.cemagref.simexplorer.is.entities.data.LoggableElement; import fr.cemagref.simexplorer.is.ui.swing.actions.util.SimExplorerAbstractTabAction; import fr.cemagref.simexplorer.is.ui.swing.model.DetailTabModel; import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; import fr.cemagref.simexplorer.is.ui.swing.model.HistoryModel; -import fr.cemagref.simexplorer.is.ui.swing.ui.DetailTabRefreshHelper; import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerTab; -import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerMainUI; import java.awt.event.ActionEvent; @@ -80,22 +77,21 @@ } DetailTabModel model = (DetailTabModel) getModel(); if (node == null) { - model.synch(model.isRemote(), (MetaData) null); + model.synch(model.isRemote(), (LoggableElement) null); } else { model.synch(node); } + // set the new root node + model.setRootNode(node); } @Override - public void updateUI() { - if (!history.isEmpty()) { - // select current history element - DetailTabRefreshHelper.updateDetailNavigationTree(getMainUI(),(JDetailTab) getUI(), history); - } else if (getTab().isTabVisible(getTabContainer())) { - SimExplorerMainUI.UpdateButton(getMainUI().getHistoryReset(), !history.isEmpty()); - // close tab, no more history - getTab().closeTab(getMainUI(), getTabContainer()); - + public void updateUI() { + if (history.isEmpty()) { + if (getTab().isTabVisible(getTabContainer())) { + // close tab, no more history + getTab().closeTab(getMainUI(), getTabContainer()); + } } } Added: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryAddAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryAddAction.java (rev 0) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryAddAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -0,0 +1,112 @@ +/* +* ##% 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.actions.history; + +import fr.cemagref.simexplorer.is.entities.data.LoggableElement; +import fr.cemagref.simexplorer.is.entities.metadata.Version; +import fr.cemagref.simexplorer.is.ui.swing.model.DataEntityModel; +import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; +import fr.cemagref.simexplorer.is.ui.swing.model.HistoryModel; +import fr.cemagref.simexplorer.is.ui.swing.ui.EntityTreeNodeHelper; +import fr.cemagref.simexplorer.is.ui.swing.actions.util.SelectedAction; + +import java.util.List; + +/** + * Action d'ajout de l'item dans l'historique + * + * @author chemit + */ + at jaxx.runtime.builder.ActionConfig( + actionCommand = "historyAdd", + name = "simexplorer.action.historyAdd", + shortDescription = "simexplorer.action.historyAdd.tooltip", + longDescription = "simexplorer.action.historyAdd.help", + hideActionText = true +) +public class HistoryAddAction extends HistoryAbstractAction implements SelectedAction { + + private static final long serialVersionUID = 2165684159831076054L; + + protected DataEntityModel selected; + + public HistoryAddAction(String name) { + super(name); + } + + protected boolean hasHistoryEntry(HistoryModel<EntityTreeNode> model) { + // cette action doit toujours être configurée avant lancement + if (selected==null) { + throw new IllegalStateException("the SelectedAction ("+getActionName()+") must have a not null selected before action performed"); + } + return true; + } + + protected EntityTreeNode getHistoryEntry(HistoryModel<EntityTreeNode> model) { + int pos = 0; + List<EntityTreeNode> datas = model.getData(); + boolean remote = selected.isRemote(); + String uuid = selected.getUuid(); + Version version = selected.getVersion(); + LoggableElement selectedElement = selected.getLe(getContext()); + + boolean wasFound = false; + //if (log.isDebugEnabled()) { + log.info("----- search entry to go :" + selected + ", " + selected.isRemote()); + //} + if (datas!=null) { + for (EntityTreeNode node : datas) { + boolean remote2 = node.isRemote(); + LoggableElement le = node.getLoggableElement(); + if (le != null && remote == remote2 && uuid.equals(le.getMetaData().getUuid()) && version.equals(le.getMetaData().getVersion()) ) { + //if (log.isDebugEnabled()) { + log.info("----- found entry to go :" + node + ", " + node.isRemote()); + //} + wasFound = true; + break; + } + pos++; + } + } + + if (wasFound) { + model.setCurrentIndex(pos); + } else { + // must create the tree node + EntityTreeNode root = EntityTreeNodeHelper.build(selectedElement, selected.isRemote()); + // ajout a la fin de l'historique + model.addTail(root); + // go to new position + model.setCurrentIndex(model.size()-1); + } + EntityTreeNode node; + node = model.getCurrent(); + return node; + } + + @Override + protected void clear() { + super.clear(); + selected = null; + } + + public void setSelected(DataEntityModel selected) { + this.selected = selected; + } +} \ No newline at end of file Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryDeleteAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryDeleteAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryDeleteAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -22,6 +22,7 @@ import fr.cemagref.simexplorer.is.ui.swing.model.DataEntityModel; import fr.cemagref.simexplorer.is.ui.swing.model.EntityTreeNode; import fr.cemagref.simexplorer.is.ui.swing.model.HistoryModel; +import fr.cemagref.simexplorer.is.ui.swing.actions.util.SelectedAction; import java.util.Iterator; import java.util.List; @@ -40,7 +41,7 @@ //mnemonic = 'N', hideActionText = true ) -public class HistoryDeleteAction extends HistoryAbstractAction { +public class HistoryDeleteAction extends HistoryAbstractAction implements SelectedAction { private static final long serialVersionUID = 2165684159831076054L; @@ -54,11 +55,10 @@ if (model.isEmpty()) { return false; } - if (selected == null) { - // on doit retrouver l'élément à traiter à partir de la source - selected = findSelectedItem(e); + if (selected==null) { + throw new IllegalStateException("the SelectedAction ("+getActionName()+") must have a not null selected before action performed"); } - return selected != null && selected.getUuid() != null; + return true; } protected EntityTreeNode getHistoryEntry(HistoryModel<EntityTreeNode> model) { @@ -68,18 +68,18 @@ boolean remote = selected.isRemote(); String uuid = selected.getUuid(); boolean wasRemove = false; - //if (log.isDebugEnabled()) { - log.info("----- search entry to remove :" + selected + ", " + selected.isRemote()); - //} + if (log.isDebugEnabled()) { + log.debug("----- search entry to remove :" + selected + ", " + selected.isRemote()); + } for (Iterator<EntityTreeNode> it = datas.iterator(); it.hasNext();) { EntityTreeNode node = it.next(); boolean remote2 = node.isRemote(); LoggableElement le = node.getLoggableElement(); if (le != null && remote == remote2 && uuid.equals(le.getMetaData().getUuid())) { it.remove(); - //if (log.isDebugEnabled()) { - log.info("----- found entry to remove :" + node + ", " + node.isRemote()); - //} + if (log.isDebugEnabled()) { + log.debug("----- found entry to remove :" + node + ", " + node.isRemote()); + } wasRemove = true; break; } @@ -107,4 +107,8 @@ super.clear(); selected = null; } + + public void setSelected(DataEntityModel selected) { + this.selected=selected; + } } \ No newline at end of file Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryDeleteExportAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryDeleteExportAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/history/HistoryDeleteExportAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -48,8 +48,8 @@ } // we are working on other list impact by an export + selected = selected.cloneSafe(); selected.setRemote(!selected.isRemote()); - return true; } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowListTabAbstractAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowListTabAbstractAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowListTabAbstractAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -18,19 +18,17 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.actions.util; -import fr.cemagref.simexplorer.is.entities.metadata.MetaData; -import fr.cemagref.simexplorer.is.exceptions.SimExplorerRuntimeException; +import fr.cemagref.simexplorer.is.entities.data.LoggableElement; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerActionManager; import fr.cemagref.simexplorer.is.ui.swing.actions.ImportElementAction; -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.ui.JListTab; -import fr.cemagref.simexplorer.is.ui.swing.ui.ListTabRefreshHelper; +import fr.cemagref.simexplorer.is.ui.swing.ui.ListTabUpdater; +import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerMainUI; import jaxx.runtime.swing.JAXXTab; import static org.codelutin.i18n.I18n._; -import javax.swing.AbstractButton; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; @@ -40,7 +38,6 @@ import javax.swing.event.ListSelectionListener; import javax.swing.event.RowSorterEvent; import javax.swing.event.RowSorterListener; -import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; import java.awt.Point; import java.awt.event.ActionEvent; @@ -59,6 +56,9 @@ ListMetaSelectionListener listMetaSelectionListener; + TableRowSorterListener rowSorterListener; + MyTableRowSorter rowSorter; + public ShowListTabAbstractAction(String name, boolean remote) { super(name); this.remote = remote; @@ -69,112 +69,78 @@ super.beforeAction(e); JTabbedPane tabbedPane = getTabContainer(); JAXXTab ui = getUI(); - if (getTab().isTabVisible(tabbedPane)) { // tab is already visible, just select it tabbedPane.setSelectedComponent(ui); return false; } - return true; } + @Override + public void disposeUI() { + super.disposeUI(); + if (listMetaSelectionListener!=null) { + getTabUI().getTable().getSelectionModel().removeListSelectionListener(listMetaSelectionListener); + listMetaSelectionListener=null; + } + if (rowSorterListener!=null) { + getTabUI().getTable().getRowSorter().removeRowSorterListener(rowSorterListener); + rowSorterListener=null; + } + if (rowSorter!=null) { + getTabUI().getTable().setRowSorter(rowSorter); + rowSorter=null; + } + } + public ListTabUpdater getUpdater() { + return getListUpdater(this, getModel().isRemote()); + } + protected void initFirstUsage(final JListTab ui, final ListTabModel model) { - MetaData[] data = model.getList(); - if (data == null) { - // first coming here, init model - model.initTabModel(getContext(), remote, (ListTableModel) ((JListTab) getUI()).getTable().getModel()); - } - ui.getShowTab_synchronize().setHideActionText(false); - ui.getExportElement().setHideActionText(false); - ui.getDownloadElement().setHideActionText(false); - ui.getDeleteElement().setHideActionText(false); - //FIXME : when we change locale, this is no more enabled ? - ui.getImportElement().setEnabled(true); - ui.getImportElement().getAction().setEnabled(true); - ImportElementAction action = (ImportElementAction) ui.getImportElement().getAction(); - ui.getImportElement().setToolTipText(_(action.getI18nToolTipText(model.isRemote()))); + ui.initPopup(); - listMetaSelectionListener = new ListMetaSelectionListener(ui, model); - final JTable table = ui.getTable(); - table.getSelectionModel().addListSelectionListener(listMetaSelectionListener); + // init remote property on model + model.synch(remote, (LoggableElement) null); - table.addMouseListener(new ListMetaMouseListener(ui, model)); + + //FIXME : when we change locale, this is no more enabled ? + + SimExplorerMainUI.EnableButton(ui.getImportElement()); + //ImportElementAction action = (ImportElementAction) ui.getImportElement().getAction(); + //ui.getImportElement().setToolTipText(_(action.getI18nToolTipText(model.isRemote()))); + // add search actions listeners ui.getSearchText().addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { // rafraichissement des actions de recherche - ListTabRefreshHelper.refreshSearchActions(ui, model); + getUpdater().refreshSearchActions(); } }); - //TODO Est-ce vraiment le bon endroit pour faire ça ? - // push model into tableModel - final ListTableModel modelTab = (ListTableModel) table.getModel(); - modelTab.setData(model.getList()); - // on force les valeurs nulles - model.setSelectedIndex(-1); - model.setSelectedItem(null); - //table.setAutoCreateRowSorter(true); + listMetaSelectionListener = new ListMetaSelectionListener(ui, model); + + JTable table = ui.getTable(); + table.getSelectionModel().addListSelectionListener(listMetaSelectionListener); + table.addMouseListener(new ListMetaMouseListener(ui, model)); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.getTableHeader().setReorderingAllowed(true); - final MyTableRowSorter rowSorter = new MyTableRowSorter(modelTab); - ui.getTable().setRowSorter(rowSorter); - rowSorter.addRowSorterListener(new RowSorterListener() { - public void sorterChanged(RowSorterEvent e) { - RowSorterEvent.Type type = e.getType(); - if (type == RowSorterEvent.Type.SORT_ORDER_CHANGED) { - List keys = e.getSource().getSortKeys(); - if (keys.isEmpty()) { - return; - } - RowSorter.SortKey key = (RowSorter.SortKey) keys.get(0); - int column = key.getColumn(); - SortOrder sortOrder = key.getSortOrder(); - model.getQuery().setSortColumn(modelTab.getSortColumn(column)); - model.getQuery().setSortAscending(sortOrder== SortOrder.ASCENDING); - log.info("sortedChanged " + model.getQuery()); - //TODOFinish this - model.updateTabModel(getContext(), modelTab, true); - } + ui.getTable().setRowSorter(rowSorter = new MyTableRowSorter((ListTableModel) table.getModel())); - } - }); - } + rowSorterListener = new TableRowSorterListener(model); + rowSorter.addRowSorterListener(rowSorterListener); - protected void synchSelected(final JListTab ui, int rowAtPoint, ListSelectionModel selectionModel, ListTabModel model) { - // if empty list, this is quick - if (model.isEmpty()) { - model.setSelectedIndex(-1); - model.synch(model.isRemote(), (MetaData) null); - return; - } - DataEntityModel entityModel; - if (rowAtPoint == -1 || model.getSelectedIndex() != rowAtPoint || selectionModel.isSelectionEmpty() || selectionModel.getMinSelectionIndex() != rowAtPoint) { - if (rowAtPoint == -1) { - rowAtPoint = 0; - } - if (ui.getTable().getSelectedRow() != rowAtPoint) { - // select the row - boolean wasEnabled = listMetaSelectionListener.enabled; - listMetaSelectionListener.enabled = false; - selectionModel.setSelectionInterval(rowAtPoint, rowAtPoint); - listMetaSelectionListener.enabled = wasEnabled; - } - // the model is not yet ready - model.setSelectedIndex(rowAtPoint); + // init updater listens the model + getListUpdater(this, model.isRemote()).initListeners(); - model.synch(model.isRemote(), model.get(rowAtPoint)); + // init model + model.initTabModel(getContext(), remote); - entityModel = model.getSelectedItem(); - log.info(entityModel); - ListTabRefreshHelper.refreshListTablePopupMenu(getMainUI(), getContext(), ui, model); - } } protected int getRowAtPoint(JListTab ui, Point e) { @@ -193,9 +159,7 @@ } public void valueChanged(ListSelectionEvent e) { - if (enabled) { - synchSelected(ui, ui.getTable().getSelectedRow(), ui.getTable().getSelectionModel(), model); - } + model.setSelectedIndex(ui.getTable().getSelectedRow()); } } @@ -224,36 +188,70 @@ public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { try { - // synchronization du meta selectionne - synchSelected(ui, getRowAtPoint(ui, e.getPoint()), ui.getTable().getSelectionModel(), model); - // lancement de l'action d'affichage de l'onglet de detail - SimExplorerActionManager.fireAction("showTab_detail", e.getSource(), (AbstractButton) null); + // update model + model.setSelectedIndex(getRowAtPoint(ui, e.getPoint())); + + // launch show tab action + SimExplorerActionManager.fireSelectedAction("showTab_detail", e.getSource(), model.getSelectedItem()); } catch (Exception e1) { - throw new SimExplorerRuntimeException(e1); + showError(e1); } } } protected void initPopup(MouseEvent e) { if (e.isPopupTrigger()) { - // synchronization du meta selectionne - synchSelected(ui, getRowAtPoint(ui, e.getPoint()), ui.getTable().getSelectionModel(), model); + model.setSelectedIndex(getRowAtPoint(ui, e.getPoint())); // affichage de la popup ui.getTablePopupMenu().show(ui.getTable(), e.getX(), e.getY()); } } } - private static class MyTableRowSorter extends TableRowSorter<TableModel> { + private static class MyTableRowSorter extends TableRowSorter<ListTableModel> { - private MyTableRowSorter(TableModel model) { + private ListTableModel myModel; + + MyTableRowSorter(ListTableModel model) { super(model); + this.myModel = model; setMaxSortKeys(1); } + public void setMyModel(ListTableModel model) { + super.setModel(model); + } + + public ListTableModel getMyModel() { + return myModel; + } + @Override public void sort() { // do not sort } } + + private class TableRowSorterListener implements RowSorterListener { + private final ListTabModel model; + + public TableRowSorterListener(ListTabModel model) { + this.model = model; + } + + public void sorterChanged(RowSorterEvent e) { + RowSorterEvent.Type type = e.getType(); + if (type == RowSorterEvent.Type.SORT_ORDER_CHANGED) { + List keys = e.getSource().getSortKeys(); + if (keys.isEmpty()) { + return; + } + RowSorter.SortKey key = (RowSorter.SortKey) keys.get(0); + int column = key.getColumn(); + SortOrder sortOrder = key.getSortOrder(); + + model.setQuerySort(rowSorter.getModel().getSortColumn(column), sortOrder == SortOrder.ASCENDING); + } + } + } } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowTabAbstractAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowTabAbstractAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/ShowTabAbstractAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -72,8 +72,7 @@ } protected void updateUI(U ui, M model) { - // refresh ui - getTab().updateUI(getContext(),getMainUI(), ui, model); + // refresh ui } @Override Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -20,7 +20,10 @@ import fr.cemagref.simexplorer.is.ui.swing.SimExplorer; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerContext; +import fr.cemagref.simexplorer.is.ui.swing.ui.DetailTabUpdater; +import fr.cemagref.simexplorer.is.ui.swing.ui.ListTabUpdater; import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerMainUI; +import fr.cemagref.simexplorer.is.ui.swing.ui.SynchronizeTabUpdater; import fr.cemagref.simexplorer.is.ui.swing.ui.util.ErrorDialog; import jaxx.runtime.JAXXObject; import org.apache.commons.logging.Log; @@ -42,6 +45,44 @@ protected ActionEvent e; + protected static DetailTabUpdater detailUpdater; + protected static ListTabUpdater localUpdater; + protected static ListTabUpdater remoteUpdater; + protected static SynchronizeTabUpdater synchronizeUpdater; + + protected static DetailTabUpdater getDetailUpdater(SimExplorerAbstractAction action) { + if (detailUpdater == null) { + detailUpdater = new DetailTabUpdater(action.getContext()); + } + return detailUpdater; + } + + + protected static ListTabUpdater getListUpdater(SimExplorerAbstractAction action,boolean remote) { + return remote?getRemoteUpdater(action):getLocalUpdater(action); + } + + protected static ListTabUpdater getLocalUpdater(SimExplorerAbstractAction action) { + if (localUpdater == null) { + localUpdater = new ListTabUpdater(action.getContext(), false); + } + return localUpdater; + } + + protected static ListTabUpdater getRemoteUpdater(SimExplorerAbstractAction action) { + if (remoteUpdater == null) { + remoteUpdater = new ListTabUpdater(action.getContext(), true); + } + return remoteUpdater; + } + + public static SynchronizeTabUpdater getSynchronizeUpdater(SimExplorerAbstractAction action) { + if (synchronizeUpdater == null) { + synchronizeUpdater = new SynchronizeTabUpdater(action.getContext()); + } + return synchronizeUpdater; + } + public void actionPerformed(java.awt.event.ActionEvent e) { log.debug("------------------------------------------------------------"); @@ -129,4 +170,23 @@ public String getI18nToolTipText() { return "simexplorer.action." + getActionName() + ".tooltip"; } + + public static void dispose() { + if (detailUpdater != null) { + detailUpdater.removeListeners(); + detailUpdater = null; + } + if (localUpdater != null) { + localUpdater.removeListeners(); + localUpdater = null; + } + if (remoteUpdater != null) { + remoteUpdater.removeListeners(); + remoteUpdater = null; + } + if (synchronizeUpdater != null) { + synchronizeUpdater.removeListeners(); + synchronizeUpdater = null; + } + } } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractTabAction.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractTabAction.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/actions/util/SimExplorerAbstractTabAction.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -19,10 +19,10 @@ package fr.cemagref.simexplorer.is.ui.swing.actions.util; import fr.cemagref.simexplorer.is.exceptions.SimExplorerRuntimeException; +import fr.cemagref.simexplorer.is.ui.swing.model.DataEntityModel; +import fr.cemagref.simexplorer.is.ui.swing.model.SimExplorerTabModel; import fr.cemagref.simexplorer.is.ui.swing.ui.JDetailTab; import fr.cemagref.simexplorer.is.ui.swing.ui.JSynchronizeTab; -import fr.cemagref.simexplorer.is.ui.swing.model.DataEntityModel; -import fr.cemagref.simexplorer.is.ui.swing.model.SimExplorerTabModel; import fr.cemagref.simexplorer.is.ui.swing.ui.SimExplorerTab; import jaxx.runtime.JAXXObject; import jaxx.runtime.swing.JAXXTab; @@ -55,19 +55,30 @@ if (prefixPatternName == null) { throw new IllegalArgumentException("prefixPatternName can not be null, but was."); } + + String suffix; if (name.equals(prefixPatternName)) { param = name; } else { Pattern patternName = Pattern.compile(prefixPatternName + "_(\\w+)"); Matcher matcher = patternName.matcher(name); if (!matcher.matches()) { - throw new IllegalArgumentException(I18n._("{0} should have a name like this {1}, but was {2}", getClass().getName(), patternName, name)); + + Pattern patternName2 = Pattern.compile(prefixPatternName + "(\\w+)_(\\w+)"); + Matcher matcher2 = patternName2.matcher(name); + + if (!matcher2.matches()) { + throw new IllegalArgumentException(I18n._("{0} should have a name like this {1}, but was {2}", getClass().getName(), patternName, name)); + } + prefixPatternName += matcher2.group(1); + suffix = matcher2.group(2); + } else { + suffix = matcher.group(1); } - param = prefixPatternName; Converter convertorLanguage = ConverterUtil.getConverter(SimExplorerTab.class); - tab = (SimExplorerTab) convertorLanguage.convert(SimExplorerTab.class, matcher.group(1)); + tab = (SimExplorerTab) convertorLanguage.convert(SimExplorerTab.class, suffix); } log.debug(">>> " + this); @@ -158,17 +169,17 @@ return entityModel; } - protected JTree getTreeForAction(String actionPrefix, String actionName) { + protected JTree getTreeForAction(JAXXTab _ui, String actionPrefix, String actionName) { JTree tree = null; // on retrouve l'arbre concerné à partir du nom de l'action if ((actionPrefix + "Detail").equals(actionName)) { - JDetailTab ui = (JDetailTab) getUI(); + JDetailTab ui = (JDetailTab) _ui; tree = ui.getNavigationTree(); } else if ((actionPrefix + "Local").equals(actionName)) { - JSynchronizeTab ui = (JSynchronizeTab) getUI(); + JSynchronizeTab ui = (JSynchronizeTab) _ui; tree = ui.getTree(false); } else if ((actionPrefix + "Remote").equals(actionName)) { - JSynchronizeTab ui = (JSynchronizeTab) getUI(); + JSynchronizeTab ui = (JSynchronizeTab) _ui; tree = ui.getTree(true); } if (tree == null) { Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/DetailTabModel.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/DetailTabModel.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/DetailTabModel.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -20,7 +20,6 @@ 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 org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -34,9 +33,16 @@ */ public class DetailTabModel extends SimExplorerTabModel { + /** la propriété pour indiquer un changement de racine d'arbre */ public static final String ROOT_NODE_PROPERTY_CHANGED = "rootNodePropertyChanged"; + + /** la propriété pour indiquer un changement de sélection de noeud dans l'arbre */ public static final String SELECTED_NODE_PROPERTY_CHANGED = "selectedNodePropertyChanged"; + + /** la propriété pour indiquer un changement de sélection de version */ public static final String SELECTED_VERSION_INDEX_PROPERTY_CHANGED = "selectedVersionIndexPropertyChanged"; + + /** la propriété pour indiquer un changement de sélection de fichier attaché */ public static final String SELECTED_ATTACHMENT_INDEX_PROPERTY_CHANGED = "selectedAttachmentIndexPropertyChanged"; private static final int HISTORY_CAPACITY = 20; @@ -46,7 +52,7 @@ static protected Log log = LogFactory.getLog(DetailTabModel.class); /** le LoggableElement root de l'arbre de navigation */ - protected LoggableElement rootNode; + protected EntityTreeNode rootNode; /** * le LoggableElement sélectionné dans l'arbre de navigation (ou null @@ -55,6 +61,12 @@ protected LoggableElement selectedNode; /** + * le LoggableElement affiché dans le panel de détail : il correspond au LE + * sélectionné avec la version sélectionné (ou null si le node sélectionné + * n'est pas un LoggableElement) + */ + protected LoggableElement detailNode; + /** * la liste des versions disponibles pour le LoggableElement sélectionné * dans l'arbre (ou null si pas de LoggableElement sélectionné dans l'arbre * de navigation) @@ -73,15 +85,9 @@ */ protected Integer selectedAttachmentIndex; - /** - * les métas à afficher dans le panel de détaillié à un uuid et à une version - * (ou null si pas de node sélectionné, ou pas de version). - */ - protected MetaData detail; - protected HistoryModel<EntityTreeNode> history; - public LoggableElement getRootNode() { + public EntityTreeNode getRootNode() { return rootNode; } @@ -98,9 +104,7 @@ } public Attachment getSelectedAttachment() { - // FIXME !!! - return null; -// return selectedAttachmentIndex == null || selectedAttachmentIndex == -1 ? null : getDetail().getAttachment(selectedAttachmentIndex); + return detailNode == null || selectedAttachmentIndex == null || selectedAttachmentIndex == -1 ? null : detailNode.getAttachment(selectedAttachmentIndex); } public Version getSelectedVersion(int integer) { @@ -111,8 +115,8 @@ return versions; } - public MetaData getDetail() { - return detail; + public LoggableElement getDetailNode() { + return detailNode; } public HistoryModel<EntityTreeNode> getHistory() { @@ -122,32 +126,35 @@ return history; } - public void setRootNode(LoggableElement rootNode) { + public void setRootNode(EntityTreeNode rootNode) { + EntityTreeNode oldRootNode = this.rootNode; this.rootNode = rootNode; + firePropertyChange(ROOT_NODE_PROPERTY_CHANGED, oldRootNode, rootNode); } 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) + this.detailNode = selectedNode; firePropertyChange(SELECTED_NODE_PROPERTY_CHANGED, oldSelectedNode, selectedNode); } public void setSelectedVersion(Version version) { - Integer index = getVersionIndex(version); Integer oldSelectedVersionIndex = this.selectedVersionIndex; - this.selectedVersionIndex = index; - // ui must update detail panel for the selected node and version + this.selectedVersionIndex = getVersionIndex(version); firePropertyChange(SELECTED_VERSION_INDEX_PROPERTY_CHANGED, oldSelectedVersionIndex, selectedVersionIndex); } public void setSelectedAttachmentIndex(Integer selectedAttachmentIndex) { Integer oldSelectedAttachmentIndex = this.selectedAttachmentIndex; this.selectedAttachmentIndex = selectedAttachmentIndex; - // ui must update button downloadAttachment accessibility firePropertyChange(SELECTED_ATTACHMENT_INDEX_PROPERTY_CHANGED, oldSelectedAttachmentIndex, selectedAttachmentIndex); } + public void setDetailNode(LoggableElement detailNode) { + this.detailNode = detailNode; + } + public void clear() { getHistory().clear(); reset(); @@ -168,25 +175,15 @@ this.versions = versions; } - public void setDetail(MetaData detail) { - this.detail = detail; - synch(isRemote(), detail); - } - public void reset() { super.reset(); - rootNode = null; - resetSelectedNode(); - } - - public void resetSelectedNode() { selectedNode = null; - versions = null; - detail = null; resetSelectedVersion(); } public void resetSelectedVersion() { + versions = null; + detailNode = null; selectedVersionIndex = null; selectedAttachmentIndex = null; } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/HistoryModel.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/HistoryModel.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/HistoryModel.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -77,6 +77,24 @@ } /** + * Ajoute a la fin de l'historique un nouvel element. + * + * @param e l'element a ajouter + */ + public void addTail(E e) { + if (data == null) { + data = new ArrayList<E>(); + } + data.add(e); + + if (data.size() > capacity) { + // on supprime le premier element de l'historique + data.remove(0); + } + setCurrentIndex(data.size() - 1); + } + + /** * @return l'elemenet precedent par rapport a l'element courant * @throws IllegalStateException si pas de data ou deja sur le premier element */ Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/ListTabModel.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/ListTabModel.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/ListTabModel.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -19,8 +19,10 @@ package fr.cemagref.simexplorer.is.ui.swing.model; import fr.cemagref.simexplorer.is.entities.metadata.MetaData; +import fr.cemagref.simexplorer.is.storage.SortColumn; import fr.cemagref.simexplorer.is.ui.swing.SimExplorerContext; import fr.cemagref.simexplorer.is.ui.swing.StorageServiceHelper; +import jaxx.util.SimplePaginationEnum; /** * Le model pour un Tab contenant une liste d'application @@ -29,42 +31,150 @@ */ public class ListTabModel extends SimExplorerTabModel { - protected QueryModel query; + /** la propriété pour indiquer un changement de sélection de ligne dans la table */ + public static final String SELECTED_ROW_PROPERTY_CHANGED = "selectedRowPropertyChanged"; - protected PaginationModel pagination; + /** la propriété pour indiquer un changement dans le modele de requete */ + public static final String QUERY_PROPERTY_CHANGED = "queryPropertyChanged"; + /** la propriété pour indiquer un changement dans le modele de pagination */ + public static final String PAGINATION_PROPERTY_CHANGED = "paginationPropertyChanged"; + + protected final QueryModel queryModel; + protected final QueryModel oldQueryModel; + + protected final PaginationModel pagination; + protected final PaginationModel oldPagination; + + protected SimExplorerContext context; + protected MetaData[] list; protected int selectedIndex; private static final long serialVersionUID = -3623331875470531459L; + public ListTabModel() { + queryModel = new QueryModel(); + oldQueryModel = new QueryModel(); + pagination = new PaginationModel(SimplePaginationEnum._10); + oldPagination= new PaginationModel(SimplePaginationEnum._10); + } + + public void initTabModel(SimExplorerContext context, boolean remote) { + + this.context=context; + + reset(); + + // no selection at first load + synch(remote, null, null); + + + // setdefault sizor from config + setWidth(remote ? context.getConfig().getRemoteSizor() : context.getConfig().getLocalSizor()); + } + + public void setSelectedIndex(int selectedIndex) { + Integer oldSelectedIndex = this.selectedIndex; + this.selectedIndex = selectedIndex; + if (selectedIndex!=-1) { + synch(isRemote(),get(selectedIndex)); + + } + firePropertyChange(SELECTED_ROW_PROPERTY_CHANGED, oldSelectedIndex, selectedIndex); + } + + public void setPageNumber(int pageNumber) { + getPagination().bind(oldPagination); + getPagination().setPageNumber(pageNumber); + // rebuild list + rebuildList(context, false); + firePropertyChange(PAGINATION_PROPERTY_CHANGED, oldPagination, getPagination()); + } + + public void setWidth(SimplePaginationEnum width) { + getPagination().bind(oldPagination); + getPagination().setWidth(width); + // rebuild list + rebuildList(context, true); + firePropertyChange(PAGINATION_PROPERTY_CHANGED, oldPagination, getPagination()); + } + + public void setQuery(String query) { + getQueryModel().bind(oldQueryModel); + getQueryModel().setQuery(query); + // rebuild list + rebuildList(context, true); + firePropertyChange(QUERY_PROPERTY_CHANGED, oldQueryModel, getQueryModel()); + } + + public void reload() { + getPagination().setPageNumber(-1); + getPagination().bind(oldPagination); + + // rebuild list + rebuildList(context, true); + firePropertyChange(PAGINATION_PROPERTY_CHANGED, oldPagination, getPagination()); + } + + public void resetQuery() { + getQueryModel().bind(oldQueryModel); + getQueryModel().reset(); + // rebuild list + rebuildList(context, true); + firePropertyChange(QUERY_PROPERTY_CHANGED, oldQueryModel, getQueryModel()); + } + + public void setOnlyLatest(boolean onlyLatest) { + getQueryModel().bind(oldQueryModel); + getQueryModel().setOnlyLatest(onlyLatest); + // rebuild list + rebuildList(context, true); + firePropertyChange(QUERY_PROPERTY_CHANGED, oldQueryModel, getQueryModel()); + } + + public void setQuerySort(SortColumn sortColumn, boolean ascending) { + getQueryModel().bind(oldQueryModel); + getQueryModel().setOrder(sortColumn, ascending); + // rebuild list + rebuildList(context, true); + firePropertyChange(QUERY_PROPERTY_CHANGED, oldQueryModel, getQueryModel()); + } + + public void setSimpleQuery(boolean simpleQuery) { + getQueryModel().bind(oldQueryModel); + getQueryModel().setSimpleQuery(simpleQuery); + firePropertyChange(QUERY_PROPERTY_CHANGED, oldQueryModel, getQueryModel()); + } + public MetaData[] getList() { return list; } public PaginationModel getPagination() { - if (pagination == null) { - pagination = new PaginationModel(); - } return pagination; } - public QueryModel getQuery() { - if (query == null) { - query = new QueryModel(); - } - return query; + public boolean hasQuery() { + return getQueryModel().hasQuery(); } + public String getQuery() { + return getQueryModel().getQuery(); + } + + private QueryModel getQueryModel() { + return queryModel; + } + @Override public void reset() { super.reset(); list = null; selectedIndex = -1; - query = null; - pagination = null; - query = null; + queryModel.reset(); + pagination.reset(); } public MetaData get(int index) { @@ -76,7 +186,7 @@ } public boolean isEmpty() { - return list == null || getList().length == 0; + return list == null || list.length == 0; } public int size() { @@ -93,75 +203,46 @@ return s.substring(s.lastIndexOf(".") + 1) + "<size: " + size() + ",selectedItem:" + selectedItem + ">"; } - public void setSelectedIndex(int selectedIndex) { - this.selectedIndex = selectedIndex; - //TODO should fire a property_changed + public void setList(MetaData[] list) { + this.list = list; } - public void setPagination(PaginationModel pagination) { - this.pagination = pagination; - } + protected void rebuildList(SimExplorerContext context, boolean generatePagination) { - public void setQuery(QueryModel query) { - this.query = query; - } + selectedIndex=-1; - public void setList(MetaData[] list) { - this.list = list; - } + PaginationModel page = getPagination(); + QueryModel query = getQueryModel(); - public void initTabModel(SimExplorerContext context, boolean remote, ListTableModel tableModel) { + // init pagination + if (generatePagination) { - // no selection at first load - synch(remote, null, null); + // get size list + long size = StorageServiceHelper.getCount(context, isRemote(), query.getQuery(), query.isOnlyLatest()); - // first query, build model - updateTabModel(context, tableModel, true); - } + // init pagination + page.setSize(size); - public void updateTabModel(SimExplorerContext context, ListTableModel tableModel, boolean deletePagination) { - - // init pagination - if (deletePagination) { - setPagination(null); } - if (pagination == null) { - initPagination(context); - } - PaginationModel model = pagination; - // init query model - QueryModel queryModel; - queryModel = getQuery(); // obtain datas from service - MetaData[] data = StorageServiceHelper.getData(context, remote, queryModel.isOnlyLatest(), queryModel.getQuery(), (int) model.getFirstIndex(), model.getWidth(), queryModel.getSortColumn().getColumn(), queryModel.isSortAscending()); + MetaData[] data = StorageServiceHelper.getData( + context, + isRemote(), + query.isOnlyLatest(), + query.getQuery(), + (int) page.getFirstIndex(), + page.getWidthInt(), + query.getSortColumn().getColumn(), + query.isSortAscending() + ); // save in model setList(data); - tableModel.setData(data); } - protected PaginationModel initPagination(SimExplorerContext context) { - QueryModel queryModel = getQuery(); - - String query = queryModel.getQuery(); - // get size list - long size = StorageServiceHelper.getCount(context, remote, query, queryModel.isOnlyLatest()); - - // init pagination - PaginationModel model = getPagination(); - model.setFirstIndex(0); - model.setSize(size); - // utilisation sizor par défaut - model.setWidth(remote ? context.getConfig().getRemoteSizor() : context.getConfig().getLocalSizor()); - - // save pagination in model - setPagination(model); - return model; - } - private void checkSize(int index) { if (index > -1 && (isEmpty() || size() < index)) { throw new IllegalStateException(getClass() + " has size " + size() + " and was required index " + index); Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/ListTableModel.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/ListTableModel.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/ListTableModel.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -57,6 +57,7 @@ public void setData(MetaData[] data) { this.data = data; + fireTableDataChanged(); } private final SortColumn[] sorts = { Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/PaginationModel.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/PaginationModel.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/PaginationModel.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -18,6 +18,8 @@ * ##% */ package fr.cemagref.simexplorer.is.ui.swing.model; +import jaxx.util.SimplePaginationEnum; + /** * Le modèle de pagination d'une liste * @@ -25,66 +27,109 @@ */ public class PaginationModel { - /** the index */ - long firstIndex; + /** default size of a page */ + protected SimplePaginationEnum defaultWidth; + /** the current page number */ + protected int pageNumber; + /** size of the total flow */ - long size; + protected long size; /** size of a page */ - int width; + protected SimplePaginationEnum width; + public PaginationModel(SimplePaginationEnum defaultWidth) { + this.defaultWidth = defaultWidth; + reset(); + } + + public void reset() { + pageNumber = -1; + size = 0; + width = defaultWidth; + } + + public void bind(PaginationModel destination) { + destination.pageNumber = pageNumber; + destination.width = width; + destination.size = size; + } + public long getFirstIndex() { - return firstIndex; + return pageNumber * getWidthInt(); } public long getSize() { return size; } - public int getWidth() { + public SimplePaginationEnum getWidth() { return width; } public boolean hasNext() { - return size - firstIndex > width; + return size - pageNumber > getWidthInt(); } - @Override - public String toString() { - String s = super.toString(); - return s.substring(s.indexOf('@')) + "<size:" + size + ", firstIndex:" + firstIndex + ", width:" + width + ", nbPages:" + getNbPages() + ">"; - } - public boolean hasPrevious() { - return firstIndex >= width; + return pageNumber >= getWidthInt(); } public int getCurrentPage() { - int page = (int) (firstIndex / width); - if (page > 0 && firstIndex % width > 0) { - page++; - } - return page; + + return pageNumber; } public int getNbPages() { - int nbPages = (int) (size / width); - if ((size % width != 0) || (nbPages == 0 && size > 0)) { + int anInt = getWidthInt(); + int nbPages = (int) (size / anInt); + if ((size % anInt != 0) || (nbPages == 0 && size > 0)) { nbPages++; } return nbPages; } - public void setFirstIndex(long firstIndex) { - this.firstIndex = firstIndex; + public int getWidthInt() { + return width == null ? SimplePaginationEnum._10.intValue() : getWidth().intValue(); } - public void setSize(long size) { + @Override + public String toString() { + String s = super.toString(); + return s.substring(s.indexOf('@')) + "<size:" + size + ", pageNumber:" + pageNumber + ", width:" + width + ", nbPages:" + getNbPages() + ">"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof PaginationModel)) return false; + PaginationModel that = (PaginationModel) o; + return pageNumber == that.pageNumber && + size == that.size && + width == that.width; + } + + @Override + public int hashCode() { + int result; + result = pageNumber; + result = 31 * result + (int) (size ^ (size >>> 32)); + result = 31 * result + width.hashCode(); + return result; + } + + void setPageNumber(int pageNumber) { + this.pageNumber = pageNumber; + } + + void setSize(long size) { this.size = size; + this.pageNumber = 0; } - public void setWidth(int width) { + void setWidth(SimplePaginationEnum width) { this.width = width; + this.pageNumber = 0; } } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/QueryModel.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/QueryModel.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/QueryModel.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -28,72 +28,111 @@ */ public class QueryModel implements Serializable { - protected boolean simpleQuery = true; + /** flag to detect simple text query */ + protected boolean simpleQuery; - protected String query; + /** flag to get only latest version */ + protected boolean onlyLatest; - protected boolean onlyLatest = true; + /** flag to indicate sorting way (null for none) */ + protected boolean sortAscending; - protected SortColumn sortColumn = SortColumn.None; + /** simple full text query */ + protected String query; - protected boolean sortAscending = true; + /** query column ordering (use SortColumn.Noe if no sort) */ + protected SortColumn sortColumn; private static final long serialVersionUID = -5018101346037499469L; + public QueryModel() { + // obtain default empty query + reset(); + } + + public void bind(QueryModel destination) { + destination.simpleQuery = simpleQuery; + destination.onlyLatest = onlyLatest; + destination.sortAscending = sortAscending; + destination.query = query; + destination.sortColumn = sortColumn; + } + + public void reset() { + simpleQuery = true; + onlyLatest = true; + sortAscending = true; + query = null; + sortColumn = SortColumn.None; + } + public boolean hasQuery() { return query != null && !query.isEmpty(); } - public SortColumn getSortColumn() { - return sortColumn; + public boolean isSimpleQuery() { + return simpleQuery; } public boolean isOnlyLatest() { return onlyLatest; } + public boolean isSortAscending() { + return sortAscending; + } + public String getQuery() { return query; } - public boolean isSimpleQuery() { - return simpleQuery; + public SortColumn getSortColumn() { + return sortColumn; } - public void setSortColumn(SortColumn sortColumn) { - this.sortColumn = sortColumn; + @Override + public String toString() { + String s = super.toString(); + return s.substring(s.lastIndexOf('.') + 1) + "<sortColumn:" + sortColumn + ",sortAscending:" + sortAscending + ", query:" + query + ">"; } - public boolean isSortAscending() { - return sortAscending; + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof QueryModel)) return false; + QueryModel that = (QueryModel) o; + return onlyLatest == that.onlyLatest && + simpleQuery == that.simpleQuery && + sortAscending == that.sortAscending && + !(query != null ? !query.equals(that.query) : that.query != null) + && sortColumn == that.sortColumn; } - public void setSortAscending(boolean sortAscending) { + @Override + public int hashCode() { + int result; + result = (simpleQuery ? 1 : 0); + result = 31 * result + (onlyLatest ? 1 : 0); + result = 31 * result + (sortAscending ? 1 : 0); + result = 31 * result + (query != null ? query.hashCode() : 0); + result = 31 * result + sortColumn.hashCode(); + return result; + } + + void setOrder(SortColumn sortColumn, boolean sortAscending) { + this.sortColumn = sortColumn; this.sortAscending = sortAscending; } - public void setOnlyLatest(boolean onlyLatest) { + void setOnlyLatest(boolean onlyLatest) { this.onlyLatest = onlyLatest; } - public void setQuery(String query) { + void setQuery(String query) { this.query = query; } - public void setSimpleQuery(boolean simpleQuery) { + void setSimpleQuery(boolean simpleQuery) { this.simpleQuery = simpleQuery; } - - public void reset() { - simpleQuery = true; - query = null; - onlyLatest = true; - sortColumn = SortColumn.None; - sortAscending = true; - } - - @Override - public String toString() { - return super.toString() + "<sortColumn:" + sortColumn + ",sortAscending:" + sortAscending + ", query:" + query + ">"; - } } Modified: trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/SynchronizeTabModel.java =================================================================== --- trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/SynchronizeTabModel.java 2008-02-24 19:51:08 UTC (rev 1218) +++ trunk/simexplorer-is/simexplorer-is-swing/src/java/fr/cemagref/simexplorer/is/ui/swing/model/SynchronizeTabModel.java 2008-02-24 19:54:25 UTC (rev 1219) @@ -30,6 +30,8 @@ */ public class SynchronizeTabModel extends SimExplorerTabModel { + /** la clef de l'évènement après des sources */ + public static final String SOURCES_PROPERTY_CHANGED = "sourcesPropertyChanged"; /** la clef de l'évènement après la modification du root de l'arbre local */ public static final String LOCAL_ROOT_NODE_PROPERTY_CHANGED = "rootLocalNodePropertyChanged"; @@ -44,9 +46,6 @@ private static final long serialVersionUID = -3623331875470531459L; - /** l'element source de la synchronisation */ - protected DataEntityModel source; - /** la racine de l'arbre de navigation local. */ protected LoggableElement localRootNode; @@ -83,14 +82,13 @@ return remote ? REMOTE_SELECTED_NODE_PROPERTY_CHANGED : LOCAL_SELECTED_NODE_PROPERTY_CHANGED; } - public DataEntityModel getSource() { - return source; + public void setSources(LoggableElement[] sources) { + LoggableElement[] olds = new LoggableElement[]{localRootNode, remoteRootNode}; + firePropertyChange(SOURCES_PROPERTY_CHANGED, olds, sources); + setRootNode(sources[0], false); + setRootNode(sources[1], true); } - public void setSource(DataEntityModel source) { - this.source = source; - } - public void setRootNode(LoggableElement source, boolean remote) { String property = getRootProperty(remote); LoggableElement oldRootNode = getRootNode(remote); @@ -113,65 +111,90 @@ firePropertyChange(property, oldSelectedNode, source); } - public void updateTabModel(SimExplorerContext context, DataEntityModel selected) { + public LoggableElement[] guessSources(SimExplorerContext context, boolean remote, String uuid, LoggableElement le) { // on nettoye le model avant tout + LoggableElement[] result = new LoggableElement[2]; - reset(); + result[remote ? 1 : 0] = le; - setSource(selected); + result[remote ? 0 : 1] = getLe(context, !remote, uuid); + return result; + } + + public LoggableElement[] guessSources(SimExplorerContext context, DataEntityModel selected) { + + // on nettoye le model avant tout + + LoggableElement[] result = new LoggableElement[2]; + if (selected == null) { // rien de plus à faire - return; + return result; } - boolean remote = selected.isRemote(); - String uuid = selected.getUuid(); + return guessSources(context, selected.isRemote(), selected.getUuid(), selected.getLe(context)); + } - // l'élément selectionné est bien la source - setSelectedItem(selected); + @Override + public void reset() { + super.reset(); + localSelectedNode = remoteSelectedNode = null; + localRootNode = remoteRootNode = null; + } - DataEntityModel save = getSelectedItem(); + public void reloadSources(SimExplorerContext context, String uuid, boolean deleteLocal, boolean deleteRemote, boolean treateLocal, boolean treateRemote) { + LoggableElement[] result = new LoggableElement[2]; - LoggableElement source=null; + result[0] =loadSource(context, uuid, deleteLocal, treateLocal, false); + result[1] =loadSource(context, uuid, deleteRemote, treateRemote,true); - try { - source = save.getLe(context); - } catch (NullPointerException e) { - //TODO si le service ne trouve pas le LE un NullPointer ? - e.printStackTrace(); + setSources(result); + } + + private LoggableElement loadSource(SimExplorerContext context, String uuid, boolean deleteRemote, boolean treateRemote, boolean remote) { + LoggableElement result=null; + LoggableElement node = getRootNode(remote); + if (node != null && !node.getMetaData().getUuid().equals(uuid)) { + // nothing tobe done + result = node; + } else { + if (!deleteRemote) { + if (treateRemote && (node == null || node.getMetaData().getUuid().equals(uuid))) { + // must load this node + result = getLe(context, remote, uuid); + } else { + result = node; + } + } } + return result; + } - setSelectedItem(null); + private LoggableElement getLe(SimExplorerContext context, boolean remote, String uuid) { + Version version = getVersion(context, remote, uuid); + + DataEntityModel destination = new DataEntityModel(); + + if (version != null) { + destination.synch(remote, uuid, version); + return destination.getLe(context); + } + return null; + } + + + protected Version getVersion(SimExplorerContext context, boolean remote, String uuid) { // recuperation des versions de l'element destination - Version[] versions = StorageServiceHelper.getVersions(context, !remote, uuid); + Version[] versions = StorageServiceHelper.getVersions(context, remote, uuid); Version requiredVersion = null; if (versions.length != 0) { // on prend la dernière version disponible dans la base (i.e // la première de la liste des versions :)) requiredVersion = versions[0]; } - - synch(!remote, uuid, requiredVersion); - - LoggableElement destination = getSelectedItem().getLe(context); - - // sauvegarde de la source - setRootNode(source, remote); - - // sauvegarde de la destination - setRootNode(destination, !remote); - - setSelectedItem(save); + return requiredVersion; } - - @Override - public void reset() { - super.reset(); - localSelectedNode = remoteSelectedNode = null; - localRootNode = remoteRootNode = null; - } - } \ No newline at end of file