Java tutorial
/** * Copyright Vclav Brodec 2014. * * This file is part of Botn?ek. * * Botn?ek 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. * * Botn?ek 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 Botn?ek. If not, see <http://www.gnu.org/licenses/>. */ package cz.cuni.mff.ms.brodecva.botnicek.ide.check.common.views; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import javax.swing.table.AbstractTableModel; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import cz.cuni.mff.ms.brodecva.botnicek.ide.check.common.model.checker.CheckResult; import cz.cuni.mff.ms.brodecva.botnicek.ide.utils.resources.UiLocalizer; /** * <p> * Model tabulky pro zobrazen seazench vsledk nespnch kontrol zadanch * etzc oproti datovm typm. * </p> * <p> * Umouje aktualizovat vsledky tak, e nahrazuje ty, kter maj stejn * pedmt. Vsledek spn kontroly nebude pidn, pouze smae souvisejc * negativn. * </p> * * @author Vclav Brodec * @version 1.0 */ public final class ResultsTableModel extends AbstractTableModel { /** * Kompartor pro pehledn azen vsledk (nen slu?iteln s ekvivalenc * vsledk). */ private static final class SortingComparator implements Comparator<CheckResult> { @Override public int compare(final CheckResult first, final CheckResult second) { Preconditions.checkNotNull(first); Preconditions.checkNotNull(second); final int sourceComparation = first.getSource().toString().compareTo(second.toString()); if (sourceComparation != 0) { return sourceComparation; } final int lineComparison = Integer.compare(first.getErrorLineNumber(), second.getErrorLineNumber()); if (lineComparison != 0) { return lineComparison; } final int columnComparison = Integer.compare(first.getErrorColumnNumber(), second.getErrorColumnNumber()); if (columnComparison != 0) { return columnComparison; } final int messageComparison = first.getMessage().compareTo(second.getMessage()); if (messageComparison != 0) { return messageComparison; } return 0; } } private static final long serialVersionUID = 1L; private static final Comparator<CheckResult> SORTING_COMPARATOR = new SortingComparator(); private static final int COLUMNS_COUNT = 4; private static final List<String> COLUMNS_NAMES = ImmutableList.of(UiLocalizer.print("Description"), UiLocalizer.print("Source"), UiLocalizer.print("Line"), UiLocalizer.print("Column")); private static final List<Class<?>> COLUMNS_CLASSES = ImmutableList.<Class<?>>of(String.class, String.class, Integer.class, Integer.class); static { assert COLUMNS_NAMES.size() == COLUMNS_COUNT; assert COLUMNS_CLASSES.size() == COLUMNS_COUNT; } /** * Vytvo model. * * @return model */ public static ResultsTableModel create() { return new ResultsTableModel(); } /** * Seznam, kter je udrovn seazen v poad: podle zdroje, ?sla dky, * sloupce a zprvy. */ private final List<CheckResult> results = new LinkedList<>(); private ResultsTableModel() { } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#getColumnClass(int) */ @Override public Class<?> getColumnClass(final int column) { Preconditions.checkPositionIndex(column, COLUMNS_CLASSES.size()); return COLUMNS_CLASSES.get(column); } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#getColumnCount() */ @Override public int getColumnCount() { return COLUMNS_COUNT; } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#getColumnName(int) */ @Override public String getColumnName(final int column) { Preconditions.checkPositionIndex(column, COLUMNS_NAMES.size()); return COLUMNS_NAMES.get(column); } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#getRowCount() */ @Override public int getRowCount() { return this.results.size(); } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#getValueAt(int, int) */ @Override public Object getValueAt(final int rowIndex, final int columnIndex) { final List<CheckResult> rows = new ArrayList<>(this.results); final CheckResult row = rows.get(rowIndex); final List<Object> columns = Lists.<Object>newArrayList(row.getMessage(), row.getSource().toString(), row.getErrorLineNumber(), row.getErrorColumnNumber()); return columns.get(columnIndex); } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#isCellEditable(int, int) */ @Override public boolean isCellEditable(final int arg0, final int arg1) { return false; } /** * Aktualizuje vsledek. * * @param result * nov vsledek */ public void updateResult(final CheckResult result) { Preconditions.checkNotNull(result); final boolean removed = this.results.remove(result); final boolean added; if (!result.isValid()) { added = this.results.add(result); } else { added = false; } if (removed || added) { Collections.sort(this.results, SORTING_COMPARATOR); fireTableDataChanged(); } } }