This is an automated email from the git hooks/post-receive script. New commit to branch feature/4304_synchro_marees in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit 31a27a10048a964c4c1f64119988dae4c9c27478 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Aug 3 12:33:28 2016 +0200 Continue ui for data synchronize action --- .../java/fr/ird/observe/ui/admin/AdminUIModel.java | 55 ++++-- .../datasynchro/CopyToLeftDataSynchronizeTask.java | 25 +++ .../CopyToRightDataSynchronizeTask.java | 26 +++ .../ui/admin/datasynchro/DataSynchroModel.java | 21 +++ .../ui/admin/datasynchro/DataSynchroUI.jaxx | 82 +++++---- .../ui/admin/datasynchro/DataSynchroUI.jcss | 14 +- .../ui/admin/datasynchro/DataSynchroUIHandler.java | 204 ++++++++++++++++++--- .../DataSynchronizeTaskListCellRenderer.java | 37 ++++ .../datasynchro/DataSynchronizeTaskSupport.java | 47 +++++ .../DeleteFromLeftDataSynchronizeTask.java | 25 +++ .../DeleteFromRightDataSynchronizeTask.java | 25 +++ .../ui/storage/tabs/DataSelectionModel.java | 21 +++ .../fr/ird/observe/ui/tree/ObserveTreeHelper.java | 63 ++++++- .../loadors/ProgramLonglineNodeChildLoador.java | 7 + .../tree/loadors/ProgramSeineNodeChildLoador.java | 8 + .../observe-application-swing_en_GB.properties | 4 + .../observe-application-swing_es_ES.properties | 4 + .../observe-application-swing_fr_FR.properties | 4 + 18 files changed, 582 insertions(+), 90 deletions(-) diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminUIModel.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminUIModel.java index 80930e2..77cf722 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminUIModel.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminUIModel.java @@ -133,7 +133,7 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { private final PropertyChangeListener listenReportModified; - private final PropertyChangeListener listenerSelectedDataForReport; + private final PropertyChangeListener listenerSelectedDataForReport; private final PropertyChangeListener listenConsolidateModified; @@ -245,6 +245,22 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { return; } + if (AdminStep.CONFIG == oldStep && AdminStep.DATA_SYNCHRONIZE == newStep) { + + // On lance le chargement de la sélection des arbres + + DataSynchroModel dataSynchroModel = getDataSynchroModel(); + + ObserveSwingDataSource leftSource = getSafeLocalSource(true); + dataSynchroModel.setLeftSource(leftSource); + + ObserveSwingDataSource rightSource = getSafeCentralSource(true); + dataSynchroModel.setRightSource(rightSource); + + return; + + } + // on était sur l'écran de configuration // mise à jour des modèles de sélection si on arrive sur une étape @@ -278,13 +294,13 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { DataSelectionModel source = (DataSelectionModel) evt.getSource(); if (log.isDebugEnabled()) { log.debug("selection data model [" + source + "] changed on " + - evt.getPropertyName() + ", new value = " + - evt.getNewValue()); + evt.getPropertyName() + ", new value = " + + evt.getNewValue()); } validate(); if (log.isDebugEnabled()) { log.debug("nb selected export datas = " + - source.getSelectedData().size()); + source.getSelectedData().size()); } // on declanche la revalidation du modèle @@ -294,13 +310,13 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { ValidateModel source = (ValidateModel) evt.getSource(); if (log.isDebugEnabled()) { log.debug("validation model [" + source + "] changed on " + - evt.getPropertyName() + ", new value = " + - evt.getNewValue()); + evt.getPropertyName() + ", new value = " + + evt.getNewValue()); } validate(); if (log.isDebugEnabled()) { log.debug("nb validators = " + - source.getValidators().size() + source.getValidators().size() ); } firePropertyChange(VALID_STEP_PROPERTY_NAME, validStep); @@ -309,8 +325,8 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { ReportModel source = (ReportModel) evt.getSource(); if (log.isDebugEnabled()) { log.debug("report model [" + source + "] changed on " + - evt.getPropertyName() + ", new value = " + - evt.getNewValue()); + evt.getPropertyName() + ", new value = " + + evt.getNewValue()); } validate(); firePropertyChange(VALID_STEP_PROPERTY_NAME, validStep); @@ -328,8 +344,8 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { ConsolidateModel source = (ConsolidateModel) evt.getSource(); if (log.isDebugEnabled()) { log.debug("consolidate model [" + source + "] changed on " + - evt.getPropertyName() + ", new value = " + - evt.getNewValue()); + evt.getPropertyName() + ", new value = " + + evt.getNewValue()); } validate(); firePropertyChange(VALID_STEP_PROPERTY_NAME, validStep); @@ -501,7 +517,7 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { if (log.isDebugEnabled()) { log.debug("Close previous source " + - previousSource.getLabel()); + previousSource.getLabel()); } doCloseSource(previousSource, false); } @@ -1094,7 +1110,6 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { } - } if (containsOperation(AdminStep.SYNCHRONIZE)) { @@ -1118,7 +1133,7 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { // validate &= centralSourceModel.isValid() && // centralSourceModel.getPgConfig().isCanWriteData(); validate &= centralSourceModel.getDataSourceInformation() != null - && centralSourceModel.getDataSourceInformation().canWriteData(); + && centralSourceModel.getDataSourceInformation().canWriteData(); } @@ -1127,7 +1142,7 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { // il faut le fichier di'mport existe File reportFile = getReportModel().getReportFile(); validate &= reportFile != null && - reportFile.exists(); + reportFile.exists(); } break; case SELECT_DATA: @@ -1174,21 +1189,21 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { // il faut exactement une Trip de selectionnee boolean empty = selectionModel.isDataEmpty(); validate &= !empty && - selectionModel.getSelectedData().size() == 1; + selectionModel.getSelectedData().size() == 1; } } break; case VALIDATE: validate &= validate(AdminStep.SELECT_DATA) && - getStepState(s) == WizardState.SUCCESSED; + getStepState(s) == WizardState.SUCCESSED; break; case EXPORT_DATA: validate &= validate(AdminStep.SELECT_DATA) && - getStepState(s) == WizardState.SUCCESSED; + getStepState(s) == WizardState.SUCCESSED; break; case CONSOLIDATE: validate &= validate(AdminStep.SELECT_DATA) && - getStepState(s) == WizardState.SUCCESSED; + getStepState(s) == WizardState.SUCCESSED; break; case REPORT: @@ -1202,7 +1217,7 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { case SAVE_LOCAL: // valide si l'action a ete executee avec success validate &= !getSaveLocalModel().isDoBackup() || - getStepState(s) == WizardState.SUCCESSED; + getStepState(s) == WizardState.SUCCESSED; break; case SHOW_RESUME: validate = true; diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/CopyToLeftDataSynchronizeTask.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/CopyToLeftDataSynchronizeTask.java new file mode 100644 index 0000000..26689a2 --- /dev/null +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/CopyToLeftDataSynchronizeTask.java @@ -0,0 +1,25 @@ +package fr.ird.observe.ui.admin.datasynchro; + +import fr.ird.observe.services.dto.DataReference; +import fr.ird.observe.services.dto.referential.ProgramDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 03/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class CopyToLeftDataSynchronizeTask extends DataSynchronizeTaskSupport { + + public CopyToLeftDataSynchronizeTask(ReferentialReference<ProgramDto> programReference, DataReference tripReference) { + super(programReference, tripReference); + } + + @Override + public String getLabel() { + return t("observe.datasynchro.copyToLeftTask", decorateProgram(), decorateTrip()); + } +} diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/CopyToRightDataSynchronizeTask.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/CopyToRightDataSynchronizeTask.java new file mode 100644 index 0000000..03bf7f0 --- /dev/null +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/CopyToRightDataSynchronizeTask.java @@ -0,0 +1,26 @@ +package fr.ird.observe.ui.admin.datasynchro; + +import fr.ird.observe.services.dto.DataReference; +import fr.ird.observe.services.dto.referential.ProgramDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 03/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class CopyToRightDataSynchronizeTask extends DataSynchronizeTaskSupport { + + public CopyToRightDataSynchronizeTask(ReferentialReference<ProgramDto> programReference, DataReference tripReference) { + super(programReference, tripReference); + } + + @Override + public String getLabel() { + return t("observe.datasynchro.copyToRightTask", decorateProgram(), decorateTrip()); + } + +} diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroModel.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroModel.java index 1371502..d41df3c 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroModel.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroModel.java @@ -7,16 +7,23 @@ import fr.ird.observe.ui.storage.tabs.DataSelectionModel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import javax.swing.DefaultListModel; + /** * Created on 02/08/16. * * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 */ public class DataSynchroModel extends AdminActionModel { /** Logger. */ private static final Log log = LogFactory.getLog(DataSynchroModel.class); + public static final String LEFT_SOURCE_PROPERTY_NAME = "leftSource"; + public static final String RIGHT_SOURCE_PROPERTY_NAME = "rightSource"; + public static final String TASKS_PROPERTY_NAME = "tasks"; + public static final String LEFT_SELECTION_MODEL_CHANGED_PROPERTY_NAME = "leftSelectionModelChanged"; public static final String RIGHT_SELECTION_MODEL_CHANGED_PROPERTY_NAME = "rightSelectionModelChanged"; @@ -32,6 +39,8 @@ public class DataSynchroModel extends AdminActionModel { /** les données sélectionnées sur le panneau de droite. */ protected final DataSelectionModel rightSelectionDataModel; + protected final DefaultListModel<DataSynchronizeTaskSupport> tasks; + public DataSynchroModel() { super(AdminStep.DATA_SYNCHRONIZE); @@ -40,6 +49,8 @@ public class DataSynchroModel extends AdminActionModel { rightSelectionDataModel = new DataSelectionModel(); rightSelectionDataModel.setUseData(true); + tasks = new DefaultListModel<>(); + } public ObserveSwingDataSource getLeftSource() { @@ -48,6 +59,7 @@ public class DataSynchroModel extends AdminActionModel { public void setLeftSource(ObserveSwingDataSource leftSource) { this.leftSource = leftSource; + firePropertyChange(LEFT_SOURCE_PROPERTY_NAME, leftSource); } public ObserveSwingDataSource getRightSource() { @@ -56,6 +68,7 @@ public class DataSynchroModel extends AdminActionModel { public void setRightSource(ObserveSwingDataSource rightSource) { this.rightSource = rightSource; + firePropertyChange(RIGHT_SOURCE_PROPERTY_NAME, rightSource); } public DataSelectionModel getLeftSelectionDataModel() { @@ -74,6 +87,14 @@ public class DataSynchroModel extends AdminActionModel { populateSelectionModel(rightSource, rightSelectionDataModel, RIGHT_SELECTION_MODEL_CHANGED_PROPERTY_NAME); } + public DefaultListModel<DataSynchronizeTaskSupport> getTasks() { + return tasks; + } + + public void addTask(DataSynchronizeTaskSupport task) { + tasks.addElement(task); + } + private void populateSelectionModel(ObserveSwingDataSource dataSource, DataSelectionModel selectionDataModel, String propertyName) { try { diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUI.jaxx b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUI.jaxx index 0d21a11..61cbf25 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUI.jaxx +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUI.jaxx @@ -37,6 +37,7 @@ jaxx.runtime.SwingUtil + javax.swing.ListSelectionModel javax.swing.tree.TreeSelectionModel </import> @@ -76,7 +77,7 @@ public void destroy() { ]]> </script> - <JPanel id='PENDING_content'> + <!--JPanel id='PENDING_content'> <Table constraints='BorderLayout.CENTER' fill='both' weightx='1' weighty='1'> <row> @@ -85,43 +86,52 @@ public void destroy() { </cell> </row> </Table> - </JPanel> + </JPanel--> - <JPanel id='NEED_FIX_content'> - <Table fill="both" constraints='BorderLayout.CENTER'> - <row weighty="0.8"> - <cell weightx="0.4"> - <JScrollPane id='leftTreePane' decorator='boxed'> - <JTree id='leftTree'/> - </JScrollPane> - </cell> - <cell weightx="0.2"> - <JPanel layout="{new BorderLayout()}" border='{new TitledBorder(" ")}'> - <JPanel id="middleActions" layout="{new GridLayout(0, 1)}" constraints='BorderLayout.CENTER'> - <JButton id="copyToRight"/> - <JButton id="copyToLeft"/> - <JButton id="deleteFromLeft"/> - <JButton id="deleteFromRight"/> + <JPanel id='PENDING_content'> + <JSplitPane id="contentSplitPane" constraints='BorderLayout.CENTER'> + <Table fill="both"> + <row weighty="1"> + <cell weightx="0.45"> + <JScrollPane id='leftTreePane' decorator='boxed'> + <JTree id='leftTree'/> + </JScrollPane> + </cell> + <cell weightx="0.1"> + <JPanel layout="{new BorderLayout()}" border='{new TitledBorder(" ")}'> + <JPanel id="middleActions" layout="{new GridLayout(0, 1)}" constraints='BorderLayout.CENTER'> + <JButton id="copyToRight" onActionPerformed="getHandler().addCopyToRightTasks()"/> + <JButton id="copyToLeft" onActionPerformed="getHandler().addCopyToLeftTasks()"/> + <JButton id="deleteFromLeft" onActionPerformed="getHandler().addDeleteFromLeftTasks()"/> + <JButton id="deleteFromRight" onActionPerformed="getHandler().addDeleteFromRightTasks()"/> + </JPanel> </JPanel> - </JPanel> - </cell> - <cell weightx="0.4"> - <JScrollPane id='rightTreePane' decorator='boxed'> - <JTree id='rightTree'/> - </JScrollPane> - </cell> - </row> - <row weighty="0.8"> - <cell columns="3"> - <JList id="actionsToConsume"/> - </cell> - </row> - <row> - <cell columns='3'> - <JButton id='applyAction' onActionPerformed='getHandler().doExecuteAction()'/> - </cell> - </row> - </Table> + </cell> + <cell weightx="0.45"> + <JScrollPane id='rightTreePane' decorator='boxed'> + <JTree id='rightTree'/> + </JScrollPane> + </cell> + </row> + </Table> + <Table fill="both"> + <row weighty="1"> + <cell weightx="1"> + <JScrollPane id='actionsToConsumePane'> + <JList id="actionsToConsume" onMouseClicked="getHandler().removeTasks(event)"/> + </JScrollPane> + </cell> + </row> + <row> + <cell> + <JPanel layout="{new BorderLayout()}" > + <JButton id='applyAction' constraints='BorderLayout.CENTER' onActionPerformed='getHandler().doExecuteAction()'/> + </JPanel> + </cell> + </row> + </Table> + </JSplitPane> + </JPanel> </fr.ird.observe.ui.admin.AdminTabUI> diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUI.jcss b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUI.jcss index c7781a4..6073115 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUI.jcss +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUI.jcss @@ -28,6 +28,11 @@ layout:{new BorderLayout()}; } +#contentSplitPane { + orientation: {JSplitPane.VERTICAL_SPLIT}; + resizeWeight: 0.8; +} + #startAction { actionIcon:"wizard-start"; } @@ -101,6 +106,13 @@ enabled:false; } -#actionsToConsume { +#actionsToConsumePane { border:{new TitledBorder(t("observe.datasynchro.actionsToPerform"))}; + verticalScrollBarPolicy:{JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED}; +} + +#actionsToConsume { + selectionMode:{ListSelectionModel.SINGLE_SELECTION}; + cellRenderer:{new DataSynchronizeTaskListCellRenderer()}; + model:{getStepModel().getTasks()}; } \ No newline at end of file diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUIHandler.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUIHandler.java index 200b2dc..98b49fd 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUIHandler.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchroUIHandler.java @@ -1,14 +1,25 @@ package fr.ird.observe.ui.admin.datasynchro; import fr.ird.observe.db.ObserveSwingDataSource; +import fr.ird.observe.services.dto.DataReference; +import fr.ird.observe.services.dto.referential.ProgramDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; import fr.ird.observe.ui.admin.AdminTabUIHandler; import fr.ird.observe.ui.admin.AdminUI; import fr.ird.observe.ui.storage.tabs.DataSelectionModel; +import fr.ird.observe.ui.tree.DataSelectionTreeCellRenderer; +import fr.ird.observe.ui.tree.ObserveNode; +import fr.ird.observe.ui.tree.ObserveTreeHelper; import jaxx.runtime.swing.wizard.ext.WizardState; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import javax.swing.JList; import javax.swing.border.TitledBorder; +import java.awt.event.MouseEvent; +import java.util.List; +import java.util.Map; +import java.util.Set; import static org.nuiton.i18n.I18n.t; @@ -16,6 +27,7 @@ import static org.nuiton.i18n.I18n.t; * Created on 02/08/16. * * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 */ public class DataSynchroUIHandler extends AdminTabUIHandler { @@ -43,7 +55,7 @@ public class DataSynchroUIHandler extends AdminTabUIHandler { log.debug(" specialized for [" + tabUI.getStep() + "] for main ui " + ui.getClass().getName() + "@" + System.identityHashCode(ui)); } - tabUI.getStartAction().setText(t("observe.action.datasynchro.launch.operation", t(tabUI.getStep().getOperationLabel()))); +// tabUI.getStartAction().setText(t("observe.action.datasynchro.launch.operation", t(tabUI.getStep().getOperationLabel()))); getStepModel().getLeftSelectionDataModel().addPropertyChangeListener(evt -> { @@ -64,58 +76,190 @@ public class DataSynchroUIHandler extends AdminTabUIHandler { }); - } + DataSelectionTreeCellRenderer.initUI(tabUI.getLeftTreePane(), tabUI.getLeftTree()); + DataSelectionTreeCellRenderer.initUI(tabUI.getRightTreePane(), tabUI.getRightTree()); + + getStepModel().addPropertyChangeListener(DataSynchroModel.LEFT_SOURCE_PROPERTY_NAME, evt -> { + + DataSynchroModel stepModel = (DataSynchroModel) evt.getSource(); + ObserveSwingDataSource dataSource = (ObserveSwingDataSource) evt.getNewValue(); + + tabUI.getLeftTreePane().setBorder(new TitledBorder(getModel().getLocalSourceModel().getLabel())); + stepModel.populateLeftSelectionModel(); + updateSelectionModel(tabUI, tabUI.getLeftTreeHelper(), tabUI.getLeftTree(), dataSource, stepModel.getLeftSelectionDataModel(), tabUI.getLeftSelectionModel()); + sendMessage(t("observe.message.datasynchro.leftData.loaded")); + }); + + getStepModel().addPropertyChangeListener(DataSynchroModel.RIGHT_SOURCE_PROPERTY_NAME, evt -> { - public void doPrepareAction() { + DataSynchroModel stepModel = (DataSynchroModel) evt.getSource(); + ObserveSwingDataSource dataSource = (ObserveSwingDataSource) evt.getNewValue(); - addAdminWorker(getUi().getStartAction().getToolTipText(), this::doAction); + tabUI.getRightTreePane().setBorder(new TitledBorder(getModel().getCentralSourceModel().getLabel())); + stepModel.populateRightSelectionModel(); + updateSelectionModel(tabUI, tabUI.getRightTreeHelper(), tabUI.getRightTree(), dataSource, stepModel.getRightSelectionDataModel(), tabUI.getRightSelectionModel()); + sendMessage(t("observe.message.datasynchro.rightData.loaded")); + + }); } - public void doExecuteAction() { +// public void doPrepareAction() { +// +// addAdminWorker(getUi().getStartAction().getToolTipText(), this::doAction); +// +// } + + public void addCopyToLeftTasks() { + + DataSelectionModel selectionDataModel = getStepModel().getRightSelectionDataModel(); + ObserveTreeHelper treeHelper = getUi().getRightTreeHelper(); + Map<ReferentialReference<ProgramDto>, List<DataReference>> selectedDataByProgram = selectionDataModel.getSelectedDataByProgram(); + selectionDataModel.removeAllSelectedData(); + for (Map.Entry<ReferentialReference<ProgramDto>, List<DataReference>> entry : selectedDataByProgram.entrySet()) { + ReferentialReference<ProgramDto> program = entry.getKey(); + for (DataReference trip : entry.getValue()) { + getStepModel().addTask(new CopyToLeftDataSynchronizeTask(program, trip)); + treeHelper.removeTrip(program, trip); + selectionDataModel.removeTrip(program, trip); + } + } - //TODO - getModel().setStepState(WizardState.SUCCESSED); } - private WizardState doAction() throws Exception { + public void addCopyToRightTasks() { + + DataSelectionModel selectionDataModel = getStepModel().getLeftSelectionDataModel(); + ObserveTreeHelper treeHelper = getUi().getLeftTreeHelper(); + Map<ReferentialReference<ProgramDto>, List<DataReference>> selectedDataByProgram = selectionDataModel.getSelectedDataByProgram(); + selectionDataModel.removeAllSelectedData(); + for (Map.Entry<ReferentialReference<ProgramDto>, List<DataReference>> entry : selectedDataByProgram.entrySet()) { + ReferentialReference<ProgramDto> program = entry.getKey(); + for (DataReference trip : entry.getValue()) { + getStepModel().addTask(new CopyToRightDataSynchronizeTask(program, trip)); + treeHelper.removeTrip(program, trip); + selectionDataModel.removeTrip(program, trip); + } + } - if (log.isDebugEnabled()) { - log.debug(this); + } + + public void addDeleteFromLeftTasks() { + + DataSelectionModel selectionDataModel = getStepModel().getLeftSelectionDataModel(); + ObserveTreeHelper treeHelper = getUi().getLeftTreeHelper(); + Map<ReferentialReference<ProgramDto>, List<DataReference>> selectedDataByProgram = selectionDataModel.getSelectedDataByProgram(); + selectionDataModel.removeAllSelectedData(); + for (Map.Entry<ReferentialReference<ProgramDto>, List<DataReference>> entry : selectedDataByProgram.entrySet()) { + ReferentialReference<ProgramDto> program = entry.getKey(); + for (DataReference trip : entry.getValue()) { + getStepModel().addTask(new DeleteFromLeftDataSynchronizeTask(program, trip)); + treeHelper.removeTrip(program, trip); + selectionDataModel.removeTrip(program, trip); + } + } + + } + + public void addDeleteFromRightTasks() { + + DataSelectionModel selectionDataModel = getStepModel().getRightSelectionDataModel(); + ObserveTreeHelper treeHelper = getUi().getRightTreeHelper(); + Map<ReferentialReference<ProgramDto>, List<DataReference>> selectedDataByProgram = selectionDataModel.getSelectedDataByProgram(); + selectionDataModel.removeAllSelectedData(); + for (Map.Entry<ReferentialReference<ProgramDto>, List<DataReference>> entry : selectedDataByProgram.entrySet()) { + ReferentialReference<ProgramDto> program = entry.getKey(); + for (DataReference trip : entry.getValue()) { + getStepModel().addTask(new DeleteFromRightDataSynchronizeTask(program, trip)); + treeHelper.removeTrip(program, trip); + selectionDataModel.removeTrip(program, trip); + } } - DataSynchroModel stepModel = getStepModel(); + } - // on cree les sources de données + public void removeTasks(MouseEvent event) { - ObserveSwingDataSource leftSource = model.getSafeLocalSource(false); - stepModel.setLeftSource(leftSource); + if (event.getClickCount() > 1) { - ObserveSwingDataSource rightSource = model.getSafeCentralSource(false); - stepModel.setRightSource(rightSource); + JList source = (JList) event.getSource(); + int selectionIndex = source.getMinSelectionIndex(); + DataSynchronizeTaskSupport task = getStepModel().getTasks().getElementAt(selectionIndex); + getStepModel().getTasks().removeElementAt(selectionIndex); - openSource(leftSource); - openSource(rightSource); + ObserveTreeHelper treeHelper; + DataSelectionModel selectionDataModel; + if (task instanceof CopyToLeftDataSynchronizeTask || task instanceof DeleteFromRightDataSynchronizeTask) { - // Populate tree models + // push back to right tree + treeHelper = getUi().getRightTreeHelper(); + selectionDataModel = getStepModel().getRightSelectionDataModel(); + } else { - DataSynchroUI tabUI = getUi(); + // push back to left tree - tabUI.getLeftTreePane().setBorder(new TitledBorder(leftSource.getLabel())); - stepModel.populateLeftSelectionModel(); - updateSelectionModel(tabUI, tabUI.getLeftTreeHelper(), tabUI.getLeftTree(), leftSource, stepModel.getLeftSelectionDataModel(), tabUI.getLeftSelectionModel()); - sendMessage(t("observe.message.datasynchro.leftData.loaded")); + treeHelper = getUi().getLeftTreeHelper(); + selectionDataModel = getStepModel().getLeftSelectionDataModel(); + } - tabUI.getRightTreePane().setBorder(new TitledBorder(rightSource.getLabel())); - stepModel.populateRightSelectionModel(); - updateSelectionModel(tabUI, tabUI.getRightTreeHelper(), tabUI.getRightTree(), rightSource, stepModel.getRightSelectionDataModel(), tabUI.getRightSelectionModel()); - sendMessage(t("observe.message.datasynchro.rightData.loaded")); + ReferentialReference<ProgramDto> program = task.getProgram(); + DataReference trip = task.getTrip(); - sendMessage(t("observe.message.datasynchro.ready")); + Set<ReferentialReference<ProgramDto>> programs = selectionDataModel.getPrograms(); + ObserveNode programNode; + if (programs.contains(program)) { + programNode = treeHelper.getChild(treeHelper.getRootNode(), program.getId()); + } else { + programNode = treeHelper.addProgram(programs, program); + } - return WizardState.NEED_FIX; + selectionDataModel.addData(program, trip); + treeHelper.addSimpleTrip(programNode, trip); + } } + public void doExecuteAction() { + + //TODO + getModel().setStepState(WizardState.SUCCESSED); + + } + +// private WizardState doAction() throws Exception { +// +// if (log.isDebugEnabled()) { +// log.debug(this); +// } +// +// DataSynchroModel stepModel = getStepModel(); +// +// // on cree les sources de données +// +// ObserveSwingDataSource leftSource = model.getSafeLocalSource(false); +// openSource(leftSource); +// stepModel.setLeftSource(leftSource); +// +// ObserveSwingDataSource rightSource = model.getSafeCentralSource(false); +// openSource(rightSource); +// stepModel.setRightSource(rightSource); +// +// +// // Populate tree models +// +// DataSynchroUI tabUI = getUi(); +// +// tabUI.getLeftTreePane().setBorder(new TitledBorder(leftSource.getLabel())); +// stepModel.populateLeftSelectionModel(); +// updateSelectionModel(tabUI, tabUI.getLeftTreeHelper(), tabUI.getLeftTree(), leftSource, stepModel.getLeftSelectionDataModel(), tabUI.getLeftSelectionModel()); +// sendMessage(t("observe.message.datasynchro.leftData.loaded")); +// +// +// sendMessage(t("observe.message.datasynchro.ready")); +// +// return WizardState.NEED_FIX; +// +// } + } \ No newline at end of file diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchronizeTaskListCellRenderer.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchronizeTaskListCellRenderer.java new file mode 100644 index 0000000..cccbbab --- /dev/null +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchronizeTaskListCellRenderer.java @@ -0,0 +1,37 @@ +package fr.ird.observe.ui.admin.datasynchro; + +import jaxx.runtime.SwingUtil; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.ImageIcon; +import javax.swing.JList; +import java.awt.Component; + +/** + * Created on 03/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class DataSynchronizeTaskListCellRenderer extends DefaultListCellRenderer { + + private static final long serialVersionUID = 1L; + + private final ImageIcon icon; + + public DataSynchronizeTaskListCellRenderer() { + icon = SwingUtil.createActionIcon("cancel"); + } + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + + DataSynchronizeTaskSupport task = (DataSynchronizeTaskSupport) value; + String label = task.getLabel(); + Component listCellRendererComponent = super.getListCellRendererComponent(list, label, index, isSelected, cellHasFocus); + setIcon(icon); + return listCellRendererComponent; + + } + +} diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchronizeTaskSupport.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchronizeTaskSupport.java new file mode 100644 index 0000000..b60565f --- /dev/null +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DataSynchronizeTaskSupport.java @@ -0,0 +1,47 @@ +package fr.ird.observe.ui.admin.datasynchro; + +import fr.ird.observe.ObserveSwingApplicationContext; +import fr.ird.observe.application.swing.decoration.DecoratorService; +import fr.ird.observe.services.dto.DataReference; +import fr.ird.observe.services.dto.referential.ProgramDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; + +/** + * Created on 03/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public abstract class DataSynchronizeTaskSupport { + + private final ReferentialReference<ProgramDto> program; + private final DataReference trip; + + public abstract String getLabel(); + + public ReferentialReference<ProgramDto> getProgram() { + return program; + } + + public DataReference getTrip() { + return trip; + } + + protected DataSynchronizeTaskSupport(ReferentialReference<ProgramDto> program, DataReference trip) { + this.program = program; + this.trip = trip; + } + + protected String decorateProgram() { + DecoratorService decoratorService = ObserveSwingApplicationContext.get().getDecoratorService(); + String programStr = decoratorService.getReferentialReferenceDecorator(ProgramDto.class).toString(getProgram()); + return programStr; + } + + protected String decorateTrip() { + DecoratorService decoratorService = ObserveSwingApplicationContext.get().getDecoratorService(); + String tripStr = decoratorService.getTripReferenceDecorator(getTrip()).toString(getTrip()); + return tripStr; + } + +} diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DeleteFromLeftDataSynchronizeTask.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DeleteFromLeftDataSynchronizeTask.java new file mode 100644 index 0000000..d6705fb --- /dev/null +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DeleteFromLeftDataSynchronizeTask.java @@ -0,0 +1,25 @@ +package fr.ird.observe.ui.admin.datasynchro; + +import fr.ird.observe.services.dto.DataReference; +import fr.ird.observe.services.dto.referential.ProgramDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 03/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class DeleteFromLeftDataSynchronizeTask extends DataSynchronizeTaskSupport { + + public DeleteFromLeftDataSynchronizeTask(ReferentialReference<ProgramDto> programReference, DataReference tripReference) { + super(programReference, tripReference); + } + + @Override + public String getLabel() { + return t("observe.datasynchro.deleteFromLeftTask", decorateProgram(), decorateTrip()); + } +} diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DeleteFromRightDataSynchronizeTask.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DeleteFromRightDataSynchronizeTask.java new file mode 100644 index 0000000..b891c9a --- /dev/null +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/datasynchro/DeleteFromRightDataSynchronizeTask.java @@ -0,0 +1,25 @@ +package fr.ird.observe.ui.admin.datasynchro; + +import fr.ird.observe.services.dto.DataReference; +import fr.ird.observe.services.dto.referential.ProgramDto; +import fr.ird.observe.services.dto.referential.ReferentialReference; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 03/08/16. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 5.0 + */ +public class DeleteFromRightDataSynchronizeTask extends DataSynchronizeTaskSupport { + + public DeleteFromRightDataSynchronizeTask(ReferentialReference<ProgramDto> programReference, DataReference tripReference) { + super(programReference, tripReference); + } + + @Override + public String getLabel() { + return t("observe.datasynchro.deleteFromRightTask", decorateProgram(), decorateTrip()); + } +} diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/DataSelectionModel.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/DataSelectionModel.java index 95aecc8..9f7f29e 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/DataSelectionModel.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/storage/tabs/DataSelectionModel.java @@ -47,6 +47,7 @@ import org.apache.commons.logging.LogFactory; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.Serializable; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -539,4 +540,24 @@ public class DataSelectionModel implements Serializable { return result; } + + public void addData(ReferentialReference<ProgramDto> program, DataReference trip) { + if (!getDatas().containsKey(program)) { + getDatas().put(program, new ArrayList<>()); + } + getDatas(program.getId()).add(trip); + firePropertyChange(PROPERTY_DATAS, getDatas()); + } + + public Set<ReferentialReference<ProgramDto>> getPrograms() { + return getDatas().keySet(); + } + + public void removeTrip(ReferentialReference<ProgramDto> program, DataReference trip) { + List<DataReference> trips = getDatas(program.getId()); + trips.remove(trip); + if (trips.isEmpty()) { + getDatas().remove(program); + } + } } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/ObserveTreeHelper.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/ObserveTreeHelper.java index 6c28585..97d0aa5 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/ObserveTreeHelper.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/ObserveTreeHelper.java @@ -377,8 +377,7 @@ public class ObserveTreeHelper extends NavTreeHelper<ObserveNode> { } finally { getBridge().setPathToSelect(); if (log.isInfoEnabled()) { - log.info("Creates " + (ObserveNode.count - count) + - " nodes to select path " + Arrays.toString(path)); + log.info("Creates " + (ObserveNode.count - count) + " nodes to select path " + Arrays.toString(path)); } } } @@ -457,6 +456,35 @@ public class ObserveTreeHelper extends NavTreeHelper<ObserveNode> { return result; } + public ObserveNode addSimpleTrip(ObserveNode parentNode, DataReference<?> bean) { + ObserveNode result; + + if (bean.getType().isAssignableFrom(TripSeineDto.class)) { + + ProgramSeineNodeChildLoador loador = getChildLoador(ProgramSeineNodeChildLoador.class); + boolean addChilds = loador.isAddChilds(); + loador.setAddChilds(false); + try { + result = loador.createNode((DataReference<TripSeineDto>) bean, dataProvider); + insertNode(parentNode, result); + } finally { + loador.setAddChilds(addChilds); + } + } else { + + ProgramLonglineNodeChildLoador loador = getChildLoador(ProgramLonglineNodeChildLoador.class); + boolean addChilds = loador.isAddChilds(); + loador.setAddChilds(false); + try { + result = loador.createNode((DataReference<TripLonglineDto>) bean, dataProvider); + insertNode(parentNode, result); + } finally { + loador.setAddChilds(addChilds); + } + } + return result; + } + public ObserveNode addRoute(ObserveNode parentNode, DataReference<RouteDto> bean) { RoutesNodeChildLoador loador = getChildLoador(RoutesNodeChildLoador.class); @@ -508,7 +536,7 @@ public class ObserveTreeHelper extends NavTreeHelper<ObserveNode> { public ObserveNode addProgram(ReferentialReference<ProgramDto> bean) { Set<ReferentialReference<ProgramDto>> programs = getDataProvider().getDataSource().getReferentialReferences(ProgramDto.class); - List data = Lists.newArrayList(programs); + List<ReferentialReference<ProgramDto>> data = Lists.newArrayList(programs); int newIndex = 0; if (CollectionUtils.isNotEmpty(data)) { sortPrograms(data); @@ -536,6 +564,35 @@ public class ObserveTreeHelper extends NavTreeHelper<ObserveNode> { refreshNode(result, false); } + public ObserveNode addProgram(Set<ReferentialReference<ProgramDto>> existingPrograms, ReferentialReference<ProgramDto> bean) { + + List<ReferentialReference<ProgramDto>> data = Lists.newArrayList(existingPrograms); + data.add(bean); + int newIndex = 0; + if (CollectionUtils.isNotEmpty(data)) { + sortPrograms(data); + newIndex = data.indexOf(bean); + } + RootNodeChildLoador loador = getChildLoador(RootNodeChildLoador.class); + ObserveNode result = loador.createNode(bean, dataProvider); + insertNode(getRootNode(), result, newIndex); + return result; + } + + public void removeTrip(ReferentialReference<ProgramDto> program, DataReference trip) { + + ObserveNode rootNode = getRootNode(); + ObserveNode programNode = rootNode.getChild(program.getId(), getBridge(), dataProvider); + Preconditions.checkNotNull(programNode, "Could not find program node with id: " + program); + ObserveNode tripNode = programNode.getChild(trip.getId(), getBridge(), dataProvider); + Preconditions.checkNotNull(tripNode, "Could not find program node with id: " + trip); + removeNode(tripNode); + + if (programNode.isLeaf()) { + removeProgram(program.getId()); + } + } + public void reloadSelectedNode(boolean refreshFromParent, boolean refreshChilds) { ObserveNode node = getSelectedNode(); ((AbstrctReferenceNodeSupport) node).setReloadEntity(true); diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/loadors/ProgramLonglineNodeChildLoador.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/loadors/ProgramLonglineNodeChildLoador.java index 70c65bc..b786b43 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/loadors/ProgramLonglineNodeChildLoador.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/loadors/ProgramLonglineNodeChildLoador.java @@ -134,5 +134,12 @@ public class ProgramLonglineNodeChildLoador extends AbstractNodeChildLoador<Data } + public void setAddChilds(boolean addChilds) { + this.addChilds = addChilds; + } + + public boolean isAddChilds() { + return addChilds; + } } diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/loadors/ProgramSeineNodeChildLoador.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/loadors/ProgramSeineNodeChildLoador.java index 03899dc..5dc088f 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/loadors/ProgramSeineNodeChildLoador.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/tree/loadors/ProgramSeineNodeChildLoador.java @@ -128,4 +128,12 @@ public class ProgramSeineNodeChildLoador extends AbstractNodeChildLoador<DataRef return result; } + + public boolean isAddChilds() { + return addChilds; + } + + public void setAddChilds(boolean addChilds) { + this.addChilds = addChilds; + } } diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties index 908924b..7d26d45 100644 --- a/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties +++ b/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties @@ -1042,6 +1042,10 @@ observe.content.mode.create.tip= observe.content.mode.read.tip= observe.content.mode.update.tip= observe.datasynchro.actionsToPerform= +observe.datasynchro.copyToLeftTask= +observe.datasynchro.copyToRightTask= +observe.datasynchro.deleteFromLeftTask= +observe.datasynchro.deleteFromRightTask= observe.encounter.action.create=Insert this encounter observe.encounter.action.create.tip=Insert this encounter observe.encounter.count=Count diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties index 6b9c8cf..bc0bf88 100644 --- a/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties +++ b/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties @@ -1042,6 +1042,10 @@ observe.content.mode.create.tip=Objeto en proceso de creación observe.content.mode.read.tip=Objeto no se puede editar observe.content.mode.update.tip=Objeto en proceso de edición observe.datasynchro.actionsToPerform= +observe.datasynchro.copyToLeftTask= +observe.datasynchro.copyToRightTask= +observe.datasynchro.deleteFromLeftTask= +observe.datasynchro.deleteFromRightTask= observe.encounter.action.create= observe.encounter.action.create.tip= observe.encounter.count= diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties index 770bc94..279004e 100644 --- a/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties +++ b/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties @@ -1041,6 +1041,10 @@ observe.content.mode.create.tip=L'objet est en cours de création observe.content.mode.read.tip=L'objet n'est pas éditable observe.content.mode.update.tip=L'objet est en cours d'édition observe.datasynchro.actionsToPerform=Opérations à réaliser +observe.datasynchro.copyToLeftTask=Copier vers la base de gauche \: %s - %s +observe.datasynchro.copyToRightTask=Copier vers la base de droite \: %s - %s +observe.datasynchro.deleteFromLeftTask=Supprimer de la base de gauche \: %s - %s +observe.datasynchro.deleteFromRightTask=Supprimer de la base de droite \: %s - %s observe.encounter.action.create=Insérer cette rencontre observe.encounter.action.create.tip=Insérer cette rencontre observe.encounter.count=Nombre -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.