/* * DBPanel.java Input fields login/password to connect to database, * various statistics about the database: number of pages, links, ... * * Copyright (c) 2005-2007 Andrew Krizhanovsky /aka at mail.iias.spb.su/ * Distributed under GNU Public License. */ package com.touchgraph.wikibrowser.panel.db; import com.touchgraph.wikibrowser.*; import com.touchgraph.wikibrowser.panel.*; import wikipedia.sql.*; import wikipedia.util.StringUtil; import com.touchgraph.graphlayout.*; import java.awt.*; import javax.swing.*; import java.awt.event.*; /** JPanel provides fields to connect to database */ public class DBPanel extends JPanel { private TGWikiBrowser wb; private static SynonymSearcher syn_searcher; public JTextField enc_java; private JTextField enc_java_categories; public JTextField enc_ui; private JTextField enc_ui_node; public JTextField db_host; public JTextField db_name; public JTextField user_tf; public JTextField pass_tf; public JTextField wiki_url_tf; public JTextArea output; public final static int ONE_SECOND = 1000; private JProgressBar progressBar; private Timer timer; private JButton startButton; private DBLongTask task; private JTextArea taskOutput; public DBPanel (SynonymSearcher ss, TGWikiBrowser wb_new) { syn_searcher = ss; wb = wb_new; setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); // jp_db - database (db) wikipedia selection horizontal panel JPanel jp_db = new JPanel(); jp_db.setLayout(new BoxLayout(jp_db, BoxLayout.X_AXIS)); JLabel wkpd_label = new JLabel(wb.tr.getString("Wikipedia")); final JComboBox wkpd_combo = new JComboBox(wb.parameters.LANGUAGE); wkpd_combo.setSelectedIndex(wb.parameters.getSelectedLanguageIndex()); wkpd_combo.setPreferredSize(new Dimension(120,30)); wkpd_combo.setMaximumSize(new Dimension(120,30)); Action db_select = new AbstractAction() { // Listens to the combo box wikipedia (database) selector public void actionPerformed(ActionEvent e) { String s = (String)((JComboBox)e.getSource()).getSelectedItem(); wb.parameters.setLanguage(s); syn_searcher.getBrowserParameters(); syn_searcher.getArticleParameters(wb.INITIAL_NODE); syn_searcher.connectDatabase(); } }; wkpd_combo.addActionListener(db_select); wkpd_combo.setMaximumRowCount(2); jp_db.add(wkpd_label); jp_db.add(Box.createRigidArea(new Dimension(5,0))); jp_db.add(wkpd_combo); jp_db.add(Box.createRigidArea(new Dimension(5,0))); add(Box.createRigidArea(new Dimension(0,5))); add(jp_db); add(Box.createRigidArea(new Dimension(0,5))); // Encodings selection (enc_java) and read only text fields with examples of encoded text JPanel jp_enc = new JPanel(); jp_enc.setLayout(new BoxLayout(jp_enc, BoxLayout.Y_AXIS)); JPanel jp_enc1 = new JPanel(); jp_enc1.setLayout(new BoxLayout(jp_enc1, BoxLayout.X_AXIS)); JPanel jp_enc2 = new JPanel(); jp_enc2.setLayout(new BoxLayout(jp_enc2, BoxLayout.X_AXIS)); // encoding 1 row encoding from Java sources JLabel enc_java_label = new JLabel(wb.tr.getString("Program_and_categories")); enc_java = new JTextField(10); enc_java.setToolTipText(wb.tr.getString("Examples_ISO8859_1,_Cp1251,_UTF8")); enc_java_label.setDisplayedMnemonic('G'); enc_java.setFocusAccelerator('G'); enc_java.setText(wb.parameters.getEncJava()); enc_java_categories = new JTextField(10); String tooltip_encoding_result = wb.tr.getString( "If_this_field_contains_unreadable_characters_(eg_Q)_then_change_encoding_and_press_Set_to_check_result"); enc_java_categories.setToolTipText(tooltip_encoding_result); // encoding 2 row encoding from and to user interface JLabel enc_ui_label = new JLabel(wb.tr.getString("User_interface")); enc_ui = new JTextField(10); enc_ui.setToolTipText(wb.tr.getString("Examples_ISO8859_1,_Cp1251,_UTF8")); enc_ui_label.setDisplayedMnemonic('I'); enc_ui.setFocusAccelerator('I'); enc_ui.setText(wb.parameters.getEncUI()); enc_ui_node = new JTextField(10); enc_ui_node.setToolTipText(tooltip_encoding_result); // Button "Set" java encodings final JButton enc_java_button = new JButton(wb.tr.getString("Set_enc_java_button")); enc_java_button.setMnemonic(KeyEvent.VK_S); enc_java_button.setToolTipText(wb.tr.getString("Save_default_value_encoding_and_check_results")); enc_java_button.setBackground(Color.decode("#D8C0C0")); // Button "Set" user interface encodings final JButton enc_ui_button = new JButton(wb.tr.getString("Set_enc_ui_button")); enc_ui_button.setMnemonic(KeyEvent.VK_E); enc_ui_button.setToolTipText(wb.tr.getString("Save_user_interface_encoding_and_check_results")); enc_ui_button.setBackground(Color.decode("#D8C0C0")); Action set_enc_java = new AbstractAction() { // Save enc_java to wb parameters file, print decoded categories to the field enc_java_categories public void actionPerformed(ActionEvent e) { wb.parameters.setEncJava(enc_java.getText()); // 0. Get node name String article = wb.parameters.getNode(); ((SynonymPanel)(wb.synonymTextPanel)).syn_word.setText(article); // update word field (in Synonyms panel) // 1. Store / restore categories to / from .wikibrowser.server.props ParametersPanel p = (ParametersPanel)(((SynonymPanel)wb.synonymTextPanel).params_panel); syn_searcher.setBlackListCategory(StringUtil.split("|", p.categories_field.getText())); syn_searcher.setArticleParameters(); if (!article.trim().equals("") && wb.parameters.isLogEnabled()) { syn_searcher.getArticleParameters(article); // update categories field } // update test string value in Database panel enc_java_categories.setText( p.categories_field.getText()); } }; enc_java_button.addActionListener(set_enc_java); Action set_enc_ui = new AbstractAction() { // Save enc_ui to wb parameters file, print decoded articles to the field enc_ui_node public void actionPerformed(ActionEvent e) { wb.parameters.setEncUI(enc_ui.getText()); // update test string value in Database panel String article = ((SynonymPanel)(wb.synonymTextPanel)).syn_word.getText(); String article_ui = syn_searcher.session.connect.enc.EncodeToUser(article); enc_ui_node.setText(article_ui); } }; enc_ui_button.addActionListener(set_enc_ui); jp_enc1.add(Box.createRigidArea(new Dimension(5,0))); jp_enc1.add(enc_java_label); jp_enc1.add(Box.createRigidArea(new Dimension(5,0))); jp_enc1.add(enc_java); jp_enc1.add(Box.createRigidArea(new Dimension(5,0))); jp_enc1.add(enc_java_button); jp_enc1.add(Box.createRigidArea(new Dimension(5,0))); jp_enc1.add(enc_java_categories); jp_enc2.add(Box.createRigidArea(new Dimension(5,0))); jp_enc2.add(enc_ui_label); jp_enc2.add(Box.createRigidArea(new Dimension(5,0))); jp_enc2.add(enc_ui); jp_enc2.add(Box.createRigidArea(new Dimension(5,0))); jp_enc2.add(enc_ui_button); jp_enc2.add(Box.createRigidArea(new Dimension(5,0))); jp_enc2.add(enc_ui_node); jp_enc.add(jp_enc1); jp_enc.add(Box.createRigidArea(new Dimension(0,5))); jp_enc.add(jp_enc2); jp_enc.add(Box.createRigidArea(new Dimension(0,5))); jp_enc.setBorder( BorderFactory.createCompoundBorder( BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(wb.tr.getString("Character_encoding")), BorderFactory.createEmptyBorder(5,5,5,5)), jp_enc.getBorder())); add(jp_enc); add(Box.createRigidArea(new Dimension(0,5))); // *) Database host (db_host), name, user, password (pass) to connect JPanel jp_connect = new JPanel(); jp_connect.setLayout(new BoxLayout(jp_connect, BoxLayout.Y_AXIS)); JPanel jp_connect1 = new JPanel(); jp_connect1.setLayout(new BoxLayout(jp_connect1, BoxLayout.X_AXIS)); JPanel jp_connect2 = new JPanel(); jp_connect2.setLayout(new BoxLayout(jp_connect2, BoxLayout.X_AXIS)); JPanel jp_connect3 = new JPanel(); jp_connect3.setLayout(new BoxLayout(jp_connect3, BoxLayout.X_AXIS)); // connect 1 row JLabel db_host_label = new JLabel(wb.tr.getString("Host")); db_host = new JTextField(20); db_host.setToolTipText(wb.tr.getString("Wikipedia_MySQL_database_host")); db_host_label.setDisplayedMnemonic('H'); db_host.setFocusAccelerator('H'); db_host.setText(wb.parameters.getDBHost()); // connect 2 row JLabel db_name_label = new JLabel(wb.tr.getString("Database_name")); db_name = new JTextField(20); db_name.setToolTipText(wb.tr.getString("Wikipedia_MySQL_database_name")); db_name_label.setDisplayedMnemonic('M'); db_name.setFocusAccelerator('M'); db_name.setText(wb.parameters.getDBName()); // connect 3 row JLabel user_label = new JLabel(wb.tr.getString("Username")); user_tf = new JTextField(10); user_tf.setToolTipText(wb.tr.getString("MySQL_user_name")); user_label.setDisplayedMnemonic('R'); user_tf.setFocusAccelerator('R'); user_tf.setText(wb.parameters.getUser()); JLabel pass_label = new JLabel(wb.tr.getString("Password")); pass_tf = new JPasswordField(6); pass_tf.setToolTipText(wb.tr.getString("MySQL_password")); pass_label.setDisplayedMnemonic('P'); pass_tf.setFocusAccelerator('P'); pass_tf.setText(wb.parameters.getPass()); jp_connect.setBorder( BorderFactory.createCompoundBorder( BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(wb.tr.getString("MySQL_database_(DB)_connection_parameters")), BorderFactory.createEmptyBorder(5,5,5,5)), jp_connect.getBorder())); jp_connect1.add(Box.createRigidArea(new Dimension(5,0))); jp_connect1.add(db_host_label); jp_connect1.add(Box.createRigidArea(new Dimension(5,0))); jp_connect1.add(db_host); jp_connect1.add(Box.createRigidArea(new Dimension(5,0))); jp_connect2.add(Box.createRigidArea(new Dimension(5,0))); jp_connect2.add(db_name_label); jp_connect2.add(Box.createRigidArea(new Dimension(5,0))); jp_connect2.add(db_name); jp_connect2.add(Box.createRigidArea(new Dimension(5,0))); jp_connect3.add(Box.createRigidArea(new Dimension(5,0))); jp_connect3.add(user_label); jp_connect3.add(Box.createRigidArea(new Dimension(5,0))); jp_connect3.add(user_tf); jp_connect3.add(Box.createRigidArea(new Dimension(5,0))); jp_connect3.add(pass_label); jp_connect3.add(Box.createRigidArea(new Dimension(5,0))); jp_connect3.add(pass_tf); jp_connect3.add(Box.createRigidArea(new Dimension(5,0))); jp_connect.add(jp_connect1); jp_connect.add(Box.createRigidArea(new Dimension(0,5))); jp_connect.add(jp_connect2); jp_connect.add(Box.createRigidArea(new Dimension(0,5))); jp_connect.add(jp_connect3); add(jp_connect); add(Box.createRigidArea(new Dimension(0,5))); JPanel jp_url = new JPanel(); jp_url.setLayout(new BoxLayout(jp_url, BoxLayout.X_AXIS)); JLabel wiki_url_label = new JLabel(wb.tr.getString("Wiki_URL")); wiki_url_tf = new JTextField(20); wiki_url_tf.setToolTipText(wb.tr.getString("Wiki_site_prefix")); wiki_url_label.setDisplayedMnemonic('U'); wiki_url_tf.setFocusAccelerator('U'); wiki_url_tf.setText(wb.parameters.getWikiURL()); jp_url.add(Box.createRigidArea(new Dimension(5,0))); jp_url.add(wiki_url_label); jp_url.add(Box.createRigidArea(new Dimension(5,0))); jp_url.add(wiki_url_tf); jp_url.add(Box.createRigidArea(new Dimension(5,0))); add(jp_url); add(Box.createRigidArea(new Dimension(0,5))); // *) Statistics database with progress bar JPanel jp_button_and_progressbar = new JPanel(); jp_button_and_progressbar.setLayout(new BoxLayout(jp_button_and_progressbar, BoxLayout.X_AXIS)); // Button "Draw article node and neighbours" final JButton statistics_button = new JButton(wb.tr.getString("Statistics")); statistics_button.setToolTipText(wb.tr.getString("Various_database_statistics")); statistics_button.setBackground(Color.decode("#D8C0C0")); Action get_db_statistics = new AbstractAction() { // Draw synonym node, edges to l_from and l_to nodes public void actionPerformed(ActionEvent e) { Connect c = wb.syn_searcher.session.connect; statistics_button.setEnabled(false); setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); task.go(db_host.getText(), db_name.getText(), wb); timer.start(); } }; statistics_button.addActionListener(get_db_statistics); task = new DBLongTask(); statistics_button.setActionCommand("start"); // ??? progressBar = new JProgressBar(0, task.getLengthOfTask()); progressBar.setValue(0); progressBar.setStringPainted(true); jp_button_and_progressbar.add(Box.createRigidArea(new Dimension(5,0))); jp_button_and_progressbar.add(statistics_button); jp_button_and_progressbar.add(Box.createRigidArea(new Dimension(5,0))); jp_button_and_progressbar.add(progressBar); jp_button_and_progressbar.add(Box.createRigidArea(new Dimension(5,0))); add(jp_button_and_progressbar); add(Box.createRigidArea(new Dimension(0,5))); //Create a text area output = new JTextArea(); output.setFont(new Font("Serif", Font.PLAIN, 12)); output.setLineWrap(true); output.setWrapStyleWord(true); //taskOutput = new JTextArea(5, 20); //taskOutput.setMargin(new Insets(5,5,5,5)); output.setEditable(false); output.setCursor(null); //inherit the panel's cursor //see bug 4851758 JScrollPane areaScrollPane = new JScrollPane(output); areaScrollPane.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); areaScrollPane.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); areaScrollPane.setPreferredSize(new Dimension(250, 850)); areaScrollPane.setBorder( BorderFactory.createCompoundBorder( BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(wb.tr.getString("Output_db_panel")), BorderFactory.createEmptyBorder(5,5,5,5)), areaScrollPane.getBorder())); add(areaScrollPane); //Create a timer. timer = new Timer(ONE_SECOND, new ActionListener() { public void actionPerformed(ActionEvent evt) { progressBar.setValue(task.getCurrent()); String s = task.getMessage(); if (s != null) { //output.append(s + "\n"); output.setText(s + "\n"); output.setCaretPosition( output.getDocument().getLength()); } if (task.isDone()) { Toolkit.getDefaultToolkit().beep(); timer.stop(); statistics_button.setEnabled(true); setCursor(null); //turn off the wait cursor progressBar.setValue(progressBar.getMinimum()); } } }); //Tell accessibility tools about label/textfield pairs. wkpd_label.setLabelFor(wkpd_combo); enc_java_label.setLabelFor(enc_java); enc_ui_label.setLabelFor(enc_ui); db_host_label.setLabelFor(db_host); db_name_label.setLabelFor(db_name); user_label.setLabelFor(user_tf); pass_label.setLabelFor(pass_tf); wiki_url_label.setLabelFor(wiki_url_tf); } /** Called when the user presses the start button. */ /*public void actionPerformed(ActionEvent evt) { startButton.setEnabled(false); setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); task.go(); timer.start(); }*/ }