Author: kmorin Date: 2013-01-10 14:15:31 +0100 (Thu, 10 Jan 2013) New Revision: 164 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/164 Log: refs #1908 [CONSOLIDATION] Mise en place des deux contextes de validation (pour les captures) Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.jaxx 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/operation/EditFishingOperationUI.jaxx 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/FishingOperationsUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.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/gearshooting/GearShootingTabUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIModel.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/CustomTab.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/CaracteristicValueEditor.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-01-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/AbstractTuttiUIHandler.java 2013-01-10 13:15:31 UTC (rev 164) @@ -34,31 +34,6 @@ import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.UIMessageNotifier; import fr.ifremer.tutti.ui.swing.util.editor.SimpleTimeEditor; -import jaxx.runtime.JAXXUtil; -import jaxx.runtime.SwingUtil; -import jaxx.runtime.swing.editor.NumberEditor; -import jaxx.runtime.swing.editor.bean.BeanComboBox; -import jaxx.runtime.swing.editor.bean.BeanDoubleList; -import jaxx.runtime.swing.renderer.DecoratorListCellRenderer; -import jaxx.runtime.validator.swing.SwingValidator; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.jdesktop.swingx.JXDatePicker; -import org.nuiton.util.decorator.Decorator; -import org.nuiton.util.decorator.JXPathDecorator; -import org.nuiton.validator.bean.simple.SimpleBeanValidator; - -import javax.swing.AbstractAction; -import javax.swing.JComponent; -import javax.swing.JDialog; -import javax.swing.JList; -import javax.swing.JRootPane; -import javax.swing.KeyStroke; -import javax.swing.ListCellRenderer; -import javax.swing.ListSelectionModel; -import javax.swing.event.ListSelectionEvent; -import javax.swing.text.JTextComponent; import java.awt.Component; import java.awt.Dimension; import java.awt.Frame; @@ -74,6 +49,30 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.swing.AbstractAction; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JList; +import javax.swing.JRootPane; +import javax.swing.KeyStroke; +import javax.swing.ListCellRenderer; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListSelectionEvent; +import javax.swing.text.JTextComponent; +import jaxx.runtime.JAXXUtil; +import jaxx.runtime.SwingUtil; +import jaxx.runtime.swing.editor.NumberEditor; +import jaxx.runtime.swing.editor.bean.BeanComboBox; +import jaxx.runtime.swing.editor.bean.BeanDoubleList; +import jaxx.runtime.swing.renderer.DecoratorListCellRenderer; +import jaxx.runtime.validator.swing.SwingValidator; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXDatePicker; +import org.nuiton.util.decorator.Decorator; +import org.nuiton.util.decorator.JXPathDecorator; +import org.nuiton.validator.bean.simple.SimpleBeanValidator; /** * Contract of any UI handler. Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.css 2013-01-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.css 2013-01-10 13:15:31 UTC (rev 164) @@ -131,3 +131,13 @@ actionIcon: about; mnemonic: A; } + +#bottomBar { + floatable: false; + margin: {new java.awt.Insets(0, 0, 0, 5)}; + borderPainted: false; +} + +#validatorMessageWidget { + focusPainted: false; +} \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.jaxx 2013-01-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUI.jaxx 2013-01-10 13:15:31 UTC (rev 164) @@ -29,6 +29,8 @@ java.awt.BorderLayout javax.swing.JFrame org.jdesktop.swingx.JXTitledPanel + jaxx.runtime.validator.swing.SwingValidator + fr.ifremer.tutti.ui.swing.util.SwingValidatorMessageWidget </import> <TuttiUIContext id='model' @@ -48,6 +50,14 @@ protected void $afterCompleteSetup() { getHandler().afterInitUI(); } + + public void registerValidator(SwingValidator validator) { + handler.registerValidator(validator); + } + + public void clearValidators() { + handler.clearValidators(); + } ]]></script> @@ -90,6 +100,10 @@ </JMenu> </JMenuBar> + <JToolBar id='bottomBar'> + <SwingValidatorMessageWidget id='validatorMessageWidget'/> + </JToolBar> + <JXTitledPanel id='body' constraints='BorderLayout.CENTER' decorator='boxed'/> <!-- status message bar --> 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-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUIHandler.java 2013-01-10 13:15:31 UTC (rev 164) @@ -45,10 +45,14 @@ import javax.swing.JComponent; import java.awt.Desktop; +import java.awt.Insets; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.net.URL; import java.util.Calendar; +import javax.swing.JToolBar; +import jaxx.runtime.validator.swing.SwingValidator; +import jaxx.runtime.validator.swing.SwingValidatorMessageWidget; import static org.nuiton.i18n.I18n._; @@ -94,6 +98,7 @@ } } }); + ui.setContextValue(ui, MainUI.class.getName()); } @Override @@ -110,6 +115,9 @@ //SwingUtil.getLayer(ui.getBody()).setUI(new BetaLayerUI()); changeTitle(); + + JToolBar bar = ui.getBottomBar(); + ui.getStatus().addWidget(bar, 0); TuttiScreen screen; @@ -271,6 +279,14 @@ ui.getStatus().setStatus(message); } + public void registerValidator(SwingValidator validator) { + ui.getValidatorMessageWidget().registerValidator(validator); + } + + public void clearValidators() { + ui.getValidatorMessageWidget().clearValidators(); + } + //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// @@ -357,7 +373,7 @@ // validate catches screenTitle = _("tutti.title.validate.operations", getSelectedCruiseTitle()); } - screenUI = new FishingOperationsUI(context); + screenUI = new FishingOperationsUI(ui); break; } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx 2013-01-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUI.jaxx 2013-01-10 13:15:31 UTC (rev 164) @@ -59,6 +59,7 @@ <script><![CDATA[ public EditFishingOperationUI(FishingOperationsUI parentUI) { + JAXXUtil.initContext(this, parentUI); EditFishingOperationUIHandler handler = new EditFishingOperationUIHandler(parentUI, this); setContextValue(handler); handler.beforeInitUI(); @@ -361,7 +362,7 @@ <!-- Commentaire --> <row weighty='0.3'> - <cell columns='6'> + <cell columns='6' fill='both'> <JScrollPane id='commentPane' onFocusGained='commentField.requestFocus()'> <JTextArea id='commentField' @@ -372,21 +373,18 @@ </Table> </tab> - <tab id='traitGearShootingTab' - title='tutti.label.tab.fishingOperation.gearShooting'> + <tab id='traitGearShootingTab'> <GearShootingTabUI id='gearShootingTabContent' constructorParams='this'/> </tab> - <tab id='environmentTab' - title='tutti.label.tab.fishingOperation.environment'> + <tab id='environmentTab'> <EnvironmentTabUI id='environmentTabContent' constructorParams='this'/> </tab> - <tab id='traitHydrologyTabContent' - title='tutti.label.tab.fishingOperation.hydrology'> + <tab id='traitHydrologyTabContent'> <HydrologyTabUI id='hydrologyTabContent' constructorParams='this'/> 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-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIHandler.java 2013-01-10 13:15:31 UTC (rev 164) @@ -31,7 +31,9 @@ import fr.ifremer.tutti.persistence.entities.referential.Person; import fr.ifremer.tutti.persistence.entities.referential.Zone; import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; import fr.ifremer.tutti.ui.swing.AbstractTuttiUIHandler; +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; @@ -56,6 +58,7 @@ import java.beans.VetoableChangeListener; import java.util.List; import javax.swing.DefaultSingleSelectionModel; +import javax.swing.JFrame; import javax.swing.JTabbedPane; import javax.swing.SingleSelectionModel; import javax.swing.event.ChangeEvent; @@ -179,7 +182,7 @@ @Override public void afterInitUI() { - + ui.getFishingOperationValidPanel().remove( ui.getFishingOperationResetRadio()); @@ -239,7 +242,7 @@ changeValidatorContext(model.getValidationContext(), ui.getValidator()); listenValidatorValid(ui.getValidator(), model); - JTabbedPane tabPanel = ui.getFishingOperationTabPane(); + final JTabbedPane tabPanel = ui.getFishingOperationTabPane(); tabPanel.setTabComponentAt(0, new CustomTab(model)); listModelIsModify(model); @@ -247,44 +250,60 @@ GearShootingTabUIModel gearShootingModel = ui.getGearShootingTabContent().getModel(); gearShootingModel.setAvailableCaracteristics(persistenceService.getAllFishingOperationGearCaracteristic()); -// tabPanel.setTabComponentAt(1, new CustomTab(gearShootingModel)); + tabPanel.setTabComponentAt(1, new CustomTab(gearShootingModel)); //init environment EnvironmentTabUIModel environmentModel = ui.getEnvironmentTabContent().getModel(); environmentModel.setAvailableCaracteristics(persistenceService.getAllFishingOperationEnvironmentCaracteristic()); -// tabPanel.setTabComponentAt(2, new CustomTab(environmentModel)); + tabPanel.setTabComponentAt(2, new CustomTab(environmentModel)); //init hydrology HydrologyTabUIModel hydrologyModel = ui.getHydrologyTabContent().getModel(); hydrologyModel.setAvailableCaracteristics(persistenceService.getAllFishingOperationHydrologicCaracteristic()); -// tabPanel.setTabComponentAt(3, new CustomTab(hydrologyModel)); + tabPanel.setTabComponentAt(3, new CustomTab(hydrologyModel)); tabPanel.setModel(new DefaultSingleSelectionModel() { @Override public void setSelectedIndex(int index) { - EditFishingOperationUIModel model = getModel(); - - if (TuttiUIContext.VALIDATION_CONTEXT_EDIT.equals(model.getValidationContext()) - || model.isEmpty() || model.isValid()) { - if (model.isModify()) { - save(); + int currentIndex = tabPanel.getSelectedIndex(); + if (currentIndex < 0) { + super.setSelectedIndex(index); + + } else { + CustomTab currentTab = (CustomTab) tabPanel.getTabComponentAt(currentIndex); + AbstractTuttiBeanUIModel model = currentTab.getModel(); + + if (TuttiUIContext.VALIDATION_CONTEXT_EDIT.equals(getModel().getValidationContext()) + || model.isValid()) { + if (!model.isCreate() && model.isModify()) { + save(); + } + super.setSelectedIndex(index); } - super.setSelectedIndex(index); } } }); + + MainUI main = ui.getContextValue(MainUI.class, MainUI.class.getName()); + main.clearValidators(); + main.registerValidator(ui.getValidator()); + } - + + @Override public void onCloseUI() { if (log.isInfoEnabled()) { log.info("closing: " + ui); } - + + MainUI main = ui.getContextValue(MainUI.class, MainUI.class.getName()); + main.clearValidators(); + closeUI(ui.getGearShootingTabContent()); closeUI(ui.getEnvironmentTabContent()); closeUI(ui.getHydrologyTabContent()); @@ -310,7 +329,6 @@ EditFishingOperationUIModel model = getModel(); if (empty) { - bean = new FishingOperation(); } @@ -423,8 +441,8 @@ getModel().setModify(false); // persist current fishingOperation - persistenceService.saveFishingOperation(toSave); - //parentUi.getHandler().saveFishingOperation(toSave); +// persistenceService.saveFishingOperation(toSave); + parentUi.getHandler().saveFishingOperation(toSave); } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUI.jaxx 2013-01-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUI.jaxx 2013-01-10 13:15:31 UTC (rev 164) @@ -27,6 +27,7 @@ <import> fr.ifremer.tutti.persistence.entities.data.FishingOperation + fr.ifremer.tutti.ui.swing.TuttiUI fr.ifremer.tutti.ui.swing.TuttiUIContext fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUI @@ -36,8 +37,9 @@ </import> <script><![CDATA[ -public FishingOperationsUI(TuttiUIContext context) { - FishingOperationsUIHandler handler = new FishingOperationsUIHandler(context, this); +public FishingOperationsUI(TuttiUI parentUI) { + JAXXUtil.initContext(this, parentUI); + FishingOperationsUIHandler handler = new FishingOperationsUIHandler(parentUI, this); setContextValue(handler); handler.beforeInitUI(); } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java 2013-01-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/FishingOperationsUIHandler.java 2013-01-10 13:15:31 UTC (rev 164) @@ -30,7 +30,8 @@ import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.AbstractTuttiUIHandler; -import fr.ifremer.tutti.ui.swing.TuttiUIContext; +import fr.ifremer.tutti.ui.swing.MainUI; +import fr.ifremer.tutti.ui.swing.TuttiUI; import fr.ifremer.tutti.ui.swing.content.operation.catches.EditCatchesUIModel; import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.logging.Log; @@ -60,9 +61,9 @@ private final PersistenceService persistenceService; - public FishingOperationsUIHandler(TuttiUIContext context, + public FishingOperationsUIHandler(TuttiUI parentUI, FishingOperationsUI ui) { - super(context); + super(parentUI.getHandler().getContext()); this.ui = ui; persistenceService = context.getService(PersistenceService.class); } @@ -156,6 +157,9 @@ // when quitting ui, let's de-select fishingOperation (will save any changes) selectFishingOperation(null); + + closeUI(ui.getFishingOperationTabContent()); + closeUI(ui.getCatchesTabContent()); } @Override 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-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIHandler.java 2013-01-10 13:15:31 UTC (rev 164) @@ -35,7 +35,6 @@ import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueEditor; import fr.ifremer.tutti.ui.swing.util.editor.CaracteristicValueRenderer; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; -import fr.ifremer.tutti.ui.swing.util.table.CaracteristicRow; import java.util.Collection; import java.util.List; import jaxx.runtime.swing.editor.bean.BeanComboBox; @@ -94,6 +93,7 @@ Object oldValue, Object newValue) { recomputeRowValidState(row); + super.onRowModified(rowIndex, row, propertyName, oldValue, newValue); } @Override @@ -117,6 +117,7 @@ // clear modified flag on the monitor rowMonitor.clearModified(); + getModel().setModify(false); } } } @@ -209,6 +210,10 @@ keyCombo.removeItem(selectedItem); selectFirstInCombo(keyCombo); + + EnvironmentTabUIModel model = getModel(); + model.setModify(true); + model.setValid(row.isValid()); } /** Resets the table with the data from the database */ @@ -244,6 +249,7 @@ ui.getNewRowKey().setData(caracteristicList); selectFirstInCombo(ui.getNewRowKey()); + model.setModify(false); } public void removeCaracteristic() { 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-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/environment/EnvironmentTabUIModel.java 2013-01-10 13:15:31 UTC (rev 164) @@ -43,6 +43,8 @@ private static final long serialVersionUID = 1L; + public static final String TITLE = "tutti.label.tab.fishingOperation.environment"; + public static final String PROPERTY_REMOVE_CARACTERISTIC_ENABLED = "removeCaracteristicEnabled"; protected List<Caracteristic> availableCaracteristics; @@ -70,6 +72,11 @@ public EnvironmentTabUIModel() { super(FishingOperation.class, fromBeanBinder, toBeanBinder); } + + @Override + public String getTitle() { + return TITLE; + } public List<Caracteristic> getAvailableCaracteristics() { return availableCaracteristics; 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-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIHandler.java 2013-01-10 13:15:31 UTC (rev 164) @@ -29,18 +29,12 @@ import fr.ifremer.tutti.persistence.entities.CaracteristicMap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; -import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; -import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.SpeciesBatchRowModel; -import fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency.SpeciesFrequencyRowModel; -import fr.ifremer.tutti.ui.swing.content.operation.fishing.environment.EnvironmentRowModel; 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; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; -import fr.ifremer.tutti.ui.swing.util.table.CaracteristicRow; import jaxx.runtime.swing.editor.bean.BeanComboBox; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -48,7 +42,6 @@ import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import java.util.Collection; -import java.util.Collections; import java.util.List; /** @@ -101,6 +94,7 @@ Object oldValue, Object newValue) { recomputeRowValidState(row); + super.onRowModified(rowIndex, row, propertyName, oldValue, newValue); } @Override @@ -125,6 +119,7 @@ // clear modified flag on the monitor rowMonitor.clearModified(); + getModel().setModify(false); } } } @@ -219,6 +214,10 @@ keyCombo.removeItem(selectedItem); selectFirstInCombo(keyCombo); + + GearShootingTabUIModel model = getModel(); + model.setModify(true); + model.setValid(row.isValid()); } /** Resets the table with the data from the database */ @@ -253,6 +252,7 @@ ui.getNewRowKey().setData(caracteristicList); selectFirstInCombo(ui.getNewRowKey()); + model.setModify(false); } public void removeCaracteristic() { Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIModel.java 2013-01-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/gearshooting/GearShootingTabUIModel.java 2013-01-10 13:15:31 UTC (rev 164) @@ -49,6 +49,8 @@ private static final Log log = LogFactory.getLog(GearShootingTabUIModel.class); + public static final String TITLE = "tutti.label.tab.fishingOperation.gearShooting"; + public static final String PROPERTY_REMOVE_CARACTERISTIC_ENABLED = "removeCaracteristicEnabled"; protected List<Caracteristic> availableCaracteristics; @@ -77,6 +79,11 @@ super(FishingOperation.class, fromBeanBinder, toBeanBinder); } + @Override + public String getTitle() { + return TITLE; + } + public List<Caracteristic> getAvailableCaracteristics() { return availableCaracteristics; } 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-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIHandler.java 2013-01-10 13:15:31 UTC (rev 164) @@ -32,15 +32,12 @@ import fr.ifremer.tutti.persistence.entities.data.FishingOperation; import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; import fr.ifremer.tutti.ui.swing.content.operation.EditFishingOperationUI; -import fr.ifremer.tutti.ui.swing.content.operation.fishing.environment.EnvironmentRowModel; -import fr.ifremer.tutti.ui.swing.content.operation.fishing.gearshooting.GearShootingRowModel; import fr.ifremer.tutti.ui.swing.util.HydrologicCaracteristicUtil; import fr.ifremer.tutti.ui.swing.util.HydrologicCaracteristicUtil.Type; 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; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; -import fr.ifremer.tutti.ui.swing.util.table.CaracteristicRow; import jaxx.runtime.swing.editor.bean.BeanComboBox; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -113,6 +110,7 @@ Object oldValue, Object newValue) { recomputeRowValidState(row); + super.onRowModified(rowIndex, row, propertyName, oldValue, newValue); } @Override @@ -137,6 +135,7 @@ // clear modified flag on the monitor rowMonitor.clearModified(); + getModel().setModify(false); } } } @@ -267,6 +266,10 @@ keyCombo.removeItem(selectedItem); selectFirstInCombo(keyCombo); + + HydrologyTabUIModel model = getModel(); + model.setModify(true); + model.setValid(row.isValid()); } /** Resets the table with the data from the database */ @@ -311,6 +314,7 @@ ui.getNewRowKey().setData(caracteristicList); selectFirstInCombo(ui.getNewRowKey()); + model.setModify(false); } public void removeCaracteristic() { 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-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/fishing/hydrology/HydrologyTabUIModel.java 2013-01-10 13:15:31 UTC (rev 164) @@ -44,6 +44,8 @@ private static final long serialVersionUID = 1L; + public static final String TITLE = "tutti.label.tab.fishingOperation.hydrology"; + public static final String PROPERTY_REMOVE_CARACTERISTIC_ENABLED = "removeCaracteristicEnabled"; public static final String PROPERTY_AVAILABLE_CARACTERISTICS = "availableCaracteristics"; @@ -73,6 +75,11 @@ public HydrologyTabUIModel() { super(FishingOperation.class, fromBeanBinder, toBeanBinder); } + + @Override + public String getTitle() { + return TITLE; + } public List<Caracteristic> getAvailableCaracteristics() { return availableCaracteristics; Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/CustomTab.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/CustomTab.java 2013-01-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/CustomTab.java 2013-01-10 13:15:31 UTC (rev 164) @@ -59,12 +59,10 @@ this.model.addPropertyChangeListener(AbstractTuttiBeanUIModel.PROPERTY_MODIFY, new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { - log.info(">>>>>>>> model modified ? evt " + evt.getNewValue()); - log.info(">>>>>>>> model modified ? model " + CustomTab.this.model.isModify()); Boolean modified = (Boolean) evt.getNewValue(); String title = _(CustomTab.this.model.getTitle()); if (modified) { - title += "*"; + title = "<html><strong>" + title + "*</strong></html>"; } CustomTab.this.title.setText(title); } Added: 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 (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SwingValidatorMessageWidget.java 2013-01-10 13:15:31 UTC (rev 164) @@ -0,0 +1,109 @@ + +package fr.ifremer.tutti.ui.swing.util; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import javax.swing.AbstractAction; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JRootPane; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JToggleButton; +import javax.swing.KeyStroke; +import javax.swing.ListSelectionModel; +import jaxx.runtime.SwingUtil; +import jaxx.runtime.validator.swing.SwingValidator; +import jaxx.runtime.validator.swing.SwingValidatorMessageTableModel; +import jaxx.runtime.validator.swing.SwingValidatorMessageTableRenderer; +import jaxx.runtime.validator.swing.SwingValidatorUtil; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Button which opens a popup containing a table with the errors found + * by registered validators. + * + * @author kmorin <kmorin@codelutin.com> + * @since 2.5.10 + */ +public class SwingValidatorMessageWidget extends JToggleButton { + + private static final Log log = LogFactory.getLog(SwingValidatorMessageWidget.class); + + protected SwingValidatorMessageTableModel errorTableModel = new SwingValidatorMessageTableModel(); + + protected JDialog popup = new JDialog(); + + protected JTable errorTable = new JTable(); + + public SwingValidatorMessageWidget() { + super(SwingUtil.createActionIcon("table-error")); + + errorTable.setModel(errorTableModel); + errorTable.setRowSelectionAllowed(true); + errorTable.setAutoCreateRowSorter(true); + errorTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); + errorTable.setCellSelectionEnabled(false); + errorTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + errorTable.setFillsViewportHeight(true); + + SwingValidatorUtil.installUI(errorTable, + new SwingValidatorMessageTableRenderer()); + + JScrollPane scrollPanel = new JScrollPane(errorTable); + scrollPanel.setColumnHeaderView(errorTable.getTableHeader()); + popup.add(scrollPanel); + popup.setSize(800, 300); + + addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + if(isSelected()) { + popup.setVisible(true); + } else { + popup.dispose(); + } + } + }); + popup.addWindowListener(new WindowAdapter() { + + @Override + public void windowClosing(WindowEvent e) { + setSelected(false); + } + + }); + + // add a auto-close action + JRootPane rootPane = popup.getRootPane(); + + KeyStroke shortcutClosePopup = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); + + rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( + shortcutClosePopup, "close"); + rootPane.getActionMap().put("close", new AbstractAction() { + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + popup.dispose(); + setSelected(false); + } + }); + } + + public void registerValidator(SwingValidator validator) { + errorTableModel.registerValidator(validator); + } + + public void clearValidators() { + errorTableModel.clearValidators(); + errorTableModel.clear(); + } + +} Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/CaracteristicValueEditor.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/CaracteristicValueEditor.java 2013-01-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/editor/CaracteristicValueEditor.java 2013-01-10 13:15:31 UTC (rev 164) @@ -46,6 +46,8 @@ import java.awt.Color; import java.awt.Component; import java.util.List; +import javax.swing.event.CellEditorListener; +import javax.swing.event.ChangeEvent; /** * Editor for the values of the caracteristics of the fishing operations. 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-10 09:10:19 UTC (rev 163) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java 2013-01-10 13:15:31 UTC (rev 164) @@ -121,11 +121,13 @@ * @param newValue new value of the modified property * @since 0.3 */ - protected abstract void onRowModified(int rowIndex, + protected void onRowModified(int rowIndex, R row, String propertyName, Object oldValue, - Object newValue); + Object newValue) { + getModel().setModify(true); + } /** * Given the row monitor and his monitored row, try to save it if required. @@ -617,6 +619,7 @@ // apply it to row row.setValid(valid); + getModel().setValid(valid); } //------------------------------------------------------------------------//