r218 - in trunk/tutti-ui-swing/src/main: java/fr/ifremer/tutti/ui/swing java/fr/ifremer/tutti/ui/swing/content/home java/fr/ifremer/tutti/ui/swing/content/operation java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology java/fr/ifremer/tutti/ui/swing/util java/fr/ifremer/tutti/ui/swing/util/table resources/i18n
Author: kmorin Date: 2013-01-17 18:08:09 +0100 (Thu, 17 Jan 2013) New Revision: 218 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/218 Log: - improve the error table - readd the save button in the fishing operation edition screen Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiTabContainerUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIModel.java trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUIHandler.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUIHandler.java 2013-01-17 17:08:09 UTC (rev 218) @@ -36,22 +36,12 @@ import fr.ifremer.tutti.ui.swing.content.program.EditProgramUI; import fr.ifremer.tutti.ui.swing.content.protocol.EditProtocolUI; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; -import java.awt.BorderLayout; -import java.awt.Component; import java.awt.Desktop; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.net.URL; import java.util.Calendar; -import javax.swing.JButton; import javax.swing.JComponent; -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; import javax.swing.JToolBar; import jaxx.runtime.swing.AboutPanel; import jaxx.runtime.swing.ErrorDialogUI; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/home/SelectCruiseUIHandler.java 2013-01-17 17:08:09 UTC (rev 218) @@ -33,6 +33,7 @@ import fr.ifremer.tutti.ui.swing.AbstractTuttiUIHandler; import fr.ifremer.tutti.ui.swing.TuttiScreen; import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import java.awt.Color; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; @@ -45,15 +46,17 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; +import javax.swing.CellRendererPane; import javax.swing.ComboBoxModel; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListCellRenderer; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JList; +import javax.swing.JScrollPane; +import javax.swing.JViewport; import javax.swing.border.EmptyBorder; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; +import javax.swing.plaf.basic.BasicComboPopup; import jaxx.runtime.SwingUtil; import static org.nuiton.i18n.I18n._; @@ -207,36 +210,6 @@ return result; } }); - newProtocolCombo.addMouseListener(new MouseAdapter() { - - @Override - public void mouseEntered(MouseEvent e) { - newProtocolCombo.showPopup(); - } - - }); -// newProtocolCombo.addPopupMenuListener(new PopupMenuListener() { -// -// @Override -// public void popupMenuWillBecomeVisible(PopupMenuEvent e) { -// newProtocolCombo.getComponentPopupMenu().addMouseListener(new MouseAdapter() { -// -// @Override -// public void mouseExited(MouseEvent e) { -// newProtocolCombo.hidePopup(); -// } -// -// }); -// } -// -// @Override -// public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { -// } -// -// @Override -// public void popupMenuCanceled(PopupMenuEvent e) { -// } -// }); newProtocolCombo.setModel(protocolActions); model.addPropertyChangeListener(SelectCruiseUIModel.PROPERTY_PROGRAM, new PropertyChangeListener() { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.css 2013-01-17 17:08:09 UTC (rev 218) @@ -418,14 +418,9 @@ horizontalAlignment: {JLabel.CENTER}; } -#createFishingOperationActions { - visible: {!model.isPersisted()}; -} - #saveButton { actionIcon: save; text: "tutti.action.save"; - enabled: {model.isValid()}; } #cancelButton { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-01-17 17:08:09 UTC (rev 218) @@ -36,6 +36,7 @@ import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; import fr.ifremer.tutti.ui.swing.MainUI; +import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.fishing.environment.EnvironmentTabUI; import fr.ifremer.tutti.ui.swing.content.operation.fishing.environment.EnvironmentTabUIModel; import fr.ifremer.tutti.ui.swing.content.operation.fishing.gearshooting.GearShootingTabUI; @@ -67,8 +68,7 @@ * @author tchemit <chemit@codelutin.com> * @since 0.1 */ -public class EditFishingOperationUIHandler extends AbstractTuttiTabContainerUIHandler<EditFishingOperationUIModel> - implements TabHandler { +public class EditFishingOperationUIHandler extends AbstractTuttiTabContainerUIHandler<EditFishingOperationUIModel> { /** Logger. */ private static final Log log = @@ -267,6 +267,32 @@ hydrologyModel.setAvailableCaracteristics(persistenceService.getAllFishingOperationHydrologicCaracteristic()); setCustomTab(3, hydrologyModel); + if (TuttiUIContext.VALIDATION_CONTEXT_VALIDATE.equals(model.getValidationContext())) { + PropertyChangeListener pcl = new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + boolean allModelsValid = areAllModelsValid(); + ui.getSaveButton().setEnabled(allModelsValid); + } + }; + gearShootingModel.addPropertyChangeListener(AbstractTuttiBeanUIModel.PROPERTY_VALID, pcl); + environmentModel.addPropertyChangeListener(AbstractTuttiBeanUIModel.PROPERTY_VALID, pcl); + hydrologyModel.addPropertyChangeListener(AbstractTuttiBeanUIModel.PROPERTY_VALID, pcl); + model.addPropertyChangeListener(AbstractTuttiBeanUIModel.PROPERTY_VALID, pcl); + + } else { + model.addPropertyChangeListener(AbstractTuttiBeanUIModel.PROPERTY_VALID, new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + boolean valid = (boolean) evt.getNewValue(); + ui.getSaveButton().setEnabled(valid); + } + }); + } + + MainUI main = ui.getContextValue(MainUI.class, MainUI.class.getName()); main.clearValidators(); main.registerValidator(ui.getValidator()); @@ -294,36 +320,6 @@ } @Override - protected boolean onTabChanged(int currentIndex, int newIndex) { - boolean result = super.onTabChanged(currentIndex, newIndex); - if (result && currentIndex != newIndex && currentIndex >= 0) { - CustomTab currentTab = (CustomTab) getTabPanel().getTabComponentAt(currentIndex); - AbstractTuttiBeanUIModel model = currentTab.getModel(); - result = model.isValid(); - - if (result && !model.isCreate() && model.isModify()) { - save(); - } - } - return result; - } - - @Override - public boolean onHideTab() { - AbstractTuttiBeanUIModel model = getModel(); - boolean result = model.isValid(); - if (result && !model.isCreate() && model.isModify()) { - save(); - } - return result; - } - - @Override - public void onShowTab() { - log.info("show tab"); - } - - @Override protected EditFishingOperationUIModel getModel() { return ui.getModel(); } @@ -333,10 +329,6 @@ //------------------------------------------------------------------------// public void clearFishingOperation() { - if (fishingOperationMonitor.wasModified()) { - save(); - } - EditFishingOperationUIModel model = getModel(); model.fromBean(new FishingOperation()); @@ -348,11 +340,6 @@ } public void selectFishingOperation(FishingOperation bean) { - - if (fishingOperationMonitor.wasModified()) { - save(); - } - boolean empty = bean == null; EditFishingOperationUIModel model = getModel(); @@ -418,17 +405,11 @@ public void cancel() { - String id = getModel().getId(); - if (log.isInfoEnabled()) { - log.info("Cancel edition for fishingOperation: " + id); + log.info("Cancel edition for fishingOperation "); } - boolean newBean = StringUtils.isBlank(id); - - if (newBean) { - // cancel to create a new fishingOperation - parentUi.getHandler().closeCurrentFishingOperation(); - } + // cancel to create a new fishingOperation + parentUi.getHandler().closeCurrentFishingOperation(); } public void save() { @@ -448,7 +429,7 @@ // save modified fishing operation FishingOperation toSave = beanToSave.toBean(); - + showInformationMessage( "[ Trait - Caractéristiques générales ] " + "Sauvegarde des modifications de " + decorate(toSave) + @@ -567,5 +548,13 @@ ui.getLocationComboBox().setData(location); } } + + protected boolean areAllModelsValid() { + GearShootingTabUIModel gearShootingModel = ui.getGearShootingTabContent().getModel(); + EnvironmentTabUIModel environmentModel = ui.getEnvironmentTabContent().getModel(); + HydrologyTabUIModel hydrologyModel = ui.getHydrologyTabContent().getModel(); + return getModel().isValid() && gearShootingModel.isValid() + && environmentModel.isValid() && hydrologyModel.isValid(); + } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java 2013-01-17 17:08:09 UTC (rev 218) @@ -134,7 +134,7 @@ * @since 0.2 */ protected boolean empty; - + protected Cruise cruise; protected String stationNumber; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIHandler.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIHandler.java 2013-01-17 17:08:09 UTC (rev 218) @@ -110,15 +110,8 @@ log.info("Row " + row + " was modified, will save it"); } - showInformationMessage( - "[ Trait - Environnement ] " + - "Sauvegarde des modifications de " + row + "."); - saveRow(row); - // clear modified flag on the monitor - rowMonitor.clearModified(); - getModel().setModify(false); } } } @@ -191,7 +184,7 @@ super.onAfterSelectedRowChanged(oldRowIndex, oldRow, newRowIndex, newRow); getModel().setRemoveCaracteristicEnabled(newRow != null); } - + //------------------------------------------------------------------------// //-- Public methods --// //------------------------------------------------------------------------// @@ -214,7 +207,7 @@ EnvironmentTabUIModel model = getModel(); model.setModify(true); - model.setValid(row.isValid()); + recomputeRowValidState(row); } /** Resets the table with the data from the database */ @@ -281,15 +274,12 @@ FishingOperation fishingOperation = getModel().getFishingOperation(); Preconditions.checkNotNull(fishingOperation); - fishingOperation.getEnvironmentCaracteristics().remove(row.getKey()); - - if (TuttiEntities.isNew(fishingOperation)) { - - fishingOperation = persistenceService.createFishingOperation(fishingOperation); - } else { - persistenceService.saveFishingOperation(fishingOperation); + CaracteristicMap caracteristicMap = fishingOperation.getEnvironmentCaracteristics(); + if (caracteristicMap != null) { + caracteristicMap.remove(row.getKey()); } + //add the row in the combo BeanComboBox keyCombo = ui.getNewRowKey(); keyCombo.addItem(row.getKey()); @@ -301,6 +291,8 @@ // refresh all the table getTableModel().fireTableRowsDeleted(rowIndex, rowIndex); + getModel().removeRowInError(row); + } //------------------------------------------------------------------------// @@ -309,19 +301,16 @@ protected void saveRow(EnvironmentRowModel row) { - FishingOperation fishingOperation = getModel().getFishingOperation(); - Preconditions.checkNotNull(fishingOperation); + if (row.isValid()) { + FishingOperation fishingOperation = getModel().getFishingOperation(); + Preconditions.checkNotNull(fishingOperation); - if (fishingOperation.getEnvironmentCaracteristics() == null) { - fishingOperation.setEnvironmentCaracteristics(new CaracteristicMap()); - } - fishingOperation.getEnvironmentCaracteristics().put(row.getKey(), row.getValue()); - - if (TuttiEntities.isNew(fishingOperation)) { + if (fishingOperation.getEnvironmentCaracteristics() == null) { + fishingOperation.setEnvironmentCaracteristics(new CaracteristicMap()); + } - fishingOperation = persistenceService.createFishingOperation(fishingOperation); - } else { - persistenceService.saveFishingOperation(fishingOperation); + fishingOperation.getEnvironmentCaracteristics().put(row.getKey(), row.getValue()); } } + } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIModel.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIModel.java 2013-01-17 17:08:09 UTC (rev 218) @@ -24,11 +24,14 @@ * #L% */ +import com.google.common.collect.Lists; import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderModelBuilder; @@ -103,4 +106,5 @@ this.removeCaracteristicEnabled = removeCaracteristicEnabled; firePropertyChange(PROPERTY_REMOVE_CARACTERISTIC_ENABLED, oldValue, removeCaracteristicEnabled); } + } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTableModel.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTableModel.java 2013-01-17 17:08:09 UTC (rev 218) @@ -26,7 +26,6 @@ import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel; import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; - import javax.swing.table.TableColumnModel; import static org.nuiton.i18n.I18n.n_; @@ -59,4 +58,5 @@ EnvironmentRowModel result = new EnvironmentRowModel(); return result; } + } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingRowModel.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingRowModel.java 2013-01-17 17:08:09 UTC (rev 218) @@ -28,6 +28,8 @@ import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; import fr.ifremer.tutti.ui.swing.util.table.CaracteristicRow; import java.io.Serializable; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; @@ -38,6 +40,8 @@ public class GearShootingRowModel extends AbstractTuttiBeanUIModel<CaracteristicRow, GearShootingRowModel> { private static final long serialVersionUID = 1L; + + private static final Log log = LogFactory.getLog(GearShootingRowModel.class); public static final String PROPERTY_KEY = "key"; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIHandler.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIHandler.java 2013-01-17 17:08:09 UTC (rev 218) @@ -32,7 +32,9 @@ import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; +import fr.ifremer.tutti.ui.swing.util.TabHandler; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueEditor; import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueRenderer; @@ -111,15 +113,8 @@ log.info("Row " + row + " was modified, will save it"); } - showInformationMessage( - "[ Trait - Engin ] " + - "Sauvegarde des modifications de " + row + "."); - saveRow(row); - // clear modified flag on the monitor - rowMonitor.clearModified(); - getModel().setModify(false); } } } @@ -194,7 +189,7 @@ super.onAfterSelectedRowChanged(oldRowIndex, oldRow, newRowIndex, newRow); getModel().setRemoveCaracteristicEnabled(newRow != null); } - + //------------------------------------------------------------------------// //-- Public methods --// //------------------------------------------------------------------------// @@ -217,7 +212,7 @@ GearShootingTabUIModel model = getModel(); model.setModify(true); - model.setValid(row.isValid()); + recomputeRowValidState(row); } /** Resets the table with the data from the database */ @@ -283,13 +278,9 @@ FishingOperation fishingOperation = getModel().getFishingOperation(); Preconditions.checkNotNull(fishingOperation); - fishingOperation.getGearShootingCaracteristics().remove(row.getKey()); - - if (TuttiEntities.isNew(fishingOperation)) { - - fishingOperation = persistenceService.createFishingOperation(fishingOperation); - } else { - persistenceService.saveFishingOperation(fishingOperation); + CaracteristicMap caracteristicMap = fishingOperation.getGearShootingCaracteristics(); + if (caracteristicMap != null) { + caracteristicMap.remove(row.getKey()); } //add the row in the combo @@ -303,6 +294,8 @@ // refresh all the table getTableModel().fireTableRowsDeleted(rowIndex, rowIndex); + getModel().removeRowInError(row); + } //------------------------------------------------------------------------// @@ -310,21 +303,15 @@ //------------------------------------------------------------------------// protected void saveRow(GearShootingRowModel row) { + if (row.isValid()) { + FishingOperation fishingOperation = getModel().getFishingOperation(); + Preconditions.checkNotNull(fishingOperation); - FishingOperation fishingOperation = getModel().getFishingOperation(); - Preconditions.checkNotNull(fishingOperation); - - if (fishingOperation.getGearShootingCaracteristics() == null) { - fishingOperation.setGearShootingCaracteristics(new CaracteristicMap()); + if (fishingOperation.getGearShootingCaracteristics() == null) { + fishingOperation.setGearShootingCaracteristics(new CaracteristicMap()); + } + fishingOperation.getGearShootingCaracteristics().put(row.getKey(), row.getValue()); } - fishingOperation.getGearShootingCaracteristics().put(row.getKey(), row.getValue()); - - if (TuttiEntities.isNew(fishingOperation)) { - - fishingOperation = persistenceService.createFishingOperation(fishingOperation); - } else { - persistenceService.saveFishingOperation(fishingOperation); - } } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIHandler.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIHandler.java 2013-01-17 17:08:09 UTC (rev 218) @@ -33,9 +33,11 @@ import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.service.DecoratorService; +import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; import fr.ifremer.tutti.ui.swing.util.HydrologicCaracteristicUtil; import fr.ifremer.tutti.ui.swing.util.HydrologicCaracteristicUtil.Type; +import fr.ifremer.tutti.ui.swing.util.TabHandler; import fr.ifremer.tutti.ui.swing.util.TuttiBeanMonitor; import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueEditor; import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueRenderer; @@ -127,15 +129,8 @@ log.info("Row " + row + " was modified, will save it"); } - showInformationMessage( - "[ Trait - Hydro ] " + - "Sauvegarde des modifications de " + row + "."); - saveRow(row); - // clear modified flag on the monitor - rowMonitor.clearModified(); - getModel().setModify(false); } } } @@ -246,7 +241,7 @@ super.onAfterSelectedRowChanged(oldRowIndex, oldRow, newRowIndex, newRow); getModel().setRemoveCaracteristicEnabled(newRow != null); } - + //------------------------------------------------------------------------// //-- Public methods --// //------------------------------------------------------------------------// @@ -269,7 +264,7 @@ HydrologyTabUIModel model = getModel(); model.setModify(true); - model.setValid(row.isValid()); + recomputeRowValidState(row); } /** Resets the table with the data from the database */ @@ -349,16 +344,13 @@ Map<Type, Caracteristic> caracteristics = availableGlobalCaracteristics.get(row.getKey()); for (Type type : caracteristics.keySet()) { Caracteristic caracteristic = caracteristics.get(type); - fishingOperation.getHydrologyCaracteristics().remove(caracteristic); + + CaracteristicMap caracteristicMap = fishingOperation.getHydrologyCaracteristics(); + if (caracteristicMap != null) { + caracteristicMap.remove(caracteristic); + } } - if (TuttiEntities.isNew(fishingOperation)) { - - fishingOperation = persistenceService.createFishingOperation(fishingOperation); - } else { - persistenceService.saveFishingOperation(fishingOperation); - } - //add the row in the combo BeanComboBox keyCombo = ui.getNewRowKey(); keyCombo.addItem(row.getKey()); @@ -370,6 +362,7 @@ // refresh all the table getTableModel().fireTableRowsDeleted(rowIndex, rowIndex); + getModel().removeRowInError(row); } //------------------------------------------------------------------------// @@ -377,37 +370,31 @@ //------------------------------------------------------------------------// protected void saveRow(HydrologyRowModel row) { + if (row.isValid()) { + FishingOperation fishingOperation = getModel().getFishingOperation(); + Preconditions.checkNotNull(fishingOperation); - FishingOperation fishingOperation = getModel().getFishingOperation(); - Preconditions.checkNotNull(fishingOperation); - - if (fishingOperation.getHydrologyCaracteristics() == null) { - fishingOperation.setHydrologyCaracteristics(new CaracteristicMap()); - } - Map<Type, Caracteristic> caracteristics = availableGlobalCaracteristics.get(row.getKey()); - CaracteristicMap map = new CaracteristicMap(); - for (Type type : caracteristics.keySet()) { - Serializable value = null; - switch (type) { - case START: - value = row.getGearShootingStartValue(); - break; - case END: - value = row.getGearShootingEndValue(); - break; - case AVERAGE: - value = row.getAverageValue(); + if (fishingOperation.getHydrologyCaracteristics() == null) { + fishingOperation.setHydrologyCaracteristics(new CaracteristicMap()); } - map.put(caracteristics.get(type), value); + Map<Type, Caracteristic> caracteristics = availableGlobalCaracteristics.get(row.getKey()); + CaracteristicMap map = new CaracteristicMap(); + for (Type type : caracteristics.keySet()) { + Serializable value = null; + switch (type) { + case START: + value = row.getGearShootingStartValue(); + break; + case END: + value = row.getGearShootingEndValue(); + break; + case AVERAGE: + value = row.getAverageValue(); + } + map.put(caracteristics.get(type), value); + } + fishingOperation.getHydrologyCaracteristics().putAll(map); } - fishingOperation.getHydrologyCaracteristics().putAll(map); - - if (TuttiEntities.isNew(fishingOperation)) { - - fishingOperation = persistenceService.createFishingOperation(fishingOperation); - } else { - persistenceService.saveFishingOperation(fishingOperation); - } } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIModel.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIModel.java 2013-01-17 17:08:09 UTC (rev 218) @@ -30,10 +30,14 @@ import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUIModel; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderModelBuilder; import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** @@ -43,6 +47,8 @@ public class HydrologyTabUIModel extends AbstractTuttiTableUIModel<FishingOperation, HydrologyRowModel, HydrologyTabUIModel> { private static final long serialVersionUID = 1L; + + private static final Log log = LogFactory.getLog(HydrologyTabUIModel.class); public static final String TITLE = "tutti.label.tab.fishingOperation.hydrology"; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiTabContainerUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiTabContainerUIHandler.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/AbstractTuttiTabContainerUIHandler.java 2013-01-17 17:08:09 UTC (rev 218) @@ -32,6 +32,8 @@ import java.awt.Component; import javax.swing.DefaultSingleSelectionModel; import javax.swing.JTabbedPane; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * UI containing a tab panel. @@ -42,6 +44,8 @@ */ public abstract class AbstractTuttiTabContainerUIHandler<M> extends AbstractTuttiUIHandler<M> { + private final static Log log = LogFactory.getLog(AbstractTuttiTabContainerUIHandler.class); + protected AbstractTuttiTabContainerUIHandler(TuttiUIContext context) { super(context); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java 2013-01-17 17:08:09 UTC (rev 218) @@ -25,8 +25,14 @@ * #L% */ +import java.awt.Component; +import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.HierarchyBoundsAdapter; +import java.awt.event.HierarchyEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; @@ -46,7 +52,10 @@ import jaxx.runtime.validator.swing.SwingValidatorUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTitledPanel; +import static org.nuiton.i18n.I18n._; + /** * Button which opens a popup containing a table with the errors found * by registered validators. @@ -64,6 +73,8 @@ protected JTable errorTable = new JTable(); + protected Point popupPosition = null; + public SwingValidatorMessageWidget() { super(SwingUtil.createActionIcon("table-error")); @@ -80,9 +91,20 @@ JScrollPane scrollPanel = new JScrollPane(errorTable); scrollPanel.setColumnHeaderView(errorTable.getTableHeader()); - popup.add(scrollPanel); + + JXTitledPanel titledPanel = new JXTitledPanel(_("tutti.errorTable.title"), scrollPanel); + popup.add(titledPanel); + popup.setTitle(_("tutti.errorTable.title")); popup.setSize(800, 300); + popup.setAlwaysOnTop(true); + popup.setUndecorated(true); + ComponentResizer cr = new ComponentResizer(); + cr.registerComponent(popup); + ComponentMover cm = new ComponentMover(); + cm.setDragInsets(cr.getDragInsets()); + cm.registerComponent(popup); + addActionListener(new ActionListener() { @Override @@ -94,15 +116,40 @@ } } }); + popup.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { setSelected(false); } - + }); + popup.addComponentListener(new ComponentAdapter() { + + @Override + public void componentMoved(ComponentEvent e) { + Component component = e.getComponent(); + if (component.isShowing()) { + popupPosition = component.getLocationOnScreen(); + } + } + + }); + + addHierarchyBoundsListener(new HierarchyBoundsAdapter() { + + @Override + public void ancestorMoved(HierarchyEvent e) { + if (popupPosition == null && isShowing()) { + Point point = new Point(getLocationOnScreen()); + point.translate(-popup.getWidth() + getWidth(), -popup.getHeight()); + popup.setLocation(point); + } + } + }); + // add a auto-close action JRootPane rootPane = popup.getRootPane(); @@ -119,6 +166,7 @@ setSelected(false); } }); + } /** Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableModel.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableModel.java 2013-01-17 17:08:09 UTC (rev 218) @@ -227,6 +227,7 @@ @Override public final void setValueAt(Object aValue, int rowIndex, int columnIndex) { + log.info("setValueAt " + aValue); R entry = getEntry(rowIndex); ColumnIdentifier<R> propertyName = getPropertyName(columnIndex); setValueAt(aValue, rowIndex, columnIndex, propertyName, entry); @@ -252,6 +253,7 @@ int columnIndex, ColumnIdentifier<R> propertyName, R entry) { + log.info("setValueAt " + aValue); propertyName.setValue(entry, aValue); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java 2013-01-17 17:08:09 UTC (rev 218) @@ -619,7 +619,12 @@ // apply it to row row.setValid(valid); - getModel().setValid(valid); + + if (valid) { + getModel().removeRowInError(row); + } else { + getModel().addRowInError(row); + } } //------------------------------------------------------------------------// Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIModel.java 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIModel.java 2013-01-17 17:08:09 UTC (rev 218) @@ -25,10 +25,18 @@ */ import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; +import fr.ifremer.tutti.ui.swing.content.operation.fishing.environment.EnvironmentRowModel; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.HashSet; import org.nuiton.util.beans.Binder; import java.util.List; +import java.util.Set; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * @param <E> type of incoming bean to edit @@ -41,14 +49,30 @@ private static final long serialVersionUID = 1L; + private static final Log log = LogFactory.getLog(AbstractTuttiTableUIModel.class); + public static final String PROPERTY_ROWS = "rows"; + + public static final String PROPERTY_ROWS_IN_ERROR = "rowsInError"; protected List<R> rows; + + protected Set<R> rowsInError; protected AbstractTuttiTableUIModel(Class<E> entityType, Binder<E, B> fromBeanBinder, Binder<B, E> toBeanBinder) { super(entityType, fromBeanBinder, toBeanBinder); + addPropertyChangeListener(PROPERTY_ROWS_IN_ERROR, new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + Set<EnvironmentRowModel> rowsInErorr = (Set<EnvironmentRowModel>) evt.getNewValue(); + log.info(PROPERTY_ROWS_IN_ERROR + " changed " + rowsInErorr); + setValid(rowsInErorr == null || rowsInErorr.isEmpty()); + } + }); + setRowsInError(new HashSet<R>()); } public List<R> getRows() { @@ -63,9 +87,36 @@ // always propagates (since empty list will not fire and we want it) firePropertyChange(PROPERTY_ROWS, null, rows); + + Set<R> rowsInError = Sets.newHashSet(); + for (R row : rows) { + if (!row.isValid()) { + rowsInError.add(row); + } + } + setRowsInError(rowsInError); } public int getRowCount() { return rows == null ? 0 : rows.size(); } + + public Set<R> getRowsInError() { + return rowsInError; + } + + public void setRowsInError(Set<R> rowsInError) { + this.rowsInError = rowsInError; + firePropertyChange(PROPERTY_ROWS_IN_ERROR, null, rowsInError); + } + + public void addRowInError(R row) { + rowsInError.add(row); + firePropertyChange(PROPERTY_ROWS_IN_ERROR, null, rowsInError); + } + + public void removeRowInError(R row) { + rowsInError.remove(row); + firePropertyChange(PROPERTY_ROWS_IN_ERROR, null, rowsInError); + } } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties =================================================================== --- trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-17 16:50:14 UTC (rev 217) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2013-01-17 17:08:09 UTC (rev 218) @@ -58,6 +58,7 @@ tutti.config.ui.shortcut.closePopup=Fermer une popup tutti.config.ui.showNumberEditorButton=Afficher le pavé numérique de saisie tutti.duration.format=dj Hh m'm' +tutti.errorTable.title=Table d'erreurs tutti.label.attachmentEditor.file=Fichier tutti.label.attachmentEditor.fileComment=Commentaire tutti.label.attachmentEditor.fileName=Nom
participants (1)
-
kmorin@users.forge.codelutin.com