Author: echatellier Date: 2011-11-17 11:30:18 +0100 (Thu, 17 Nov 2011) New Revision: 895 Url: http://forge.codelutin.com/repositories/revision/coser/895 Log: #313 : Afficher les lignes en doublon cote ?\195?\160 cote dans la table Added: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDuplicatedLineTableModel.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlTableModel.java Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/control/ControlError.java trunk/coser-business/src/main/java/fr/ifremer/coser/control/ControlErrorGroup.java trunk/coser-business/src/main/java/fr/ifremer/coser/control/DiffCatchLengthControlError.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/ControlService.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationService.java trunk/coser-business/src/main/java/fr/ifremer/coser/storage/MemoryDataStorage.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/control/ControlError.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/control/ControlError.java 2011-11-16 08:28:34 UTC (rev 894) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/control/ControlError.java 2011-11-17 10:30:18 UTC (rev 895) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric + * Copyright (C) 2010,2011 Ifremer, Codelutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -26,8 +26,9 @@ package fr.ifremer.coser.control; import java.io.Serializable; +import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; +import java.util.List; import java.util.Set; import fr.ifremer.coser.CoserConstants.Category; @@ -69,12 +70,11 @@ * * Peut être vide si l'erreur n'est pas associé à une ligne specifiques. */ - protected Set<String> lineNumbers; + protected List<String> lineNumbers; public ControlError() { - super(); - - lineNumbers = new HashSet<String>(); + // set TreeSet, must be sorted for swing ui to change order in model + lineNumbers = new ArrayList<String>(); } /** @@ -176,13 +176,13 @@ } /** - * Numero des lignes dans le fichier CSV. + * Numero des lignes dans le fichier CSV (sorted by implementation). * * Peut être vide si l'erreur n'est pas associé a une ligne specifiques. * * @return line number */ - public Set<String> getLineNumbers() { + public List<String> getLineNumbers() { return lineNumbers; } Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/control/ControlErrorGroup.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/control/ControlErrorGroup.java 2011-11-16 08:28:34 UTC (rev 894) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/control/ControlErrorGroup.java 2011-11-17 10:30:18 UTC (rev 895) @@ -3,7 +3,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric + * Copyright (C) 2010,2011 Ifremer, Codelutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -49,7 +49,6 @@ * @param message */ public ControlErrorGroup(Category category, ValidationLevel validationLevel, String message) { - super(); this.category = category; this.validationLevel = validationLevel; this.message = message; Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/control/DiffCatchLengthControlError.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/control/DiffCatchLengthControlError.java 2011-11-16 08:28:34 UTC (rev 894) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/control/DiffCatchLengthControlError.java 2011-11-17 10:30:18 UTC (rev 895) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric + * Copyright (C) 2010,2011 Ifremer, Codelutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -25,7 +25,6 @@ package fr.ifremer.coser.control; - /** * Erreur de controle specifique pour les différences des nombres entre * les captures et les tailles pour utilisation typée de cette erreur Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ControlService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ControlService.java 2011-11-16 08:28:34 UTC (rev 894) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ControlService.java 2011-11-17 10:30:18 UTC (rev 895) @@ -315,6 +315,7 @@ } Map<String, String> uniqueDataKeys = new HashMap<String, String>(); + Map<String, ControlError> uniqueDataErrors = new HashMap<String, ControlError>(); List<ControlError> validationErrors = new ArrayList<ControlError>(); Iterator<String[]> itDataToCheck = dataToCheck.iterator(true); int lineIndex = 1; // 1 = skip header @@ -357,14 +358,25 @@ String lineNumber = line[AbstractDataEntity.INDEX_LINE]; String uniqueDataKey = getSignificantData(category, line); if (uniqueDataKeys.containsKey(uniqueDataKey)) { - ControlError error = new ControlError(); - error.setCategory(category); - error.setLevel(ValidationLevel.ERROR); - error.addLineNumber(uniqueDataKeys.get(uniqueDataKey)); + + // make a single ControlError instance pour the same + // duplicated even for more than 2 lines + ControlError error = null; + if (uniqueDataErrors.containsKey(uniqueDataKey)) { + error = uniqueDataErrors.get(uniqueDataKey); + } else { + error = new ControlError(); + error.setCategory(category); + error.setLevel(ValidationLevel.ERROR); + // warning, line number must stay sorted + error.addLineNumber(uniqueDataKeys.get(uniqueDataKey)); + error.setMessage(_("coser.business.control.error.duplicatedLine", uniqueDataKey)); + error.setDetailMessage(_("coser.business.control.error.duplicatedLineDetails", uniqueDataKey)); + validationErrors.add(error); + uniqueDataErrors.put(uniqueDataKey, error); + } + // add current line to error error.addLineNumber(lineNumber); - error.setMessage(_("coser.business.control.error.duplicatedLine", uniqueDataKey)); - error.setDetailMessage(_("coser.business.control.error.duplicatedLineDetails", uniqueDataKey)); - validationErrors.add(error); } else { uniqueDataKeys.put(uniqueDataKey, lineNumber); Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationService.java 2011-11-16 08:28:34 UTC (rev 894) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/PublicationService.java 2011-11-17 10:30:18 UTC (rev 895) @@ -378,7 +378,7 @@ for (ControlError error : validationErrorsChilds.get(group)) { out.println("<li type='circle'>"); out.print(_(error.getDetailMessage())); - Set<String> lineNumbers = error.getLineNumbers(); + List<String> lineNumbers = error.getLineNumbers(); if (CollectionUtils.isNotEmpty(lineNumbers)) { out.print(" (" + _("coser.business.publication.errorexportlines") + " : "); Iterator<String> itLineNumbers = lineNumbers.iterator(); Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/storage/MemoryDataStorage.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/storage/MemoryDataStorage.java 2011-11-16 08:28:34 UTC (rev 894) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/storage/MemoryDataStorage.java 2011-11-17 10:30:18 UTC (rev 895) @@ -26,8 +26,10 @@ package fr.ifremer.coser.storage; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; /** * Stockage mémoire des String[] sous forme de String simple. @@ -52,10 +54,13 @@ /** Stockage des numero de ligne (String) pour une recherche indexOf plus rapide. */ protected List<String> lineIndexStorage; - + /** Cache pour les indexOf encore plus rapide (invalidé lors d'un delete). */ + protected Map<String, Integer> lineIndexStorageCache; + public MemoryDataStorage() { listStorage = new ArrayList<String>(); lineIndexStorage = new ArrayList<String>(); + lineIndexStorageCache = new HashMap<String, Integer>(); } /** @@ -163,7 +168,12 @@ } public int indexOf(String lineNumber) { - return lineIndexStorage.indexOf(lineNumber); + Integer indexOf = lineIndexStorageCache.get(lineNumber); + if (indexOf == null) { + indexOf = lineIndexStorage.indexOf(lineNumber); + lineIndexStorageCache.put(lineNumber, indexOf); + } + return indexOf; } public int size() { @@ -182,6 +192,7 @@ String old = listStorage.remove(index); String[] oldArray = stringToArray(old); lineIndexStorage.remove(index); + lineIndexStorageCache.clear(); // invalidate cache on remove return oldArray; } Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java 2011-11-16 08:28:34 UTC (rev 894) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDataTableModel.java 2011-11-17 10:30:18 UTC (rev 895) @@ -3,7 +3,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2010 Ifremer, Codelutin, Chatellier Eric + * Copyright (C) 2010-2011 Ifremer, Codelutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -25,14 +25,13 @@ import static org.nuiton.i18n.I18n._; -import javax.swing.table.AbstractTableModel; - import fr.ifremer.coser.CoserConstants.Category; import fr.ifremer.coser.bean.Project; import fr.ifremer.coser.storage.DataStorage; /** - * Species and comments check boxed table model. + * Table model that display csv content loaded into memory and stored in + * project storage. * * @author chatellier * @version $Revision$ @@ -40,7 +39,7 @@ * Last update : $Date$ * By : $Author$ */ -public class ControlDataTableModel extends AbstractTableModel { +public class ControlDataTableModel extends ControlTableModel { /** serialVersionUID. */ private static final long serialVersionUID = -1192463259386773117L; @@ -56,6 +55,11 @@ updateData(controlView); } + @Override + public Category getCategory() { + return category; + } + protected void updateData(ControlView controlView) { Project project = controlView.getContextValue(Project.class); @@ -117,6 +121,7 @@ * @param rowIndex * @return String[] */ + @Override public String[] getDataAt(int rowIndex) { return data.get(rowIndex + 1); } @@ -128,6 +133,7 @@ * @param lineNumber le numero de données * @return l'index */ + @Override public int getRealIndexOfLine(String lineNumber) { // -1 because header is table header int result = data.indexOf(lineNumber) - 1; Added: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDuplicatedLineTableModel.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDuplicatedLineTableModel.java (rev 0) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDuplicatedLineTableModel.java 2011-11-17 10:30:18 UTC (rev 895) @@ -0,0 +1,319 @@ +/* + * #%L + * + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 Ifremer, Codelutin, Chatellier Eric + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser 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 Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ + +package fr.ifremer.coser.ui.control; + +import java.util.EventListener; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.swing.event.TableModelEvent; +import javax.swing.event.TableModelListener; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import fr.ifremer.coser.CoserConstants.Category; +import fr.ifremer.coser.control.ControlError; + +/** + * Table model that change line order to display duplicated line side by side. + * + * L'implementation reside sur la construction d'un tableau associatif qui + * associe les numeros demandé par la vue à d'autre numero différents qui + * correspondent au données du modèle réel. + * La précédente implémentation utilisait des ArrayList, mais n'était pas + * performante vis à vis de la construction de la liste. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public class ControlDuplicatedLineTableModel extends ControlTableModel { + + /** serialVersionUID. */ + private static final long serialVersionUID = 8138379018849263395L; + + private static final Log log = LogFactory.getLog(ControlDuplicatedLineTableModel.class); + + protected ControlTableModel dataTableModel; + + /** List des erreurs de validation (non null seulement apres validation). */ + protected List<ControlError> controlErrors; + + protected int[] linesIndex = null; + protected int[] reverseLinesIndex = null; + + @Override + public Category getCategory() { + return dataTableModel.getCategory(); + } + + public ControlDuplicatedLineTableModel(ControlTableModel dataTableModel) { + this.dataTableModel = dataTableModel; + } + + public void setControlErrors(List<ControlError> controlErrors) { + this.controlErrors = controlErrors; + computeLineIndices(); + fireTableDataChanged(); + } + + /** + * Compute line indices. + */ + protected void computeLineIndices() { + + long timeBefore = System.currentTimeMillis(); + int dataCount = getRowCount(); + Category category = getCategory(); + + // build indexed array + linesIndex = new int[dataCount]; + int i = 0; + int j = 0; + Set<Integer> alreadyDone = new HashSet<Integer>(); + while (i<dataCount) { + while (alreadyDone.contains(j)) { + j++; + } + linesIndex[i++] = j; + for (ControlError controlError : controlErrors) { + if (CollectionUtils.size(controlError.getLineNumbers()) >= 2 && category.equals(controlError.getCategory())) { + // can return -1 here, after control can contains deleted lines + int errorFirstLine = dataTableModel.getRealIndexOfLine(controlError.getLineNumbers().get(0)); + if (j == errorFirstLine) { + for (int errorIndex = 1; errorIndex < controlError.getLineNumbers().size(); ++errorIndex) { + // can return -1 here, after control can contains deleted lines + int delegateIndex = dataTableModel.getRealIndexOfLine(controlError.getLineNumbers().get(errorIndex)); + linesIndex[i++] = delegateIndex; + alreadyDone.add(delegateIndex); + } + } + } + } + j++; + } + + // build reverse array (for method getRealIndexOfLine) + reverseLinesIndex = new int[dataCount]; + for (int reversei = 0 ; reversei < dataCount ; ++reversei) { + reverseLinesIndex[linesIndex[reversei]] = reversei; + } + + if (log.isDebugEnabled()) { + long timeAfter = System.currentTimeMillis(); + log.debug("Build new order array took " + (timeAfter - timeBefore) + " ms"); + } + } + + /* + * @see javax.swing.table.TableModel#getRowCount() + */ + @Override + public int getRowCount() { + return dataTableModel.getRowCount(); + } + + /* + * @see javax.swing.table.TableModel#getColumnCount() + */ + @Override + public int getColumnCount() { + return dataTableModel.getColumnCount(); + } + + /* + * @see javax.swing.table.AbstractTableModel#getColumnName(int) + */ + @Override + public String getColumnName(int column) { + return dataTableModel.getColumnName(column); + } + + /** + * Look for modified order row index. + * + * @param rowIndex initial row index + * @return modified row index + */ + protected int getModifiedRowIndex(int rowIndex) { + int dupliRowIndex = rowIndex; + if (linesIndex != null) { + dupliRowIndex = linesIndex[rowIndex]; + } + return dupliRowIndex; + } + + /* + * @see javax.swing.table.TableModel#getValueAt(int, int) + */ + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return dataTableModel.getValueAt(getModifiedRowIndex(rowIndex), columnIndex); + } + + /* + * @see fr.ifremer.coser.ui.control.ControlTableModel#getDataAt(int) + */ + @Override + public String[] getDataAt(int rowIndex) { + return dataTableModel.getDataAt(getModifiedRowIndex(rowIndex)); + } + + /** + * Retourne l'index réel de la ligne dans la vue. + * + * Ne doit être utilisé que pour manipuler le modele de selection + * et non appeler derriere getValueAt ou getDataAt (pas de sens). + */ + @Override + public int getRealIndexOfLine(String lineNumber) { + int rowIndex = dataTableModel.getRealIndexOfLine(lineNumber); + // can return -2 if line has been deleted + if (rowIndex >= 0 && reverseLinesIndex != null) { + rowIndex = reverseLinesIndex[rowIndex]; + } + return rowIndex; + } + + /** + * Update linesIndex array to remove an index of a line. + * This method WONT work for addition, just deletion. + * + * @param lineIndex index of line to delete + */ + protected void deleteLine(int lineIndex) { + int dataCount = getRowCount(); + int currentVal = linesIndex[lineIndex]; + + // before index + for (int bIndex = 0; bIndex < lineIndex; ++bIndex) { + if (linesIndex[bIndex] > currentVal) { + linesIndex[bIndex] = linesIndex[bIndex] - 1; + } + } + // after index + // attention, il faut bien le <= ici, pour aller au dela + // du tableau et que l'element soit bien déplacé + // via aIndex - 1 dans le bon tableau + for (int aIndex = lineIndex + 1; aIndex <= dataCount; ++aIndex) { + if (linesIndex[aIndex] > currentVal) { + linesIndex[aIndex - 1] = linesIndex[aIndex] - 1; + } else { + linesIndex[aIndex - 1] = linesIndex[aIndex]; + } + } + + // update reverse array indices + for (int reversei = 0 ; reversei < dataCount ; ++reversei) { + reverseLinesIndex[linesIndex[reversei]] = reversei; + } + } + + @Override + public int findColumn(String columnName) { + return dataTableModel.findColumn(columnName); + } + + @Override + public Class<?> getColumnClass(int columnIndex) { + return dataTableModel.getColumnClass(columnIndex); + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return dataTableModel.isCellEditable(getModifiedRowIndex(rowIndex), columnIndex); + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + dataTableModel.setValueAt(aValue, getModifiedRowIndex(rowIndex), columnIndex); + } + + @Override + public void fireTableDataChanged() { + dataTableModel.fireTableDataChanged(); + } + + @Override + public void fireTableStructureChanged() { + dataTableModel.fireTableStructureChanged(); + } + + @Override + public void fireTableRowsInserted(int firstRow, int lastRow) { + dataTableModel.fireTableRowsUpdated(firstRow, lastRow); + } + + @Override + public void fireTableRowsUpdated(int firstRow, int lastRow) { + dataTableModel.fireTableRowsUpdated(firstRow, lastRow); + } + + @Override + public void fireTableRowsDeleted(int firstRow, int lastRow) { + // fire before to get row count return correct value + dataTableModel.fireTableRowsDeleted(firstRow, lastRow); + // then delete line + for (int lineIndex = firstRow; lineIndex <= lastRow; ++lineIndex) { + deleteLine(lineIndex); + } + } + + @Override + public void fireTableCellUpdated(int row, int column) { + dataTableModel.fireTableCellUpdated(row, column); + } + + @Override + public void fireTableChanged(TableModelEvent e) { + dataTableModel.fireTableChanged(e); + } + + @Override + public void addTableModelListener(TableModelListener l) { + dataTableModel.addTableModelListener(l); + } + + @Override + public void removeTableModelListener(TableModelListener l) { + dataTableModel.removeTableModelListener(l); + } + + @Override + public TableModelListener[] getTableModelListeners() { + return dataTableModel.getTableModelListeners(); + } + + @Override + public <T extends EventListener> T[] getListeners(Class<T> listenerType) { + return dataTableModel.getListeners(listenerType); + } +} Property changes on: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlDuplicatedLineTableModel.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2011-11-16 08:28:34 UTC (rev 894) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2011-11-17 10:30:18 UTC (rev 895) @@ -39,7 +39,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.UUID; import javax.swing.JFrame; @@ -177,7 +176,7 @@ // plusieurs lignes selectionnées et pas la premiere colonne (Line index) if (dataSelectedRows.length > 0 && columnIndex > 0) { - ControlDataTableModel controlDataModel = (ControlDataTableModel)displayedTable.getModel(); + ControlTableModel controlDataModel = (ControlTableModel)displayedTable.getModel(); final String columnName = displayedTable.getColumnName(columnIndex); final String firstValue = (String)controlDataModel.getValueAt(dataSelectedRows[0], columnIndex); @@ -258,7 +257,7 @@ ProjectService projectService = controlView.getContextValue(ProjectService.class); Category category = (Category)controlView.getCategoryComboBox().getSelectedItem(); - ControlDataTableModel model = (ControlDataTableModel)controlDataTable.getModel(); + ControlTableModel model = (ControlTableModel)controlDataTable.getModel(); String commandUUID = UUID.randomUUID().toString(); // il faut le faire à l'envers, sinon, les index de @@ -288,7 +287,7 @@ ControlView controlView = replaceView.getContextValue(ControlView.class, JAXXUtil.PARENT); Category category = (Category)controlView.getCategoryComboBox().getSelectedItem(); JTable displayedTable = getControlDataTable(controlView); - ControlDataTableModel controlDataModel = (ControlDataTableModel)displayedTable.getModel(); + ControlTableModel controlDataModel = (ControlTableModel)displayedTable.getModel(); ProjectService projectService = replaceView.getContextValue(ProjectService.class); Project project = replaceView.getContextValue(Project.class); @@ -414,6 +413,16 @@ List<ControlError> errors = get(); view.getGlobalControlErrorModel().setControlErrors(errors); + // set errors list in each table model + ControlDuplicatedLineTableModel catchModel = (ControlDuplicatedLineTableModel)view.getControlDataTableCatch().getModel(); + catchModel.setControlErrors(errors); + catchModel = (ControlDuplicatedLineTableModel)view.getControlDataTableStrata().getModel(); + catchModel.setControlErrors(errors); + catchModel = (ControlDuplicatedLineTableModel)view.getControlDataTableHaul().getModel(); + catchModel.setControlErrors(errors); + catchModel = (ControlDuplicatedLineTableModel)view.getControlDataTableLength().getModel(); + catchModel.setControlErrors(errors); + // active le bouton de sauvegarde si la liste d'erreur // ne contient pas de message d'erreur // warning, c'est ok @@ -443,6 +452,7 @@ public void controlDataTableSelectionChanged(ControlView view) { JTable table = getControlDataTable(view); + ControlTableModel model = (ControlTableModel)table.getModel(); int[] selectedRows = table.getSelectedRows(); if (selectedRows.length == 1) { int selectedRow = selectedRows[0]; @@ -454,22 +464,25 @@ case CATCH: // warning, skip header header = project.getControl().getCatch().get(0); - line = project.getControl().getCatch().get(selectedRow + 1); + //project.getControl().getCatch().get(selectedRow + 1); break; case HAUL: header = project.getControl().getHaul().get(0); - line = project.getControl().getHaul().get(selectedRow + 1); + //line = project.getControl().getHaul().get(selectedRow + 1); break; case LENGTH: header = project.getControl().getLength().get(0); - line = project.getControl().getLength().get(selectedRow + 1); + //line = project.getControl().getLength().get(selectedRow + 1); break; case STRATA: header = project.getControl().getStrata().get(0); - line = project.getControl().getStrata().get(selectedRow + 1); + //line = project.getControl().getStrata().get(selectedRow + 1); break; } + // get data from model (because of line order modification) + line = model.getDataAt(selectedRow); + // convertion updateEditionPanel(view, category, header, line); } @@ -500,11 +513,11 @@ view.getCategoryComboBoxModel().setSelectedItem(category); ControlError error = (ControlError)pathWay[3]; - Set<String> errorLineNumbers = error.getLineNumbers(); + List<String> errorLineNumbers = error.getLineNumbers(); // peut être vide, si l'erreur ne porte pas sur un bean en particulier if (errorLineNumbers != null) { JTable displayedTable = getControlDataTable(view); - ControlDataTableModel tableModel = (ControlDataTableModel)displayedTable.getModel(); + ControlTableModel tableModel = (ControlTableModel)displayedTable.getModel(); ListSelectionModel selectionModel = displayedTable.getSelectionModel(); selectionModel.clearSelection(); @@ -615,14 +628,14 @@ // select all lines GlobalControlErrorModel model = controlView.getGlobalControlErrorModel(); JTable displayedTable = getControlDataTable(controlView); - ControlDataTableModel tableModel = (ControlDataTableModel)displayedTable.getModel(); + ControlTableModel tableModel = (ControlTableModel)displayedTable.getModel(); ListSelectionModel selectionModel = displayedTable.getSelectionModel(); selectionModel.clearSelection(); boolean first = true; int childCount = model.getChildCount(validationGroup); for (int indexChild = 0 ; indexChild < childCount ; ++indexChild) { ControlError validationError = (ControlError)model.getChild(validationGroup, indexChild); - Set<String> errorLineNumbers = validationError.getLineNumbers(); + List<String> errorLineNumbers = validationError.getLineNumbers(); for (String errorLineNumber : errorLineNumbers) { int errorLineIndex = tableModel.getRealIndexOfLine(errorLineNumber); @@ -946,7 +959,7 @@ Project project = view.getContextValue(Project.class); ProjectService projectService = view.getContextValue(ProjectService.class); JTable controlDataTable = getControlDataTable(view); - ControlDataTableModel model = (ControlDataTableModel)controlDataTable.getModel(); + ControlTableModel model = (ControlTableModel)controlDataTable.getModel(); int selectedLine = controlDataTable.getSelectedRow(); Category category = (Category)view.getCategoryComboBox().getSelectedItem(); @@ -1009,7 +1022,7 @@ // get selected row, and selected csv line index JTable controlDataTable = getControlDataTable(view); - ControlDataTableModel model = (ControlDataTableModel)controlDataTable.getModel(); + ControlTableModel model = (ControlTableModel)controlDataTable.getModel(); int selectedLine = controlDataTable.getSelectedRow(); Category category = (Category)view.getCategoryComboBox().getSelectedItem(); String[] data = model.getDataAt(selectedLine); Added: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlTableModel.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlTableModel.java (rev 0) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlTableModel.java 2011-11-17 10:30:18 UTC (rev 895) @@ -0,0 +1,69 @@ +/* + * #%L + * + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 Ifremer, Codelutin, Chatellier Eric + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser 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 Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ + +package fr.ifremer.coser.ui.control; + +import javax.swing.table.AbstractTableModel; + +import fr.ifremer.coser.CoserConstants.Category; + +/** + * Common interface for all data table model used in control view. + * + * @author chatellier + * @version $Revision$ + * + * Last update : $Date$ + * By : $Author$ + */ +public abstract class ControlTableModel extends AbstractTableModel { + + /** serialVersionUID. */ + private static final long serialVersionUID = -2010447483214407634L; + + /** + * Return category managed by model. + * + * @return model category + */ + public abstract Category getCategory(); + + /** + * Retourne la donnée (toutes le String[]) à la ligne demandée. + * + * @param rowIndex + * @return String[] + */ + public abstract String[] getDataAt(int rowIndex); + + /** + * Retourne l'index dans la liste des données du numero de ligne + * demandé. + * + * @param lineNumber le numero de données + * @return l'index + */ + public abstract int getRealIndexOfLine(String lineNumber); +} Property changes on: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlTableModel.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx 2011-11-16 08:28:34 UTC (rev 894) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlView.jaxx 2011-11-17 10:30:18 UTC (rev 895) @@ -79,25 +79,25 @@ <CardLayout id="controlTablesLayout" /> <JPanel id="controlTablesPanel" layout="{controlTablesLayout}"> <JScrollPane constraints="Category.CATCH.toString()"> - <JTable id='controlDataTableCatch' model="{new fr.ifremer.coser.ui.control.ControlDataTableModel(this, Category.CATCH)}" + <JTable id='controlDataTableCatch' model="{new ControlDuplicatedLineTableModel(new ControlDataTableModel(this, Category.CATCH))}" onMouseClicked="getHandler().showDataTableContextMenu(this, event)" /> <ListSelectionModel id="controlDataTableSelectionModelCatch" javaBean="controlDataTableCatch.getSelectionModel()" onValueChanged="getHandler().controlDataTableSelectionChanged(this)" /> </JScrollPane> <JScrollPane constraints="Category.STRATA.toString()"> - <JTable id='controlDataTableStrata' model="{new fr.ifremer.coser.ui.control.ControlDataTableModel(this, Category.STRATA)}" + <JTable id='controlDataTableStrata' model="{new ControlDuplicatedLineTableModel(new ControlDataTableModel(this, Category.STRATA))}" onMouseClicked="getHandler().showDataTableContextMenu(this, event)" /> <ListSelectionModel id="controlDataTableSelectionModelStrata" javaBean="controlDataTableStrata.getSelectionModel()" onValueChanged="getHandler().controlDataTableSelectionChanged(this)" /> </JScrollPane> <JScrollPane constraints="Category.HAUL.toString()"> - <JTable id='controlDataTableHaul' model="{new fr.ifremer.coser.ui.control.ControlDataTableModel(this, Category.HAUL)}" + <JTable id='controlDataTableHaul' model="{new ControlDuplicatedLineTableModel(new ControlDataTableModel(this, Category.HAUL))}" onMouseClicked="getHandler().showDataTableContextMenu(this, event)" /> <ListSelectionModel id="controlDataTableSelectionModelHaul" javaBean="controlDataTableHaul.getSelectionModel()" onValueChanged="getHandler().controlDataTableSelectionChanged(this)" /> </JScrollPane> <JScrollPane constraints="Category.LENGTH.toString()"> - <JTable id='controlDataTableLength' model="{new fr.ifremer.coser.ui.control.ControlDataTableModel(this, Category.LENGTH)}" + <JTable id='controlDataTableLength' model="{new ControlDuplicatedLineTableModel(new ControlDataTableModel(this, Category.LENGTH))}" onMouseClicked="getHandler().showDataTableContextMenu(this, event)" /> <ListSelectionModel id="controlDataTableSelectionModelLength" javaBean="controlDataTableLength.getSelectionModel()" onValueChanged="getHandler().controlDataTableSelectionChanged(this)" />