r33 - in trunk/tutti-ui-swing/src/main: java/fr/ifremer/tutti/ui/swing java/fr/ifremer/tutti/ui/swing/content/catches/species java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency java/fr/ifremer/tutti/ui/swing/util/table resources/i18n resources/icons
Author: tchemit Date: 2012-12-07 15:48:14 +0100 (Fri, 07 Dec 2012) New Revision: 33 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/33 Log: saisie des mensurations + am?\195?\169lioration api table Added: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/ColumnIdentifier.java trunk/tutti-ui-swing/src/main/resources/icons/action-close.png Removed: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractColumnIdentifier.java 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/catches/species/FrequencyCellComponent.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesBatchColumnIdentifier.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesBatchRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesBatchTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesTabUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyColumnIdentifier.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyRowModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyTableModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUI.css trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUI.jaxx trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUIHandler.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUIModel.java trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractSelectTableAction.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 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/MainUIHandler.java 2012-12-07 14:48:14 UTC (rev 33) @@ -322,8 +322,8 @@ String surveyId = context.getSurveyId(); String campaignId = context.getCampaignId(); - JComponent screenUI = null; - String screenTitle = null; + JComponent screenUI; + String screenTitle; switch (screen) { default: Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/FrequencyCellComponent.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/FrequencyCellComponent.java 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/FrequencyCellComponent.java 2012-12-07 14:48:14 UTC (rev 33) @@ -25,8 +25,9 @@ */ import com.google.common.base.Preconditions; +import fr.ifremer.tutti.ui.swing.content.catches.species.frequency.SpeciesFrequencyUI; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; -import fr.ifremer.tutti.ui.swing.content.catches.species.frequency.SpeciesFrequencyUI; +import fr.ifremer.tutti.ui.swing.util.table.AbstractSelectTableAction; import jaxx.runtime.SwingUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -87,6 +88,8 @@ protected Frame frame; + protected JTable table; + protected SpeciesBatchTableModel tableModel; protected SpeciesBatchColumnIdentifier columnIdentifier; @@ -95,6 +98,8 @@ protected Integer rowIndex; + protected Integer columnIndex; + public FrequencyCellEditor(SpeciesFrequencyUI ui) { this.ui = ui; component = new FrequencyCellComponent(); @@ -125,8 +130,7 @@ // open frequency dialog - Preconditions.checkNotNull(editRow, - "No editRow found."); + Preconditions.checkNotNull(editRow, "No editRow found."); if (log.isInfoEnabled()) { log.info("Will edit frequencies for row: " + rowIndex); @@ -138,8 +142,21 @@ ui.editBatch(editRow); + // open frequency dialog TuttiUIUtil.openInDialog(ui, frame, _("tutti.title.frequency"), true, null); + // at close, synch back frequencies + + editRow.updateTotalFromFrequencies(); + + int r = rowIndex; + int c = columnIndex; + + // stop edition + stopCellEditing(); + + // reselect this cell + AbstractSelectTableAction.doSelectCell(table, r, c); } @Override @@ -150,7 +167,7 @@ int column) { if (tableModel == null) { tableModel = (SpeciesBatchTableModel) table.getModel(); - + this.table = table; columnIdentifier = tableModel.getPropertyName(column); } String text; @@ -162,6 +179,7 @@ component.setText(text); rowIndex = row; + columnIndex = column; editRow = tableModel.getEntry(row); @@ -173,9 +191,6 @@ Preconditions.checkNotNull(editRow, "No editRow found in editor."); - // update from computed frequencies - editRow.updateTotalFromFrequencies(); - Object result; if (columnIdentifier == SpeciesBatchColumnIdentifier.computedNumber) { result = editRow.getComputedNumber(); @@ -195,6 +210,7 @@ if (b) { rowIndex = null; editRow = null; + columnIndex = null; } return b; } @@ -203,6 +219,7 @@ public void cancelCellEditing() { super.cancelCellEditing(); rowIndex = null; + columnIndex = null; editRow = null; } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesBatchColumnIdentifier.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesBatchColumnIdentifier.java 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesBatchColumnIdentifier.java 2012-12-07 14:48:14 UTC (rev 33) @@ -25,7 +25,7 @@ */ import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; -import fr.ifremer.tutti.ui.swing.util.table.AbstractColumnIdentifier; +import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; import static org.nuiton.i18n.I18n.n_; @@ -33,7 +33,7 @@ * @author tchemit <chemit@codelutin.com> * @since 0.2 */ -public enum SpeciesBatchColumnIdentifier implements AbstractColumnIdentifier<SpeciesBatchRowModel> { +public enum SpeciesBatchColumnIdentifier implements ColumnIdentifier<SpeciesBatchRowModel> { speciesToConfirm( n_("tutti.table.species.batch.header.toConfirm"), Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesBatchRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesBatchRowModel.java 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesBatchRowModel.java 2012-12-07 14:48:14 UTC (rev 33) @@ -192,12 +192,9 @@ List<SpeciesBatchFrequency> frequencies) { this(); fromBean(aBatch); - - for (SpeciesBatchFrequency frequencyBean : frequencies) { - SpeciesFrequencyRowModel f = new SpeciesFrequencyRowModel(); - f.fromBean(frequencyBean); - frequency.add(f); - } + List<SpeciesFrequencyRowModel> frequencyRows = + SpeciesFrequencyRowModel.fromBeans(frequencies); + frequency.addAll(frequencyRows); updateTotalFromFrequencies(); } @@ -209,7 +206,16 @@ totalWeight = 0f; for (SpeciesFrequencyRowModel frequencyModel : frequency) { totalNumber += frequencyModel.getNumber(); - totalWeight += frequencyModel.getComputedWeight(); + Float w = frequencyModel.getWeight(); + if (w == null) { + + // can't sum when a null value appears + totalWeight = null; + } else if (totalWeight != null) { + + // still can sum weights + totalWeight += w; + } } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesBatchTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesBatchTableModel.java 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesBatchTableModel.java 2012-12-07 14:48:14 UTC (rev 33) @@ -84,6 +84,17 @@ SpeciesBatchColumnIdentifier.speciesByCode, SpeciesBatchColumnIdentifier.computedNumber, SpeciesBatchColumnIdentifier.computedWeight); + } else if (propertyName == SpeciesBatchColumnIdentifier.computedNumber) { + + // update also other columns + fireTableCellUpdated(rowIndex, + SpeciesBatchColumnIdentifier.computedWeight); + + } else if (propertyName == SpeciesBatchColumnIdentifier.computedWeight) { + + // update also other columns + fireTableCellUpdated(rowIndex, + SpeciesBatchColumnIdentifier.computedNumber); } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesTabUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesTabUIHandler.java 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/SpeciesTabUIHandler.java 2012-12-07 14:48:14 UTC (rev 33) @@ -36,9 +36,11 @@ import fr.ifremer.tutti.service.DecoratorService; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.ui.swing.TuttiUI; +import fr.ifremer.tutti.ui.swing.content.catches.CatchesUI; +import fr.ifremer.tutti.ui.swing.content.catches.species.frequency.SpeciesFrequencyRowModel; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; -import fr.ifremer.tutti.ui.swing.content.catches.CatchesUI; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; +import jaxx.runtime.SwingUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; @@ -80,7 +82,8 @@ SpeciesBatchRowModel.PROPERTY_WEIGHT, SpeciesBatchRowModel.PROPERTY_SAMPLE_WEIGHT, SpeciesBatchRowModel.PROPERTY_ELEVATION_RATIO, - SpeciesBatchRowModel.PROPERTY_COMMENT); + SpeciesBatchRowModel.PROPERTY_COMMENT, + SpeciesBatchRowModel.PROPERTY_FREQUENCY); this.ui = ui; this.parentUi = parentUi; this.persistenceService = context.getService(PersistenceService.class); @@ -138,6 +141,9 @@ // save when row chaged and was modified listenRowModification(table); + + // always scroll to selected row + SwingUtil.scrollToTableSelection(getTable()); } @Override @@ -161,6 +167,22 @@ } else { persistenceService.saveSpeciesBatch(catchBean); } + + List<SpeciesFrequencyRowModel> frequencyRows = row.getFrequency(); + + List<SpeciesBatchFrequency> frequency = + SpeciesFrequencyRowModel.toBeans(frequencyRows, catchBean); + + if (log.isInfoEnabled()) { + log.info("Will save " + frequency.size() + " frequencies."); + } + frequency = persistenceService.saveSpeciesBatchFrequency( + catchBean.getId(), frequency); + + + // push it back to row model + frequencyRows = SpeciesFrequencyRowModel.fromBeans(frequency); + row.setFrequency(frequencyRows); } public void selectTrait(Trait bean) { @@ -304,8 +326,7 @@ addFloatColumnToModel(columnModel, SpeciesBatchColumnIdentifier.maturity, - TuttiUI.DECIMAL3_PATTERN - ); + TuttiUI.DECIMAL3_PATTERN); } { // Age Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyColumnIdentifier.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyColumnIdentifier.java 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyColumnIdentifier.java 2012-12-07 14:48:14 UTC (rev 33) @@ -25,7 +25,7 @@ */ import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; -import fr.ifremer.tutti.ui.swing.util.table.AbstractColumnIdentifier; +import fr.ifremer.tutti.ui.swing.util.table.ColumnIdentifier; import static org.nuiton.i18n.I18n.n_; @@ -33,7 +33,7 @@ * @author tchemit <chemit@codelutin.com> * @since 0.2 */ -public enum SpeciesFrequencyColumnIdentifier implements AbstractColumnIdentifier<SpeciesFrequencyRowModel> { +public enum SpeciesFrequencyColumnIdentifier implements ColumnIdentifier<SpeciesFrequencyRowModel> { lengthStep( n_("tutti.table.species.frequency.header.lengthStep"), Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyRowModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyRowModel.java 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyRowModel.java 2012-12-07 14:48:14 UTC (rev 33) @@ -24,11 +24,15 @@ * #L% */ +import com.google.common.collect.Lists; +import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchFrequency; import fr.ifremer.tutti.ui.swing.AbstractTuttiBeanUIModel; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; +import java.util.List; + /** * Represents a batch frequency row. * @@ -83,6 +87,27 @@ BinderFactory.newBinder(SpeciesFrequencyRowModel.class, SpeciesBatchFrequency.class); + public static List<SpeciesFrequencyRowModel> fromBeans(List<SpeciesBatchFrequency> frequency) { + List<SpeciesFrequencyRowModel> result = Lists.newArrayList(); + for (SpeciesBatchFrequency b : frequency) { + SpeciesFrequencyRowModel model = new SpeciesFrequencyRowModel(); + fromBeanBinder.copy(b, model); + result.add(model); + } + return result; + } + + public static List<SpeciesBatchFrequency> toBeans(List<SpeciesFrequencyRowModel> frequency, SpeciesBatch batch) { + List<SpeciesBatchFrequency> result = Lists.newArrayList(); + for (SpeciesFrequencyRowModel b : frequency) { + SpeciesBatchFrequency model = new SpeciesBatchFrequency(); + toBeanBinder.copy(b, model); + model.setBatch(batch); + result.add(model); + } + return result; + } + public SpeciesFrequencyRowModel() { super(SpeciesBatchFrequency.class, fromBeanBinder, toBeanBinder); } @@ -126,4 +151,10 @@ this.computedWeight = computedWeight; firePropertyChange(PROPERTY_COMPUTED_WEIGHT, oldValue, computedWeight); } + + //TODO Use validator + @Override + public boolean isValid() { + return lengthStep != null && number != null; + } } Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyTableModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyTableModel.java 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyTableModel.java 2012-12-07 14:48:14 UTC (rev 33) @@ -24,9 +24,13 @@ * #L% */ +import com.google.common.base.Preconditions; +import com.google.common.collect.Maps; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableModel; import javax.swing.table.TableColumnModel; +import java.util.List; +import java.util.Map; /** * Model of the species frequency table. @@ -38,15 +42,34 @@ private static final long serialVersionUID = 1L; - public SpeciesFrequencyTableModel(TableColumnModel columnModel) { + private final SpeciesFrequencyUIModel uiModel; + + private final Map<Float, SpeciesFrequencyRowModel> rowCache; + + public SpeciesFrequencyTableModel(TableColumnModel columnModel, SpeciesFrequencyUIModel uiModel) { super(columnModel); - + this.uiModel = uiModel; + this.rowCache = Maps.newTreeMap(); setNoneEditableCols(SpeciesFrequencyColumnIdentifier.computedWeight); } @Override protected SpeciesFrequencyRowModel createNewRow() { - return new SpeciesFrequencyRowModel(); + Float defaultStep = null; + + int rowCount = getRowCount(); + if (rowCount > 0) { + + SpeciesFrequencyRowModel rowModel = getEntry(rowCount - 1); + Float lengthStep = rowModel.getLengthStep(); + if (lengthStep != null) { + defaultStep = uiModel.getLengthStep( + lengthStep + uiModel.getStep()); + } + } + SpeciesFrequencyRowModel result = new SpeciesFrequencyRowModel(); + result.setLengthStep(defaultStep); + return result; } @Override @@ -58,4 +81,41 @@ super.setValueAt(aValue, rowIndex, columnIndex, propertyName, entry); // TODO Rebuild the computedWeight if possible... } + + public Map<Float, SpeciesFrequencyRowModel> getRowCache() { + return rowCache; + } + + @Override + protected void onRowsChanged(List<SpeciesFrequencyRowModel> data) { + + // rebuild row cache + rowCache.clear(); + + for (SpeciesFrequencyRowModel row : data) { + Float lengthStep = row.getLengthStep(); + if (lengthStep != null) { + rowCache.put(lengthStep, row); + } + } + } + + @Override + protected void onRowAdded(int rowIndex, SpeciesFrequencyRowModel newValue) { + + Preconditions.checkNotNull(newValue, "can't add a null row"); + + // add new row to cache + Float lengthStep = newValue.getLengthStep(); + + Preconditions.checkNotNull(lengthStep, + "can't add a null lengthStep row"); + + float roundLenghtValue = uiModel.getLengthStep(lengthStep); + + if (!rowCache.containsKey(roundLenghtValue)) { + + rowCache.put(roundLenghtValue, newValue); + } + } } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUI.css =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUI.css 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUI.css 2012-12-07 14:48:14 UTC (rev 33) @@ -21,24 +21,122 @@ * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ + +NumberEditor { + autoPopup: {handler.getConfig().isAutoPopupNumberEditor()}; + showPopupButton: {handler.getConfig().isShowNumberEditorButton()}; + +} + +#stepLabel { + text: "tutti.label.frequencyConfiguration.step"; + labelFor: {stepField}; +} + +#stepField { + property: "step"; + model: {model.getStep()}; + useFloat: true; + numberPattern: {DECIMAL1_PATTERN}; + bean: {model}; +} + +#minStepLabel { + text: "tutti.label.frequencyConfiguration.minStep"; + labelFor: {minStepField}; +} + +#minStepField { + property: "minStep"; + model: {model.getMinStep()}; + useFloat: true; + showReset: true; + numberPattern: {DECIMAL1_PATTERN}; + bean: {model}; +} + +#maxStepLabel { + text: "tutti.label.frequencyConfiguration.maxStep"; + labelFor: {maxStepField}; +} + +#maxStepField { + property: "maxStep"; + model: {model.getMaxStep()}; + useFloat: true; + showReset: true; + numberPattern: {DECIMAL1_PATTERN}; + bean: {model}; +} + +#rafaleStepLabel { + text: "tutti.label.frequencyConfiguration.rafaleStep"; + labelFor: {rafaleStepField}; +} + +#rafaleStepField { + modelType: {Float.class}; + useFloat: true; + showReset: true; + numberPattern: {DECIMAL1_PATTERN}; +} + +#generateButton { + actionIcon: "generate-lengthSteps"; + text: "tutti.action.generate"; + enabled: {model.isCanGenerate()}; +} + #configurationPanel { - border:{new TitledBorder(null, _("tutti.label.frequencyConfiguration"))}; + border: {new TitledBorder(null, _("tutti.legend.frequencyConfiguration"))}; } -#saveButton { - actionIcon:"save"; - text:"tutti.action.save"; - enabled:{model.isModify() && model.isValid()}; +#modeConfigurationLayout { + selected: {String.valueOf(mode.getSelectedValue())}; } +#modeConfigurationPanel { + layout: {modeConfigurationLayout}; +} + +#simpleModeButton { + text: "tutti.label.frequencyConfiguration.mode.simple"; + toolTipText: "tutti.label.frequencyConfiguration.mode.simple.tip"; + value: "simpleMode"; + selected: {model.isSimpleMode()}; + buttonGroup: "mode"; +} + +#simpleModeLabel { + text: "tutti.label.frequencyConfiguration.no.configuration"; + horizontalAlignment: {JLabel.CENTER}; + enabled: false; +} + +#autoGenModeButton { + text: "tutti.label.frequencyConfiguration.mode.autoGen"; + toolTipText: "tutti.label.frequencyConfiguration.mode.autoGen.tip"; + value: "autoGenMode"; + selected: {model.isAutoGenMode()}; + buttonGroup: "mode"; +} + +#rafaleModeButton { + text: "tutti.label.frequencyConfiguration.mode.rafale"; + toolTipText: "tutti.label.frequencyConfiguration.mode.rafale.tip"; + value: "rafaleMode"; + selected: {model.isRafaleMode()}; + buttonGroup: "mode"; +} + #closeButton { - actionIcon:"close"; - text:"tutti.action.close"; + actionIcon: "close"; + text: "tutti.action.close"; } #table { - selectionMode:{ListSelectionModel.SINGLE_SELECTION}; - selectionBackground:{null}; - selectionForeground:{Color.BLACK}; - sortable:false; + selectionMode: {ListSelectionModel.SINGLE_SELECTION}; + selectionBackground: {null}; + selectionForeground: {Color.BLACK}; + sortable: false; } \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUI.jaxx =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUI.jaxx 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUI.jaxx 2012-12-07 14:48:14 UTC (rev 33) @@ -28,18 +28,20 @@ fr.ifremer.tutti.ui.swing.TuttiUIContext fr.ifremer.tutti.ui.swing.content.catches.species.SpeciesBatchRowModel + jaxx.runtime.swing.CardLayout2Ext jaxx.runtime.swing.editor.bean.BeanComboBox + jaxx.runtime.swing.editor.NumberEditor org.jdesktop.swingx.JXTable javax.swing.ListSelectionModel + javax.swing.SwingConstants java.awt.Color java.awt.Dimension static org.nuiton.i18n.I18n._ static jaxx.runtime.SwingUtil.getStringValue - </import> <script><![CDATA[ @@ -65,16 +67,93 @@ <SpeciesFrequencyUIModel id='model' initializer='getContextValue(SpeciesFrequencyUIModel.class)'/> - <JPanel id='configurationPanel' constraints='BorderLayout.NORTH' - layout='{new BorderLayout()}'> + <CardLayout2Ext id='modeConfigurationLayout' + constructorParams='this, "modeConfigurationPanel"'/> - <JPanel id='configurationModePanel' constraints='BorderLayout.WEST'> + <JPanel id='configurationPanel' layout='{new BorderLayout()}' constraints='BorderLayout.NORTH'> + <JPanel layout='{new BorderLayout()}' constraints='BorderLayout.CENTER'> + <VBox id='modePanel' constraints='BorderLayout.WEST' + verticalAlignment='{SwingConstants.CENTER}'> + <JRadioButton id='simpleModeButton' + onActionPerformed='model.setConfigurationMode(SpeciesFrequencyUIModel.ConfigurationMode.SIMPLE)'/> + <JRadioButton id='autoGenModeButton' + onActionPerformed='model.setConfigurationMode(SpeciesFrequencyUIModel.ConfigurationMode.AUTO_GEN)'/> + <JRadioButton id='rafaleModeButton' + onActionPerformed='model.setConfigurationMode(SpeciesFrequencyUIModel.ConfigurationMode.RAFALE)'/> + </VBox> + + <JPanel id='modeConfigurationPanel' constraints='BorderLayout.CENTER'> + <JPanel id='simpleModePanel' constraints='"simpleMode"' + layout='{new BorderLayout()}'> + <JLabel id='simpleModeLabel' constraints='BorderLayout.CENTER'/> + </JPanel> + <JPanel id='autoGenModePanel' constraints='"autoGenMode"'> + <Table fill='both' constraints='BorderLayout.SOUTH'> + <!-- Min step--> + <row> + <cell anchor='west'> + <JLabel id='minStepLabel'/> + </cell> + <cell weightx='1.0'> + <NumberEditor id='minStepField' constructorParams='this'/> + </cell> + </row> + <!-- Max step--> + <row> + <cell anchor='west'> + <JLabel id='maxStepLabel'/> + </cell> + <cell weightx='1.0'> + <NumberEditor id='maxStepField' constructorParams='this'/> + </cell> + </row> + <!-- Actions --> + <row> + <cell columns='2'> + <JPanel layout='{new GridLayout(1, 0)}'> + <JButton id='generateButton' + onActionPerformed='handler.generateLengthSteps()'/> + </JPanel> + </cell> + </row> + </Table> + </JPanel> + <JPanel id='rafaleModePanel' constraints='"rafaleMode"'> + <Table fill='both' constraints='BorderLayout.SOUTH'> + <!-- Rafale step--> + <row> + <cell weightx='1.0'> + <JLabel id='rafaleStepLabel'/> + </cell> + </row> + <row> + <cell weightx='1.0'> + <NumberEditor id='rafaleStepField' constructorParams='this'/> + </cell> + </row> + </Table> + </JPanel> + </JPanel> </JPanel> + <Table fill='both' constraints='BorderLayout.SOUTH'> + <row> + <cell columns='2'> + <JSeparator/> + </cell> + </row> + <!-- Step --> + <row> + <cell anchor='west'> + <JLabel id='stepLabel'/> + </cell> + <cell weightx='1.0'> + <NumberEditor id='stepField' constructorParams='this'/> + </cell> + </row> + </Table> + </JPanel> - - - </JPanel> <JScrollPane id='tableScrollPane' constraints='BorderLayout.CENTER'> <JXTable id='table'/> </JScrollPane> @@ -82,7 +161,7 @@ <!-- actions --> <JPanel id='actionPanel' layout='{new GridLayout(1, 0)}' constraints='BorderLayout.SOUTH'> - <JButton id='close' onActionPerformed='handler.close()'/> + <JButton id='closeButton' onActionPerformed='handler.close()'/> </JPanel> </JPanel> \ No newline at end of file Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUIHandler.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUIHandler.java 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUIHandler.java 2012-12-07 14:48:14 UTC (rev 33) @@ -24,12 +24,14 @@ * #L% */ +import com.google.common.collect.Lists; import fr.ifremer.tutti.ui.swing.TuttiUI; import fr.ifremer.tutti.ui.swing.TuttiUIContext; import fr.ifremer.tutti.ui.swing.content.catches.species.SpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.util.TuttiUIUtil; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIHandler; import jaxx.runtime.SwingUtil; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; @@ -39,6 +41,11 @@ import javax.swing.JDialog; import javax.swing.table.TableColumnModel; import java.awt.Color; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.util.Collections; +import java.util.List; +import java.util.Map; /** * @author tchemit <chemit@codelutin.com> @@ -71,17 +78,6 @@ } @Override - protected void saveRow(SpeciesFrequencyRowModel row) { - - //TODO - } - - @Override - protected JXTable getTable() { - return ui.getTable(); - } - - @Override public void afterInitUI() { initUI(ui); @@ -91,9 +87,11 @@ // create table column model TableColumnModel columnModel = createTableColumnModel(table); + SpeciesFrequencyUIModel model = getModel(); + // create table model SpeciesFrequencyTableModel tableModel = - new SpeciesFrequencyTableModel(columnModel); + new SpeciesFrequencyTableModel(columnModel, model); table.setModel(tableModel); table.setColumnModel(columnModel); @@ -102,31 +100,159 @@ table.getTableHeader().setReorderingAllowed(false); - table.addHighlighter(TuttiUIUtil.newBackgroundColorHighlighter(HighlightPredicate.READ_ONLY, Color.LIGHT_GRAY)); + table.addHighlighter(TuttiUIUtil.newBackgroundColorHighlighter( + HighlightPredicate.READ_ONLY, Color.LIGHT_GRAY)); // when model datas change let's propagate it table model listenRowsFromModel(); // save when row chaged and was modified listenRowModification(table); + + //TODO Should it come from PROTOCOL or config ? + model.setStep(.5f); + + model.setMinStep(10f); + model.setMaxStep(20f); + + //TODO Configure this ? + model.setConfigurationMode(SpeciesFrequencyUIModel.ConfigurationMode.SIMPLE); + + // always scroll to selected row + SwingUtil.scrollToTableSelection(getTable()); + + ui.getRafaleStepField().getTextField().addKeyListener(new KeyAdapter() { + + @Override + public void keyReleased(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + e.consume(); + Float step = (Float) ui.getRafaleStepField().getModel(); + + applyRafaleStep(step); + } + } + }); } @Override public void onCloseUI() { -// ui.getValidator().setBean(null); } @Override + protected void saveRow(SpeciesFrequencyRowModel row) { + + // No persistence save from this screen + Float lengthStep = row.getLengthStep(); + if (log.isInfoEnabled()) { + log.info("Add row " + lengthStep + " to cache"); + } + + if (lengthStep != null) { + + // add it to cache + + } + } + + @Override + protected JXTable getTable() { + return ui.getTable(); + } + + @Override protected SpeciesFrequencyUIModel getModel() { return ui.getModel(); } + public void generateLengthSteps() { + + SpeciesFrequencyUIModel model = getModel(); + + Map<Float, SpeciesFrequencyRowModel> rowsByStep = + getTableModel().getRowCache(); + + Float minStep = model.getLengthStep(model.getMinStep()); + Float maxStep = model.getLengthStep(model.getMaxStep()); + + for (float i = minStep, step = model.getStep(); i <= maxStep; i += step) { + if (!rowsByStep.containsKey(i)) { + + // add it + SpeciesFrequencyRowModel newRow = new SpeciesFrequencyRowModel(); + newRow.setLengthStep(i); + rowsByStep.put(i, newRow); + } + } + + List<SpeciesFrequencyRowModel> rows = + Lists.newArrayList(rowsByStep.values()); + + model.setRows(rows); + } + + public void applyRafaleStep(Float step) { + + if (log.isInfoEnabled()) { + log.info("Will apply rafale step: " + step); + } + SpeciesFrequencyUIModel model = getModel(); + Map<Float, SpeciesFrequencyRowModel> rowsByStep = getTableModel().getRowCache(); + + float aroundLengthStep = model.getLengthStep(step); + + SpeciesFrequencyRowModel row = rowsByStep.get(aroundLengthStep); + + if (row != null) { + + // increments current row + Integer number = row.getNumber(); + row.setNumber((number == null ? 0 : number) + 1); + getTableModel().updateRow(row); + } else { + + // create a new row + row = new SpeciesFrequencyRowModel(); + row.setLengthStep(aroundLengthStep); + row.setNumber(1); + + // get new index + List<Float> steps = Lists.newArrayList(rowsByStep.keySet()); + steps.add(aroundLengthStep); + + Collections.sort(steps); + + int indexRow = steps.indexOf(aroundLengthStep); + + getTableModel().addNewRow(indexRow, row); + } + } + public void editBatch(SpeciesBatchRowModel row) { + List<SpeciesFrequencyRowModel> frequency = null; + if (row != null) { + frequency = row.getFrequency(); + } + + List<SpeciesFrequencyRowModel> editFrequency; + if (CollectionUtils.isEmpty(frequency)) { + + // new list + editFrequency = Lists.newArrayList(); + } else { + + editFrequency = Lists.newArrayList(frequency); + } + if (log.isInfoEnabled()) { - log.info("Will edit row: " + row); + log.info("Will edit batch row: " + row + " with " + + editFrequency.size() + " frequency"); } - getModel().fromBean(row); + getModel().setRows(editFrequency); + + // keep batch (will be used to push back editing entry) + getModel().setBatch(row); } public void close() { @@ -135,6 +261,25 @@ log.info("Will close UI " + ui); } + // transfer rows to editor + + List<SpeciesFrequencyRowModel> frequency = Lists.newArrayList(); + for (SpeciesFrequencyRowModel row : getModel().getRows()) { + if (row.isValid()) { + + // can keep this row + frequency.add(row); + } + } + + if (log.isInfoEnabled()) { + log.info("Push back " + frequency.size() + + " frequency to batch " + getModel().getBatch()); + } + + // push back to batch + getModel().getBatch().setFrequency(frequency); + ui.editBatch(null); SwingUtil.getParentContainer(ui, JDialog.class).setVisible(false); @@ -149,7 +294,7 @@ addFloatColumnToModel(columnModel, SpeciesFrequencyColumnIdentifier.lengthStep, - TuttiUI.DECIMAL3_PATTERN); + TuttiUI.DECIMAL1_PATTERN); } { // Number Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUIModel.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUIModel.java 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/catches/species/frequency/SpeciesFrequencyUIModel.java 2012-12-07 14:48:14 UTC (rev 33) @@ -26,11 +26,7 @@ import fr.ifremer.tutti.ui.swing.content.catches.species.SpeciesBatchRowModel; import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel; -import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderModelBuilder; -import static org.nuiton.i18n.I18n.n_; - /** * @author tchemit <chemit@codelutin.com> * @since 0.2 @@ -39,49 +35,65 @@ private static final long serialVersionUID = 1L; - protected static final Binder<SpeciesBatchRowModel, SpeciesFrequencyUIModel> fromBeanBinder = - BinderModelBuilder.newEmptyBuilder(SpeciesBatchRowModel.class, SpeciesFrequencyUIModel.class) - .addProperty(SpeciesBatchRowModel.PROPERTY_FREQUENCY, PROPERTY_ROWS) - .toBinder(); + public static final String PROPERTY_CONFIGURATION_MODE = "configurationMode"; - protected static final Binder<SpeciesFrequencyUIModel, SpeciesBatchRowModel> toBeanBinder = - BinderModelBuilder.newEmptyBuilder(SpeciesFrequencyUIModel.class, SpeciesBatchRowModel.class) - .addProperty(PROPERTY_ROWS, SpeciesBatchRowModel.PROPERTY_FREQUENCY) - .toBinder(); + public static final String PROPERTY_STEP = "step"; - public static final String PROPERTY_CONFIGURATION_MODE = "configurationMode"; + private static final String PROPERTY_MIN_STEP = "minStep"; - public static enum ConfigurationMode { + private static final String PROPERTY_MAX_STEP = "maxStep"; - SIMPLE(n_("tutti.speciesFrequency.configurationMode.simple"), - n_("tutti.speciesFrequency.configurationMode.simple.tip")), - AUTO_GEN(n_("tutti.speciesFrequency.configurationMode.autoGenerate"), - n_("tutti.speciesFrequency.configurationMode.autoGenerate.tip")), - RAFALE(n_("tutti.speciesFrequency.configurationMode.rafale"), - n_("tutti.speciesFrequency.configurationMode.rafale.tip")); + public static final String PROPERTY_CAN_GENERATE = "canGenerate"; - private final String i18nKey; + public static final String PROPERTY_SIMPLE_MODE = "simpleMode"; - private final String tipKey; + public static final String PROPERTY_AUTO_GEN_MODE = "autoGenMode"; - private ConfigurationMode(String i18nKey, String tipKey) { - this.i18nKey = i18nKey; - this.tipKey = tipKey; - } + public static final String PROPERTY_RAFALE_MODE = "rafaleMode"; - public String getI18nKey() { - return i18nKey; - } - - public String getTipKey() { - return tipKey; - } + public static enum ConfigurationMode { + SIMPLE, + AUTO_GEN, + RAFALE } + /** + * Fill mode. + * + * @since 0.2 + */ protected ConfigurationMode configurationMode; + /** + * Batch that contains frequencies. + * + * @since 0.2 + */ + protected SpeciesBatchRowModel batch; + + /** + * Default step to increment length step. + * + * @since 0.2 + */ + protected float step; + + /** + * Min step to auto generate length steps. + * + * @since 0.2 + */ + protected Float minStep; + + /** + * Max step to auto generate length steps. + * + * @since 0.2 + */ + protected Float maxStep; + public SpeciesFrequencyUIModel() { - super(SpeciesBatchRowModel.class, fromBeanBinder, toBeanBinder); + super(SpeciesBatchRowModel.class, null, null); } public ConfigurationMode getConfigurationMode() { @@ -92,6 +104,72 @@ Object oldValue = getConfigurationMode(); this.configurationMode = configurationMode; firePropertyChange(PROPERTY_CONFIGURATION_MODE, oldValue, configurationMode); + firePropertyChange(PROPERTY_SIMPLE_MODE, null, isSimpleMode()); + firePropertyChange(PROPERTY_AUTO_GEN_MODE, null, isAutoGenMode()); + firePropertyChange(PROPERTY_RAFALE_MODE, null, isRafaleMode()); } + public float getStep() { + return step; + } + + public void setStep(float step) { + Object oldValue = getStep(); + this.step = step; + firePropertyChange(PROPERTY_STEP, oldValue, step); + } + + public Float getMinStep() { + return minStep; + } + + public void setMinStep(Float minStep) { + Object oldValue = getMinStep(); + this.minStep = minStep; + firePropertyChange(PROPERTY_MIN_STEP, oldValue, minStep); + firePropertyChange(PROPERTY_CAN_GENERATE, null, isCanGenerate()); + } + + public Float getMaxStep() { + return maxStep; + } + + public void setMaxStep(Float maxStep) { + Object oldValue = getMaxStep(); + this.maxStep = maxStep; + firePropertyChange(PROPERTY_MAX_STEP, oldValue, maxStep); + firePropertyChange(PROPERTY_CAN_GENERATE, null, isCanGenerate()); + } + + public boolean isSimpleMode() { + return ConfigurationMode.SIMPLE == configurationMode; + } + + public boolean isAutoGenMode() { + return ConfigurationMode.AUTO_GEN == configurationMode; + } + + public boolean isRafaleMode() { + return ConfigurationMode.RAFALE == configurationMode; + } + + public boolean isCanGenerate() { + return minStep != null && maxStep != null && maxStep > minStep; + } + + public SpeciesBatchRowModel getBatch() { + return batch; + } + + public void setBatch(SpeciesBatchRowModel batch) { + this.batch = batch; + } + + public float getLengthStep(float lengthStep) { + int intValue = (int) (lengthStep * 10); + int intStep = (int) (step * 10); + int correctIntStep = intValue - (intValue % intStep); + float result = correctIntStep / 10f; + return result; + } } \ No newline at end of file Deleted: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractColumnIdentifier.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractColumnIdentifier.java 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractColumnIdentifier.java 2012-12-07 14:48:14 UTC (rev 33) @@ -1,44 +0,0 @@ -package fr.ifremer.tutti.ui.swing.util.table; - -/* - * #%L - * Tutti :: UI - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2012 Ifremer - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/gpl-3.0.html>. - * #L% - */ - -import java.io.Serializable; - -/** - * @author tchemit <chemit@codelutin.com> - * @since 0.2 - */ -public interface AbstractColumnIdentifier<R> extends Serializable { - - String getPropertyName(); - - String getHeaderI18nKey(); - - String getHeaderTipI18nKey(); - - void setValue(R entry, Object value); - - Object getValue(R entry); -} Modified: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractSelectTableAction.java =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractSelectTableAction.java 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractSelectTableAction.java 2012-12-07 14:48:14 UTC (rev 33) @@ -53,16 +53,20 @@ this.table = table; } + public static void doSelectCell(JTable table, int rowIndex, int columnIndex) { + + table.setColumnSelectionInterval(columnIndex, columnIndex); + table.setRowSelectionInterval(rowIndex, rowIndex); + table.editCellAt(rowIndex, columnIndex); + } + protected void doSelectCell(int rowIndex, int columnIndex) { if (log.isDebugEnabled()) { log.debug("Will select cell at " + getCellCoordinate(rowIndex, columnIndex)); } - - table.editCellAt(rowIndex, columnIndex); - table.setColumnSelectionInterval(columnIndex, columnIndex); - table.setRowSelectionInterval(rowIndex, rowIndex); + doSelectCell(table, rowIndex, columnIndex); } 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 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableModel.java 2012-12-07 14:48:14 UTC (rev 33) @@ -44,7 +44,7 @@ * @author tchemit <chemit@codelutin.com> * @since 0.2 */ -public abstract class AbstractTuttiTableModel<R extends Serializable, C extends AbstractColumnIdentifier<R>> extends AbstractTableModel { +public abstract class AbstractTuttiTableModel<R extends Serializable, C extends ColumnIdentifier<R>> extends AbstractTableModel { private static final long serialVersionUID = 1L; @@ -111,20 +111,47 @@ log.info("Set " + data.size() + " row(s) in table model " + this); } this.rows = data; + onRowsChanged(data); fireTableDataChanged(); } public final void addNewRow() { R newValue = createNewRow(); + addNewRow(getRowCount(), newValue); + } + public final void addNewRow(int rowIndex, R newValue) { + + Preconditions.checkNotNull(newValue, "Row can not be null."); + List<R> data = getRows(); Preconditions.checkNotNull(data, "Data list can not be null."); - data.add(newValue); - int rowIndex = data.indexOf(newValue); + data.add(rowIndex, newValue); + + onRowAdded(rowIndex, newValue); fireTableRowsInserted(rowIndex, rowIndex); } + public void updateRow(R row) { + Preconditions.checkNotNull(row, "Row can not be null."); + + List<R> data = getRows(); + Preconditions.checkNotNull(data, "Data list can not be null."); + + int rowIndex = data.indexOf(row); + + fireTableRowsUpdated(rowIndex, rowIndex); + } + + protected void onRowsChanged(List<R> data) { + // by default do nothing + } + + protected void onRowAdded(int rowIndex, R newValue) { + // by default do nothing + } + public final C getPropertyName(int columnIndex) { TableColumn column = getColumn(columnIndex); return (C) column.getIdentifier(); 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 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIHandler.java 2012-12-07 14:48:14 UTC (rev 33) @@ -69,7 +69,7 @@ * @author tchemit <chemit@codelutin.com> * @since 0.2 */ -public abstract class AbstractTuttiTableUIHandler<R extends AbstractTuttiBeanUIModel, C extends AbstractColumnIdentifier<R>, T extends AbstractTuttiTableModel<R, C>, M extends AbstractTuttiTableUIModel<?, R, M>> extends AbstractTuttiUIHandler<M> { +public abstract class AbstractTuttiTableUIHandler<R extends AbstractTuttiBeanUIModel, C extends ColumnIdentifier<R>, T extends AbstractTuttiTableModel<R, C>, M extends AbstractTuttiTableUIModel<?, R, M>> extends AbstractTuttiUIHandler<M> { /** Logger. */ private static final Log log = @@ -139,10 +139,10 @@ return keyAdapter; } - protected <C extends AbstractColumnIdentifier> void addColumnToModel(TableColumnModel model, - TableCellEditor editor, - TableCellRenderer renderer, - C identifier) { + protected void addColumnToModel(TableColumnModel model, + TableCellEditor editor, + TableCellRenderer renderer, + ColumnIdentifier identifier) { TableColumn col = new TableColumnExt(model.getColumnCount()); col.setCellEditor(editor); @@ -154,15 +154,15 @@ model.addColumn(col); } - protected <C extends AbstractColumnIdentifier> void addColumnToModel(TableColumnModel model, - C identifier) { + protected void addColumnToModel(TableColumnModel model, + ColumnIdentifier identifier) { addColumnToModel(model, null, null, identifier); } - protected <C extends AbstractColumnIdentifier> void addFloatColumnToModel(TableColumnModel model, - C identifier, - String numberPattern) { + protected void addFloatColumnToModel(TableColumnModel model, + ColumnIdentifier identifier, + String numberPattern) { NumberCellEditor<Float> editor = JAXXWidgetUtil.newNumberTableCellEditor(Float.class, false); @@ -174,9 +174,9 @@ } - protected <C extends AbstractColumnIdentifier> void addIntegerColumnToModel(TableColumnModel model, - C identifier, - String numberPattern) { + protected void addIntegerColumnToModel(TableColumnModel model, + ColumnIdentifier identifier, + String numberPattern) { NumberCellEditor<Integer> editor = JAXXWidgetUtil.newNumberTableCellEditor(Integer.class, false); @@ -188,9 +188,9 @@ } - protected <C extends AbstractColumnIdentifier> void addBooleanColumnToModel(TableColumnModel model, - C identifier, - JTable table) { + protected void addBooleanColumnToModel(TableColumnModel model, + ColumnIdentifier identifier, + JTable table) { addColumnToModel(model, table.getDefaultEditor(Boolean.class), @@ -198,9 +198,9 @@ identifier); } - protected <C extends AbstractColumnIdentifier, B> void addComboDataColumnToModel(TableColumnModel model, - C identifier, - Decorator<B> decorator, List<B> data) { + protected <B> void addComboDataColumnToModel(TableColumnModel model, + ColumnIdentifier identifier, + Decorator<B> decorator, List<B> data) { JComboBox comboBox = new JComboBox(); comboBox.setRenderer(newListCellRender(decorator)); SwingUtil.fillComboBox(comboBox, data, null); @@ -215,9 +215,9 @@ identifier); } - protected <C extends AbstractColumnIdentifier, B extends Enum<B>> void addComboEnumColumnToModel(TableColumnModel model, - C identifier, - B[] data) { + protected <B extends Enum<B>> void addComboEnumColumnToModel(TableColumnModel model, + ColumnIdentifier identifier, + B[] data) { EnumEditor<B> comboBox = EnumEditor.newEditor(data); BeanUIUtil.decorate(comboBox, ObjectToStringConverter.DEFAULT_IMPLEMENTATION); 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 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractTuttiTableUIModel.java 2012-12-07 14:48:14 UTC (rev 33) @@ -42,7 +42,9 @@ protected List<R> rows; - protected AbstractTuttiTableUIModel(Class<E> entityType, Binder<E, B> fromBeanBinder, Binder<B, E> toBeanBinder) { + protected AbstractTuttiTableUIModel(Class<E> entityType, + Binder<E, B> fromBeanBinder, + Binder<B, E> toBeanBinder) { super(entityType, fromBeanBinder, toBeanBinder); } Copied: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/ColumnIdentifier.java (from rev 32, trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/AbstractColumnIdentifier.java) =================================================================== --- trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/ColumnIdentifier.java (rev 0) +++ trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/ColumnIdentifier.java 2012-12-07 14:48:14 UTC (rev 33) @@ -0,0 +1,44 @@ +package fr.ifremer.tutti.ui.swing.util.table; + +/* + * #%L + * Tutti :: UI + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 Ifremer + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import java.io.Serializable; + +/** + * @author tchemit <chemit@codelutin.com> + * @since 0.2 + */ +public interface ColumnIdentifier<R> extends Serializable { + + String getPropertyName(); + + String getHeaderI18nKey(); + + String getHeaderTipI18nKey(); + + void setValue(R entry, Object value); + + Object getValue(R entry); +} Property changes on: trunk/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/table/ColumnIdentifier.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native 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 2012-12-06 17:43:45 UTC (rev 32) +++ trunk/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties 2012-12-07 14:48:14 UTC (rev 33) @@ -5,6 +5,7 @@ tutti.action.cancel=Annuler tutti.action.casino-import=Import Casino tutti.action.catches=Captures +tutti.action.close=Fermer tutti.action.configuration=Configuration tutti.action.configuration.tip=Configurer Tutti tutti.action.edit=Editer @@ -12,6 +13,7 @@ tutti.action.exit.tip=Quitter l'application tutti.action.fillCatches=Captures tutti.action.fillCatches.tip=Saisir des captures +tutti.action.generate=Générer tutti.action.manageProtocol=Protocole tutti.action.manageProtocol.tip=Gérer les protocoles tutti.action.new=Nouveau @@ -47,7 +49,18 @@ tutti.label.captureAccidentel.sampleTotalWeight=Poids total échantillonné tutti.label.captureAccidentel.totalWeight=Poids total tutti.label.comment=Commentaire -tutti.label.frequencyConfiguration=Mode de saisie +tutti.label.frequencyConfiguration.maxStep=Classe max +tutti.label.frequencyConfiguration.minStep=Classe min +tutti.label.frequencyConfiguration.mode=Mode de saisie +tutti.label.frequencyConfiguration.mode.autoGen=Génération des classes +tutti.label.frequencyConfiguration.mode.autoGen.tip=Mode où toutes les classes de taille sont générées +tutti.label.frequencyConfiguration.mode.rafale=Mode "rafale" +tutti.label.frequencyConfiguration.mode.rafale.tip=Mode où on ne saisit uniquement la classe de taille (les nombres seront alors incrémentés...) +tutti.label.frequencyConfiguration.mode.simple=Mode simple +tutti.label.frequencyConfiguration.mode.simple.tip=Mode par défaut on on doit tout saisir (les classes de tailles et les nombres) +tutti.label.frequencyConfiguration.no.configuration=< Pas de configuration > +tutti.label.frequencyConfiguration.rafaleStep=Classe de taille à incrémenter +tutti.label.frequencyConfiguration.step=Pas de la classe de taille tutti.label.list.gear=Engin(s) tutti.label.list.headOfMission=Chef(s) de mission tutti.label.list.headOfSortRoom=Reponsable(s) de salle de tri @@ -107,6 +120,7 @@ tutti.label.trait.traitRectiligne=Trait rectiligne tutti.label.trait.traitValid=Trait valide tutti.label.trait.windDirection=Direction du vent +tutti.legend.frequencyConfiguration=Configuration tutti.menu.actions=Actions tutti.menu.actions.tip=Actions tutti.menu.file=Fichier @@ -121,12 +135,6 @@ tutti.menu.synchronisationImport.tip=Effectuer des imports tutti.menu.synchronisations=Synchronisation tutti.menu.synchronisations.tip=Import/Export -tutti.speciesFrequency.configurationMode.autoGenerate=Génération des classes -tutti.speciesFrequency.configurationMode.autoGenerate.tip=Mode où toutes les classes de taille sont générées -tutti.speciesFrequency.configurationMode.rafale=Mode "rafale" -tutti.speciesFrequency.configurationMode.rafale.tip=Mode où on ne saisit uniquement la classe de taille (les nombres seront alors incrémentés...) -tutti.speciesFrequency.configurationMode.simple=Mode simple -tutti.speciesFrequency.configurationMode.simple.tip=Mode par défaut on on doit tout saisir (les classes de tailles et les nombres) tutti.table.benthos.header.number=Nombre observé tutti.table.benthos.header.speciesByCode=Espèce tutti.table.benthos.header.weight=Poids observé Copied: trunk/tutti-ui-swing/src/main/resources/icons/action-close.png (from rev 32, trunk/tutti-ui-swing/src/main/resources/icons/action-exit.png) =================================================================== (Binary files differ)
participants (1)
-
tchemit@users.forge.codelutin.com