/* * CategoryTableModel.java * * Copyright (c) 2007 Andrew Krizhanovsky /aka at mail.iias.spb.su/ * Distributed under GNU Public License. */ package com.touchgraph.wikibrowser.panel; import wikipedia.kleinberg.Article; import wikipedia.kleinberg.Category; import wikipedia.kleinberg.CategoryBlackList; import com.touchgraph.wikibrowser.TGWikiBrowser; import javax.swing.table.AbstractTableModel; import javax.swing.JTable; import javax.swing.table.TableColumn; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.ListSelectionModel; import java.util.Map; import java.util.List; import java.util.ArrayList; /** Table with categories of found synonyms. Rows are sorted by number * of found articles which have these category (n_articles). */ public class CategoryTableModel extends AbstractTableModel { private boolean DEBUG = true; // public CategoryTableModel() { } public TGWikiBrowser wb; private CategoryPanel cp; private JTable cat_table; // syn_table; /** Class stores data about row in synonym table */ class CategoryRow { // SynonymRow /** Category name */ String word; /** Number of articles with this category */ int n_articles; /** Whether to add this category to the blacklist */ boolean b_blacklist; /** Wheather to show articles with this category */ boolean b_show; } /** rows of categories */ private List<CategoryRow> rows; /** categories in the same order as in rows (valid after search) */ private List<Category> categories_rows; /** map from id to article (valid after search) */ private Map<Integer, Article> id_to_article; public int [] preferred_width = {170, 10, 10, 50}; private String[] column_names = {"Category","Articles", "Blacklist","Show"}; //public static final int HUB_WEIGHT_COL = 1; public static final int BLACKLIST_COL = 2; public static final int SHOW_COL = 3; // RATEIT_COL private Object[][] data = { //{"", new Integer(0), new Integer(0), new Boolean(false)} }; /** Initialize parameters, table column width. */ public void init(JTable table, CategoryPanel cp) { this.cp = cp; cat_table = table; rows = new ArrayList<CategoryRow>(); categories_rows = new ArrayList<Category>(); id_to_article = null; // 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 'blacklist' for category in the row if(BLACKLIST_COL == col) { CategoryRow r = rows.get(row); r.b_blacklist = value.equals(true); if(r.b_blacklist) { wb.syn_searcher.addCategoryToBlackList(r.word); } else { wb.syn_searcher.removeCategoryFromBlackList(r.word); } } else if(SHOW_COL == col) { CategoryRow r = rows.get(row); r.b_show = value.equals(true); } // ??? nothing todo? // change rated synonyms in /log_dir/Article.params //wb.syn_searcher.setArticleParameters(); /*if (DEBUG) { System.out.println("New value of data:"); printDebugData(); }*/ } /** Prints list of article, when category is selected */ public void valueChanged(ListSelectionEvent e) { //Ignore extra messages. if (e.getValueIsAdjusting()) return; ListSelectionModel lsm = (ListSelectionModel)e.getSource(); if (lsm.isSelectionEmpty()) { //...//no rows are selected } else { StringBuffer sb = new StringBuffer(); // i row is selected int i = lsm.getMinSelectionIndex(); sb.append("Category: "); sb.append(categories_rows.get(i).page_title); sb.append("\n\n"); Category cat = categories_rows.get(i); int[] id_articles = cat.id_articles; if(null != id_articles || null == id_to_article){ for(int id:id_articles) { if(id_to_article.containsKey(id)) sb.append(id_to_article.get(id).page_title); sb.append("\n"); } } cp.output.setText(sb.toString()); } } /** 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 old categories, adds new categories. * @param id_to_category the map <page_id of category, category object> * * Use updateTable() to draw the new table. */ public void createCategoriesList(Map<Integer, Category> id_to_category, CategoryBlackList category_black_list, Map<Integer, Article> id_to_article) { rows.clear(); categories_rows.clear(); //cat_table.clearSelection(); //cat_table.removeAll(); fireTableDataChanged(); // 1. sort categories by c.getIdArticlesLength(), get first 100 categories_rows = Category.sortByIdArticlesLength(id_to_category, 100); // 2. add to table, but: set checkbox .b_blacklist if it is in blacklist if (null != categories_rows && 0 < categories_rows.size()) { for(Category c:categories_rows) { CategoryRow r = new CategoryRow(); r.word = c.page_title; r.n_articles = c.getIdArticlesLength(); r.b_blacklist = category_black_list.inBlackListAlready(c.page_title); r.b_show = false; // todo?? rows.add(r); } } this.id_to_article = id_to_article; } /** 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; }*/ public void updateTable() { if (null != rows) { data = new Object[rows.size()][column_names.length]; for(int i=0; i<rows.size(); i++) { CategoryRow r = rows.get(i); data [i][0] = r.word; data [i][1] = r.n_articles; data [i][2] = r.b_blacklist; data [i][3] = r.b_show; } 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("--------------------------"); } }