/*
* TouchGraph LLC. Apache-Style Software License
*
*
* Copyright (c) 2001-2002 Alexander Shapiro. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by
* TouchGraph LLC (http://www.touchgraph.com/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "TouchGraph" or "TouchGraph LLC" must not be used to endorse
* or promote products derived from this software without prior written
* permission. For written permission, please contact
* alex@touchgraph.com
*
* 5. Products derived from this software may not be called "TouchGraph",
* nor may "TouchGraph" appear in their name, without prior written
* permission of alex@touchgraph.com.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL TOUCHGRAPH OR ITS CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
*/
package com.touchgraph.wikibrowser;
import com.touchgraph.wikibrowser.panel.*;
import com.touchgraph.wikibrowser.panel.db.*;
import com.touchgraph.wikibrowser.parameter.*;
import com.touchgraph.wikibrowser.contextmenu.ExpandCategories;
import com.touchgraph.graphlayout.*;
import com.touchgraph.graphlayout.graphelements.GraphEltSet;
import com.touchgraph.graphlayout.interaction.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import java.applet.Applet;
import java.applet.AppletContext;
import java.net.*;
import java.awt.event.*;
import edu.stanford.ejalbert.BrowserLauncher;
import static java.util.ResourceBundle.Control.*;
/** <p><b>TGWikiBrowser:</b> Sets up the main frame, and all the components contained within.
* The TGWikiBrowser class handles all actions selected from the toolbar, as well as hyperlink
* events from the html pane.
*
* BrowserLauncher is the open source browser launcher used by the TouchGraph WikiBrowser
* Copyright 1999-2001 by Eric Albert (ejalbert@cs.stanford.edu)
* http://browserlauncher.sourceforge.net/
*
* @author Alexander Shapiro
* @version 1.02 $Id: TGWikiBrowser.java,v 1.18 2008/04/06 15:30:50 andrew Exp $
*/
public class TGWikiBrowser extends JPanel{
public TGPanel tgPanel;
TGLensSet tgLensSet;
TGUIManager tgUIManager;
public HVScroll hvScroll;
public ZoomScroll zoomScroll;
//public LocalityScroll localityScroll;
public JPopupMenu wikiPopup;
private JTextField tfSearch;
private JComboBox maxAddCombo;
private JComboBox maxExpandCombo;
private JComboBox localityRadiusCombo;
private JCheckBox showBackLinksCheckBox;
public JTextPane tpWikiText;
public String textPaneURL = null;
protected JButton statusButton;
private WikiNode nodeMOHL; //MouseOverHyperLink
public GraphEltSet completeEltSet;
private Stack browseHistory = new Stack();
public static String WIKI_URL;
public static String WIKI_FILE;
public static String INITIAL_NODE=null;
public static int INITIAL_RADIUS=-1;
public static boolean INITIAL_SHOW_BACKLINKS=false;
public SynonymSearcher syn_searcher;
public JPanel synonymTextPanel;
public JPanel dbTextPanel;
//public JPanel categoryTextPanel;
public BrowserParameters parameters;
/** (Tr)anslation i18n resource, use .getString("translate_me"). */
public ResourceBundle tr;
/** Locale defines current working language used in (tr)anslation resource. */
private static Locale _locale; // ru ru_RU en_US
/** Shows categories of article or category. */
public ExpandCategories expand_categories;
public TGWikiBrowser() {
parameters = new BrowserParameters();
/*String ss = "пїЅпїЅпїЅпїЅпїЅпїЅ";
parameters.setNode(ss);
parameters.getParameters();
String ss_new = parameters.getNode();
*/
WIKI_URL = parameters.getWikiURL();
INITIAL_NODE = parameters.getNode();
INITIAL_RADIUS = parameters.getRadius();
INITIAL_SHOW_BACKLINKS = parameters.getShowBacklinks();
syn_searcher = new SynonymSearcher(this);
expand_categories = new ExpandCategories(syn_searcher, this);
//syn_searcher.session.connect.enc.SetEncodingJavaSourceCode(parameters.getEncJava());
//tr = ResourceBundle.getBundle("com.touchgraph.wikibrowser.MessagesBundle",
tr = ResourceBundle.getBundle("translation.MessagesBundle",
_locale, ResourceBundle.Control.getControl(FORMAT_PROPERTIES));
//System.out.println("Test ResourceBundle: _locale="+_locale+", 'Search' translation is '" + tr.getString("Search")+"'");
//public static final Font SMALL_TAG_FONT = new Font("Times",Font.PLAIN,9);
WikiNode.setNodeTextFont(new Font("Times",Font.PLAIN,12));
completeEltSet = new GraphEltSet();
tgPanel = new TGPanel();
tgPanel.setGraphEltSet(completeEltSet);
tgLensSet = new TGLensSet();
hvScroll = new HVScroll(tgPanel, tgLensSet);
zoomScroll = new ZoomScroll(tgPanel);
//localityScroll = new LocalityScroll(tgPanel);
buildPanel(); // calls syn_searcher.getBrowserParameters();
buildLens();
tgPanel.setLensSet(tgLensSet);
addUIs();
setVisible(true);
WikiNode.setNodeBackDefaultColor(Color.decode("#A03000"));
zoomScroll.setZoomValue(4);
{
syn_searcher.connectDatabase();
if(null == syn_searcher.session.connect.conn) {
System.out.println("Database is not available. connectDatabase(): syn_searcher.connect.conn is "+syn_searcher.session.connect.conn);
System.exit(0);
}
//syn_searcher.initSession();
syn_searcher.getWikiOneNode(INITIAL_NODE);
//syn_searcher.getWikiGraphFromDB(INITIAL_NODE);
//String article = "Орбита"; //syn_searcher.getWikiGraphFromDB("Орбита");
//getWikiGraph();
}
if(INITIAL_RADIUS>=0 && INITIAL_RADIUS<=6)
localityRadiusCombo.setSelectedIndex(INITIAL_RADIUS);
if(INITIAL_SHOW_BACKLINKS)
showBackLinksCheckBox.setSelected(INITIAL_SHOW_BACKLINKS);
WikiNode initialNode;
if (INITIAL_NODE==null)
initialNode = (WikiNode) completeEltSet.getFirstNode();
else
initialNode = (WikiNode) completeEltSet.findNodeLabelContaining(INITIAL_NODE);
if(initialNode==null) initialNode = (WikiNode) completeEltSet.getFirstNode();
tgPanel.setSelect(initialNode);
setLocale(initialNode);
tgPanel.fastFinishAnimation();
setWikiTextPane(initialNode);
tgPanel.resetDamper();
//localityScroll.setLocalityRadius(3);
//localityScroll.getLocalitySB().setMaximum(6);
}
private String generateNodeLabel(String labelOrUrl) {
if(!labelOrUrl.startsWith("http://")) {
return labelOrUrl; //It's a label
}
else { // Create a label from the URL
String urlString = labelOrUrl;
if (urlString.length()<25 && !labelOrUrl.startsWith(WIKI_URL)) {
String str = urlString.substring(urlString.indexOf("//")+2);
if (str.length()>40) str = str.substring(0,40);
return str;
}
if (urlString.indexOf("?")>-1) {
return urlString.substring(urlString.indexOf("?")+1);
}
if (urlString.lastIndexOf("/")!=urlString.length()-1) {
return urlString.substring(urlString.lastIndexOf("/")+1);
}
return urlString.substring(urlString.lastIndexOf("/",urlString.length()-2)+1,urlString.length()-1);
}
}
private WikiNode addWikiNode(String str) {
WikiNode n;
n = new WikiNode(generateNodeLabel(str));
if (!str.startsWith("http://")) {
n.setURL(WIKI_URL + str);
//n.setURL(WIKI_URL + wikipedia.util.Encodings.FromTo(str, "UTF8", "Cp1251"));
}
else {
n.setURL(str);
n.setBackColor(Color.decode("#802080"));
}
try {
completeEltSet.addNode(n);
}
catch(TGException tge) { tge.printStackTrace(); }
return n;
}
/** Adds node with 'label' (color 'c_text') with background (color 'c_back'). */
public WikiNode addWikiNode(String label,Color c_text, Color c_back) {
WikiNode n;
n = new WikiNode(generateNodeLabel(label));
if (!label.startsWith("http://")) {
n.setURL(WIKI_URL + label);
}
else {
n.setURL(label);
n.setNodeTextColor(c_text);
n.setBackColor(c_back);
}
try {
completeEltSet.addNode(n);
}
catch(TGException tge) { tge.printStackTrace(); }
return n;
}
public void getWikiGraph() throws TGException {
//Color edgeColors[]={ Color.blue, Color.black, new Color(0,216,0), new Color(64,64,216), new Color(128,0,128), new Color(96,96,96), new Color(0,128,128)};
String line = "";
try
{
BufferedReader bdbReader;
if(WIKI_FILE.startsWith("http://")) {
URLConnection wfConn = (new URL(WIKI_FILE)).openConnection();
SFSInputStream sfsInputStream =
new SFSInputStream(wfConn.getInputStream(), wfConn.getContentLength());
bdbReader = new BufferedReader(new InputStreamReader(sfsInputStream));
}
else {
bdbReader = new BufferedReader(new FileReader(WIKI_FILE));
}
int linenum=0;
while(line != null)
{
linenum++;
if (linenum%100==0) System.out.println(linenum);
line = bdbReader.readLine();
if(line == null || line.trim().length()==0) {continue;}
StringTokenizer st = new StringTokenizer(line);
String firststr= st.nextToken();
WikiNode r = (WikiNode) completeEltSet.findNode(generateNodeLabel(firststr));
if(r == null) {
r = addWikiNode(firststr);
}
//r.setBackColor(edgeColors[linenum % edgeColors.length]);
WikiNode m = null;
int midCount = 2;
if (line.indexOf("|")>-1) {
//Color edgeColor =edgeColors[linenum % edgeColors.length];
m = new WikiNode("1");
completeEltSet.addNode(m);
//m.setBackColor(edgeColor);
Edge e = new WikiEdge(r,m,20);
//e.setColor(edgeColor);
completeEltSet.addEdge(e);
}
while (st.hasMoreTokens()) {
String secondstr="";
try {
secondstr = st.nextToken();
}
catch (NoSuchElementException nsee) {
nsee.printStackTrace();
continue;
}
if (secondstr.equals("|")) {
//Color edgeColor =edgeColors[linenum % edgeColors.length];
m = new WikiNode(""+midCount);
completeEltSet.addNode(m);
midCount++;
//m.setBackColor(edgeColor);
WikiEdge e = new WikiEdge(r,m,20);
//e.setColor(edgeColor);
completeEltSet.addEdge(e);
continue;
}
WikiNode n = (WikiNode) completeEltSet.findNode(generateNodeLabel(secondstr));
if(n == null)
{
n = addWikiNode(secondstr);
}
if(m!=null) {
Edge e;
e = completeEltSet.findEdge(m,n);
if(e==null) {
e = new WikiEdge(m,n,40);
//e.setColor(edgeColors[linenum % edgeColors.length]);
completeEltSet.addEdge(e);
}
//Edge e2 = completeEltSet.findEdge(r,n);
//if(e2==null) {
// e2 = new WikiEdge(r,n,1000);
// completeEltSet.addEdge(e2);
//}
}
else {
Edge e;
e = completeEltSet.findEdge(r,n);
if(e==null) {
e = new WikiEdge(r,n,40);
//e.setColor(edgeColors[linenum % edgeColors.length]);
completeEltSet.addEdge(e);
}
}
}
}
}
catch(IOException exc)
{
exc.printStackTrace();
}
Iterator edgeIterator = completeEltSet.getEdges();
while(edgeIterator!=null && edgeIterator.hasNext()) {
WikiEdge e = (WikiEdge) edgeIterator.next();
e.setLength(10+(e.from.edgeCount() + e.to.edgeCount())+(e.from.edgeCount() * e.to.edgeCount())/5);
}
System.out.println("Nodes: " +completeEltSet.nodeCount());
System.out.println("Edges: " +completeEltSet.edgeCount());
}
TGWikiBrowser(JFrame f) {
this();
}
public TGPanel getTGPanel() {
return tgPanel;
}
public URL getDocumentBase() {
return null;
}
class HorizontalStretchLens extends TGAbstractLens {
protected void applyLens(TGPoint2D p) { p.x=p.x*1.5; }
protected void undoLens(TGPoint2D p) { p.x=p.x/1.5; }
}
private void buildLens() {
tgLensSet.addLens(hvScroll.getLens());
tgLensSet.addLens(zoomScroll.getLens());
tgLensSet.addLens(new HorizontalStretchLens());
tgLensSet.addLens(tgPanel.getAdjustOriginLens());
}
private void buildPanel() {
final JScrollBar horizontalSB = hvScroll.getHorizontalSB();
final JScrollBar verticalSB = hvScroll.getVerticalSB();
final JScrollBar zoomSB = zoomScroll.getZoomSB();
//final JScrollBar localitySB = localityScroll.getLocalitySB();
setLayout(new BorderLayout());
ToolTipManager.sharedInstance().setInitialDelay(0);
JPanel scrollPanel = new JPanel();
scrollPanel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
final JPanel topPanel = new JPanel();
topPanel.setLayout(new GridBagLayout());
c.fill=GridBagConstraints.HORIZONTAL;
c.gridx=0;c.weightx=0;c.insets = new Insets(0,5,0,10);
JButton backButton = new BackButton();
backButton.setToolTipText(
tr.getString("Go_back_to_previous_page_/_previously_selected_node"));
backButton.setBackground(Color.decode("#C0C0D8"));
topPanel.add(backButton,c);
c.gridx=1;c.weightx=0;c.insets = new Insets(0,0,0,0);
topPanel.add(new Label(
tr.getString("Search"),
Label.RIGHT), c);
c.gridx=2;c.weightx=0.25; c.insets=new Insets(0,0,0,0);
tfSearch = new JTextField();
tfSearch.setToolTipText(
tr.getString("Press_enter_to_find_node_label_containing_substring"));
topPanel.add(tfSearch,c);
Action findAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
String searchString = tfSearch.getText();
if (!searchString.trim().equals("")) {
WikiNode foundNode = (WikiNode) tgPanel.findNodeLabelContaining(searchString);
if (foundNode!=null) {
setLocale(foundNode);
tgPanel.setSelect(foundNode);
setWikiTextPane(foundNode);
}
}
}
};
tfSearch.addActionListener(findAction);
maxAddCombo = new JComboBox(new String[] {"25","30","35","40","50","60","100","200"});
maxExpandCombo = new JComboBox(new String[] {"10","15","20","25","30","40","50","70","100"});
localityRadiusCombo = new JComboBox(new String[] {"0","1","2","3","4","5","6"});
maxAddCombo.setSelectedIndex(0);
maxExpandCombo.setSelectedIndex(0);
localityRadiusCombo.setSelectedIndex(2);
maxAddCombo.setToolTipText(tr.getString("Don't_show_nodes_with_more_E#_of_edges"));
maxExpandCombo.setToolTipText(tr.getString("Don't_expand_nodes_with_more_then_E#_of_edges"));
localityRadiusCombo.setToolTipText(tr.getString("Show_nodes_reachable_by_following_Radius#_edges"));
showBackLinksCheckBox = new JCheckBox(tr.getString("Show_BackLinks"),false);
showBackLinksCheckBox.setHorizontalTextPosition(SwingConstants.LEFT);
showBackLinksCheckBox.setHorizontalAlignment(SwingConstants.CENTER);
showBackLinksCheckBox.setToolTipText(
tr.getString("BackLinks_are_hyperlinks_on_pages_linking_To_the_selected_page"));
ActionListener setLocaleAL = new ActionListener() {
public void actionPerformed(ActionEvent e) {
setLocale(tgPanel.getSelect());
parameters.setRadius(Integer.parseInt((String) localityRadiusCombo.getSelectedItem()));
}
};
maxAddCombo.addActionListener(setLocaleAL);
maxExpandCombo.addActionListener(setLocaleAL);
localityRadiusCombo.addActionListener(setLocaleAL);
showBackLinksCheckBox.addActionListener(setLocaleAL);
maxAddCombo.setPreferredSize(new Dimension(50,20));
maxExpandCombo.setPreferredSize(new Dimension(50,20));
localityRadiusCombo.setPreferredSize(new Dimension(50,20));
showBackLinksCheckBox.setPreferredSize(new Dimension(150,20));
c.gridx=4;c.weightx=0;
topPanel.add(new Label(tr.getString("Show_E#"),Label.RIGHT), c);
c.gridx=5;c.weightx=0; c.insets=new Insets(0,0,0,0);
topPanel.add(maxAddCombo,c);
c.gridx=6;c.weightx=0;
topPanel.add(new Label(tr.getString("Expand_E#"),Label.RIGHT), c);
c.gridx=7;c.weightx=0;
topPanel.add(maxExpandCombo,c);
c.gridx=8;c.weightx=0;
topPanel.add(new Label(tr.getString("Radius"),Label.RIGHT), c);
c.gridx=9;c.weightx=0;
topPanel.add(localityRadiusCombo,c);
c.gridx=10;c.weightx=0;
topPanel.add(showBackLinksCheckBox,c);
c.gridx=11;c.weightx=0;
topPanel.add(new Label(tr.getString("Zoom"),Label.RIGHT), c);
c.gridx=12;c.weightx=0.5;
c.insets=new Insets(0,0,0,5);
topPanel.add(zoomSB,c);
c.insets = new Insets(0,0,0,4);
JButton stopButton = new JButton(tr.getString("Stop"));
stopButton.setToolTipText(tr.getString("Stop_graph_motion,_click_twice_to_stop_all_motion"));
stopButton.setBackground(Color.decode("#D8C0C0"));
stopButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tgPanel.stopMotion();
tgPanel.fastFinishAnimation();
}
});
stopButton.setPreferredSize(new Dimension(60,20));
stopButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
c.gridx=13;c.weightx=0;
topPanel.add(stopButton, c);
c.insets = new Insets(0,0,0,17);
JButton helpButton = new JButton("?");
helpButton.setToolTipText(tr.getString("Help"));
helpButton.setBackground(Color.decode("#F0F0C0"));
helpButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
tpWikiText.setPage(new File("docs/quick_instructions.html").toURI().toURL());
}
catch (Exception ex) { ex.printStackTrace(); }
}
});
helpButton.setPreferredSize(new Dimension(20,20));
helpButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
c.gridx=14;c.weightx=0;
topPanel.add(helpButton, c);
c.insets=new Insets(0,0,0,0);
add(topPanel, BorderLayout.NORTH);
JSplitPane jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
c.fill = GridBagConstraints.BOTH;
c.gridwidth = 1;
c.gridx = 0; c.gridy = 1; c.weightx = 1; c.weighty = 1;
scrollPanel.add(tgPanel,c);
c.gridx = 1; c.gridy = 1; c.weightx = 0; c.weighty = 0;
scrollPanel.add(verticalSB,c);
c.gridx = 0; c.gridy = 2;
scrollPanel.add(horizontalSB,c);
jsp.setRightComponent(scrollPanel);
JPanel wikiTextPanel = new JPanel();
wikiTextPanel.setLayout(new BorderLayout());
tpWikiText = new JTextPane();
tpWikiText.setEditable(false);
tpWikiText.addHyperlinkListener(new HyperlinkListener() {
public void hyperlinkUpdate(HyperlinkEvent e) {
processHyperlinkEvent(e);
}
});
tpWikiText.setEditorKit(new HTMLEditorKit());
JScrollPane spWikiText = new JScrollPane(tpWikiText);
spWikiText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
statusButton = new JButton(new AbstractAction() {
public void actionPerformed(ActionEvent e) {
try { BrowserLauncher.openURL(textPaneURL); }
catch (Exception ex) { ex.printStackTrace(); }
}
}
);
statusButton.setToolTipText("Click to show page in external browser");
statusButton.setHorizontalAlignment(SwingConstants.LEFT);
statusButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
statusButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
wikiTextPanel.add(spWikiText,BorderLayout.CENTER);
wikiTextPanel.add(statusButton,BorderLayout.SOUTH);
wikiTextPanel.setPreferredSize(new Dimension(400,100));
JTabbedPane wikiTabbedPane = new JTabbedPane();
synonymTextPanel = new SynonymPanel(syn_searcher, this);
dbTextPanel = new DBPanel(syn_searcher, this);
//categoryTextPanel= new CategoryPanel(syn_searcher, this);
wikiTabbedPane.addTab(tr.getString("Article"), null, wikiTextPanel, tr.getString("Article_desc"));
wikiTabbedPane.setMnemonicAt(0, KeyEvent.VK_A);
wikiTabbedPane.addTab(tr.getString("Database"), dbTextPanel);
wikiTabbedPane.setMnemonicAt(1, KeyEvent.VK_D);
wikiTabbedPane.addTab(tr.getString("Synonyms"), synonymTextPanel);
wikiTabbedPane.setMnemonicAt(2, KeyEvent.VK_Y);
//wikiTabbedPane.addTab("Categories", categoryTextPanel);
syn_searcher.init(this);
syn_searcher.getBrowserParameters();
syn_searcher.getArticleParameters(INITIAL_NODE);
//jsp.setLeftComponent(wikiTextPanel);
jsp.setLeftComponent(wikiTabbedPane);
jsp.setDividerLocation(350);
jsp.setOneTouchExpandable(true);
add(jsp,BorderLayout.CENTER);
wikiPopup = new JPopupMenu();
JMenuItem menuItem = new JMenuItem("Toggle Controls");
ActionListener toggleControlsAction = new ActionListener() {
boolean controlsVisible = true;
public void actionPerformed(ActionEvent e) {
controlsVisible = !controlsVisible;
horizontalSB.setVisible(controlsVisible);
verticalSB.setVisible(controlsVisible);
topPanel.setVisible(controlsVisible);
}
};
menuItem.addActionListener(toggleControlsAction);
wikiPopup.add(menuItem);
}
private void addUIs() {
tgUIManager = new TGUIManager();
WikiNavigateUI navigateUI = new WikiNavigateUI(this);
tgUIManager.addUI(navigateUI,"Navigate");
tgUIManager.activate("Navigate");
}
public void setLocale(Node n) {
try {
if(maxAddCombo!=null && maxExpandCombo!=null) {
int localityRadius = Integer.parseInt((String) localityRadiusCombo.getSelectedItem());
int maxAddEdgeCount = Integer.parseInt((String) maxAddCombo.getSelectedItem());
int maxExpandEdgeCount = Integer.parseInt((String) maxExpandCombo.getSelectedItem());
boolean unidirectional = !showBackLinksCheckBox.isSelected();
tgPanel.setLocale(n,localityRadius,maxAddEdgeCount,maxExpandEdgeCount,unidirectional);
}
}
catch (TGException tge) { tge.printStackTrace(); }
}
public void setWikiTextPane(String url) {
textPaneURL = url;
new Thread() {
public void run() {
try {
tpWikiText.setPage(new URL(textPaneURL));
statusButton.setText(textPaneURL);
}
catch (Exception ex) { ex.printStackTrace(); }
}
}.start();
}
public void setWikiTextPane(WikiNode n) {
if(n.getURL()==null || n.getURL().trim().equals("")) return;
//System.out.println(n.getID());
browseHistory.push(n.getID());
setWikiTextPane(n.getURL());
// select row in the list of synonyms for the active node in visual graph
syn_searcher.syn_table.scrollToRow(n.getID());
}
private class BackButton extends JButton {
BackButton() {
super(tr.getString("lt_Back")); //"< Back" "< Пред"
setPreferredSize(new Dimension(80,20));
setMargin(new java.awt.Insets(2, 0, 2, 0));
this.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(browseHistory.size()>1) {
try {
browseHistory.pop();
String nodeId = (String) browseHistory.peek();
//System.out.println(nodeId);
WikiNode n = (WikiNode) tgPanel.findNode(nodeId);
//tgPanel.setSelect(n);
processURL(new URL(n.getURL()));
// Counteract the previous node being pushed as the next node
browseHistory.pop();
}
catch (Exception ex) { ex.printStackTrace(); }
}
}
});
}
}
WikiNode findNodeByLabel(String label) {
WikiNode foundNode = null;
Collection foundNodes = tgPanel.findNodesByLabel(label);
if (foundNodes!=null && !foundNodes.isEmpty()) {
foundNode = (WikiNode) foundNodes.iterator().next();
}
return foundNode;
}
/** Called by WikiNodeHintUI when the user clicks a link. */
public void processURL(URL url) {
String urlString = url.toString();
//String nodeName=urlString.substring(urlString.indexOf("?")+1,urlString.length());
String nodeName = generateNodeLabel(urlString);
System.out.println(nodeName);
WikiNode n = findNodeByLabel(nodeName);
if (n!=null) {
if(!n.isVisible()) {
if(n.edgeCount()<100) {
setLocale(n);
}
else {
try {
tgPanel.setLocale(n,0);
}
catch (TGException tge) {}
}
}
tgPanel.setSelect(n);
setWikiTextPane(n);
}
else {
setWikiTextPane(urlString);
}
}
public void processHyperlinkEvent(HyperlinkEvent hyperlinkEvent) {
URL url = hyperlinkEvent.getURL();
if (hyperlinkEvent.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
processURL(url);
return;
}
if(hyperlinkEvent.getEventType()==HyperlinkEvent.EventType.ENTERED) {
String urlString = url.toString();
String nodeName=generateNodeLabel(urlString);
WikiNode n = findNodeByLabel(nodeName);
if (n!=null) {
if(n.isVisible()) {
n.setMouseOverHyperlink(true);
nodeMOHL = n;
tgPanel.repaint();
}
statusButton.setText("IN GRAPH: "+nodeName + " ("+n.edgeCount()+")");
if (n.edgeCount()>50) {
statusButton.setForeground(Color.red);
} else {
statusButton.setForeground(Color.black);
}
}
else {
statusButton.setText(urlString);
}
}
else {
statusButton.setText(textPaneURL);
statusButton.setForeground(Color.black);
if(nodeMOHL!=null) {
nodeMOHL.setMouseOverHyperlink(false);
nodeMOHL = null;
tgPanel.repaint();
}
}
}
public static void main(String[] args) {
JFrame wikiFrame;
if(args.length != 1) {
System.out.println("USAGE:");
System.out.println("TGWikiBrowser LANGUAGE");
//System.out.println("TGWikiBrowser DATA_FILE(str)|DATA_URL(str) WIKI_URL(str) [INITAL_NODE(str) [LOCALITY_RADIUS(int) [SHOW_BACKLINKS(true/false)]]]");
System.out.println("EXAMPLES:");
System.out.println("TGWikiBrowser en");
System.out.println("TGWikiBrowser ru");
//System.out.println("TGWikiBrowser meatball.txt http://www.usemod.com/cgi-bin/mb.pl? hypermedium 2 false");
//System.out.println("TGWikiBrowser http://www.touchgraph.com/meatball.txt http://www.usemod.com/cgi-bin/mb.pl? hypermedium 2 false");
System.exit(0);
}
//System.out.println("args[0] (language en, or ru) is "+args[0]);
TGWikiBrowser._locale = new Locale(args[0]);
/*
TGWikiBrowser.WIKI_FILE=args[0];
TGWikiBrowser.WIKI_URL=args[1];
if (args.length>2) TGWikiBrowser.INITIAL_NODE=args[2];
if (args.length>3) TGWikiBrowser.INITIAL_RADIUS=Integer.parseInt(args[3]);
if (args.length>4) TGWikiBrowser.INITIAL_SHOW_BACKLINKS=new Boolean(args[4]).booleanValue();
*/
wikiFrame = new JFrame("Synarcher 0.12.5 - Synonym searcher");
TGWikiBrowser wikiPanel = new TGWikiBrowser(wikiFrame);
wikiFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});
wikiFrame.getContentPane().add("Center", wikiPanel);
//wikiFrame.setSize(1024,768);
wikiFrame.setSize(720,576); // just for screencasting
wikiFrame.setVisible(true);
}
}