/* * ResultTableModel.java * * Copyright (c) 2005-2007 Andrew Krizhanovsky /aka at mail.iias.spb.su/ * Distributed under GNU Public License. */ package com.touchgraph.wikibrowser.panel; import com.touchgraph.wikibrowser.*; import com.touchgraph.wikibrowser.parameter.*; import wikipedia.kleinberg.*; import javax.swing.table.*; import javax.swing.*; import java.util.*; /** Table with found synonyms */ public class ResultTableModel extends AbstractTableModel { private boolean DEBUG = true; public TGWikiBrowser wb; private JTable syn_table; /** Class stores data about row in synonym table */ class SynonymRow { /** synonym word */ String word; /** hub weight */ float hub_weight; /** authority weight */ float authority_weight; /** the word is rated by user as synonym if true */ boolean rate; // type of relation: // // ====See also Смотри также==== // } private List<SynonymRow> rows; //public int [] preferred_width = {170, 10, 10, 10}; public int [] preferred_width = {170, 10, 10, 50}; private String[] column_names = {"Synonyms_header","hub", "a","Rate_it"}; //public static final int HUB_WEIGHT_COL = 1; //public static final int AUTHORITY_WEIGHT_COL = 2; public static final int RATEIT_COL = 3; private Object[][] data = { //{"", new Integer(0), new Integer(0), new Boolean(false)} }; /** Initialize parameters, table column width. */ public void init(JTable table) { assert(null != wb); syn_table = table; rows = new ArrayList<SynonymRow>(); // init columns width TableColumn column = null; for (int i = 0; i < preferred_width.length; i++) { column = table.getColumnModel().getColumn(i); column.setPreferredWidth(preferred_width[i]); } } public int getColumnCount() { return column_names.length; } public int getRowCount() { return data.length; } public String getColumnName(int col) { return wb.tr.getString(column_names[col]); } public Object getValueAt(int row, int col) { return data[row][col]; } /* * JTable uses this method to determine the default renderer/ * editor for each cell. If we didn't implement this method, * then the last column would contain text ("true"/"false"), * rather than a check box. */ public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } /* * Don't need to implement this method unless your table's * editable. */ public boolean isCellEditable(int row, int col) { //Note that the data/cell address is constant, //no matter where the cell appears onscreen. if (col < 2) { return false; } else { return true; } } /* * Don't need to implement this method unless your table's * data can change. */ public void setValueAt(Object value, int row, int col) { if (DEBUG) { System.out.println("Setting value at " + row + "," + col + " to " + value + " (an instance of " + value.getClass() + ")"); } data[row][col] = value; fireTableCellUpdated(row, col); // add/remove mark 'rated' for synonyms in rows if(RATEIT_COL == col) { SynonymRow r = rows.get(row); r.rate = value.equals(true); } // change rated synonyms in /log_dir/Article.params wb.syn_searcher.setArticleParameters(); if (DEBUG) { System.out.println("New value of data:"); printDebugData(); } } /** Adds row in synonyms' table. * @param word synonym word * @param mean meaning number * @param order order number in the list of synonyms for this meaning * @param rate the word is rated by user as synonym */ public void addSynonym(String word,float hub_weight,float authority_weight,boolean rate) { if (null != rows) { SynonymRow r = new SynonymRow(); r.word = word; r.hub_weight = hub_weight; r.authority_weight = authority_weight; r.rate = rate; rows.add(r); } } /** Adds rated synonym to table (if it is absent), marks it as rated, * dumps to log_dir/Article.params. */ public void addRatedSynonym(String w) { if(DEBUG) { System.out.println("ResultTableModel.addRatedSynonym word is " + w); } SynonymRow r = getRow(w); if(null != r) { if(!r.rate) { r.rate = true; } } else { addSynonym(w, 0, 0, true); } } /** Removes all non rated synonyms (remain all rated synonyms), * adds only synonyms which are not rated before. * * Use updateTable() to draw the new table. */ public void addUnratedSynonymListByArticles(List<Article> synonyms) { // removes all non rated synonyms List<String> rated_words = new ArrayList<String>(); if(null != rows) { for(int i=0; i<rows.size(); i++) { SynonymRow r = rows.get(i); if(!r.rate) { rows.remove(r); } else { rated_words.add(r.word); } } } // adds only synonyms which are not rated before. if (null != synonyms && 0 < synonyms.size()) { for(int i=0; i<synonyms.size(); i++) { Article a = synonyms.get(i); String word = a.page_title; if(!rated_words.contains(word)) { SynonymRow r = new SynonymRow(); r.word = word; r.authority_weight = a.x; r.hub_weight = a.y; rows.add(r); } } } } /** Removes all rows in table, add rated synonyms to rows */ public void createRatedSynonymList(List<String> synonyms) { assert(null != rows); rows.clear(); if (null != synonyms && 0 < synonyms.size()) { for(int i=0; i<synonyms.size(); i++) { SynonymRow r = new SynonymRow(); r.word = synonyms.get(i); r.rate = true; rows.add(r); } } } /** Gets only rated synonyms by user */ public List<String> getRatedSynonymList() { List<String> s = new ArrayList<String>(); if (null != rows) { for(int i=0; i<rows.size(); i++) { SynonymRow r = rows.get(i); if(r.rate) { if(null == s) { s = new ArrayList<String>(); } s.add(r.word); } } } return s; } /** Gets only rated synonyms by user as String, * synonyms delimited by 'delimiter'. */ public String getRatedSynonym(String delimiter) { String s = ""; if (null != rows) { for(int i=0; i<rows.size(); i++) { SynonymRow r = rows.get(i); if(r.rate) { if(0 < s.length()) { // adds delimiter after first word s += delimiter; } s += r.word; } } } return s; } /** Rates word w in the synonym table: checks checkbox, save to log_dir/Article.params. */ /*public void rateSynonymInvert(String w) { for(int i=0; i<rows.size(); i++) { SynonymRow r = rows.get(i); if(r.word.equalsIgnoreCase(w)) { r.rate = !r.rate; } } }*/ public void updateTable() { if (null != rows) { data = new Object[rows.size()][column_names.length]; for(int i=0; i<rows.size(); i++) { SynonymRow r = rows.get(i); data [i][0] = r.word; data [i][1] = r.hub_weight; data [i][2] = r.authority_weight; data [i][3] = r.rate; } fireTableDataChanged(); } } /** Gets row from the table, which contains the synonym w, * else returns null. */ public SynonymRow getRow(String w) { if (null == rows || 0 == rows.size()) { return null; } for(int i=0; i<rows.size(); i++) { SynonymRow r = rows.get(i); if(r.word.equalsIgnoreCase(w)) { return r; } } return null; } /** Gets row's number from the table, which contains the synonym w, * else returns -1. */ public int getRowNumber(String w) { if (null == rows || 0 == rows.size()) { return -1; } for(int i=0; i<rows.size(); i++) { SynonymRow r = rows.get(i); if(r.word.equalsIgnoreCase(w)) { return i; } } return -1; } /** Scrolls to row in the synonym table which contains the synonym word. */ public void scrollToRow(String word) { int i = getRowNumber(word); if(-1 != i) { syn_table.changeSelection(i, RATEIT_COL, true, true); } } private void printDebugData() { int numRows = getRowCount(); int numCols = getColumnCount(); for (int i=0; i < numRows; i++) { System.out.print(" row " + i + ":"); for (int j=0; j < numCols; j++) { System.out.print(" " + data[i][j]); } System.out.println(); } System.out.println("--------------------------"); } }