/*
* ExpandCategories.java
*
* Copyright (c) 2005-2007 Andrew Krizhanovsky /aka at mail.iias.spb.su/
* Distributed under GNU Public License.
*/
package com.touchgraph.wikibrowser.contextmenu;
import wikipedia.kleinberg.*;
import wikipedia.util.StringUtil;
import com.touchgraph.wikibrowser.*;
import java.util.*;
import java.awt.Color;
/** Shows categories of article or or category.
* Implements the item "Expand categories" in Synarcher context menu */
public class ExpandCategories {
TGWikiBrowser wb;
private static SynonymSearcher ss;
private static String category_prefix = "C:";
public ExpandCategories(SynonymSearcher syn_searcher, TGWikiBrowser wb_new) {
ss = syn_searcher;
wb = wb_new;
}
/** Returns true if second character is column, e.g. "C:" */
public static boolean isCategory(String title) {
if(null == title || 3 > title.length())
return false;
// ":" is 58
return 58 == title.charAt(1);
}
public void showNeighboursCategories(String title) {
if(ss.DEBUG)
System.out.println("ExpandCategories.showNeighboursCategories, title is " + title);
if(isCategory(title)) {
forCategory(title);
} else {
forArticle(title);
}
}
/** Show neighbours category for the category.
*
* @params cat_title Category title, e.g. "C:Science"
*/
public void forCategory(String cat_title) {
WikiNode n = (WikiNode) wb.tgPanel.findNodeLabelContaining(cat_title);
if(n == null || null == ss.m_categories || null == ss.session.category_nodes)
return;
//String title = cat_title.substring(2); // strip "C:"
String title = StringUtil.getTextBeforeFirstAndSecondColumns(cat_title);
// get categories for the category
Integer id = ss.m_categories.get(title);
if(null != id) {
//System.out.println("The title is found in m_categories");
Category cat = ss.session.category_nodes.get(id);
if(null == cat || null == cat.page_title || 0 == cat.page_title.length() || null == cat.links_in)
return;
for(int id_to:cat.links_in) { // links_out: id of categories which are referred by the category
Category cat_to = ss.session.category_nodes.get(id_to);
if(null == cat_to || null == cat_to.page_title || 0 == cat_to.page_title.length())
continue;
// add category node
String _title = category_prefix + cat_to.getTitleAndIWiki();
WikiNode r = (WikiNode) wb.completeEltSet.findNode(_title);
if(r == null)
r = wb.addWikiNode(_title, Color.MAGENTA.decode("#802080"), Color.WHITE);
r.setBackColor(ss.color_node_category);
// add edge
com.touchgraph.graphlayout.Edge e;
e = wb.completeEltSet.findEdge(r,n);
if(e==null) {
e = new WikiEdge(r,n,ss.edge_dist_category_category);
e.setColor(ss.color_edge_category_category);
//e.setColor(edgeColors[linenum % edgeColors.length]);
wb.completeEltSet.addEdge(e);
r.setVisible(true);
e.setVisible(true);
}
}
}
}
/** Shows neighbours categories for the article. */
public void forArticle(String title) {
WikiNode n = (WikiNode) wb.tgPanel.findNodeLabelContaining(title);
if(n == null || null == ss.m_articles || null == ss.base_nodes)
return;
title = StringUtil.getTextBeforeFirstColumn(title);
// get categories for the article
Integer id = ss.m_articles.get(title);
if(null != id) {
Article a = ss.base_nodes.get(id);
// retrieve or take retrieved categories of the article a
if(null == a.id_categories || 0 == a.id_categories.length) {
List<String> titles_level_1_cats = new ArrayList<String>();
// let's any article will be expanded, even article with session.source_article_id
String black_cat = ss.session.category_black_list.inBlackList(id, titles_level_1_cats, -1);
if(null == titles_level_1_cats || 0 == titles_level_1_cats.size())
return;
a.id_categories = Category.getIDByTitle(ss.session.connect, titles_level_1_cats);
}
for(int id_cat:a.id_categories) {
Category c = ss.session.category_nodes.get(id_cat);
if(null == c || null == c.page_title || 0 == c.page_title.length())
continue;
// add category node
String title_cat = category_prefix + c.getTitleAndIWiki();
WikiNode r = (WikiNode) wb.completeEltSet.findNode(title_cat);
if(r == null)
r = wb.addWikiNode(title_cat, Color.WHITE, ss.color_node_category);
r.setNodeTextColor(Color.WHITE);
r.setBackColor(ss.color_node_category);
// add edge
com.touchgraph.graphlayout.Edge e;
e = wb.completeEltSet.findEdge(r,n);
if(e==null) {
e = new WikiEdge(r,n,ss.edge_dist_aritlce_category);
e.setColor(ss.color_edge_article_category);
//e.setColor(edgeColors[linenum % edgeColors.length]);
wb.completeEltSet.addEdge(e);
}
// r.setVisible(true);
// e.setVisible(true);
}
} // else Article.createArticleWithCategories() // todo
}
}