package thaw.plugins.index; import javax.swing.JButton; import javax.swing.JTextField; import javax.swing.JCheckBox; import javax.swing.JPopupMenu; import javax.swing.JDialog; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JScrollPane; import java.awt.GridLayout; import java.awt.BorderLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionEvent; import java.sql.*; import java.util.Vector; import thaw.fcp.FCPQueueManager; import thaw.fcp.FreenetURIHelper; import thaw.core.I18n; import thaw.core.Logger; import thaw.plugins.Hsqldb; public class IndexConfigDialog implements ActionListener, MouseListener, ListSelectionListener { public final static int SIZE_X = 700; public final static int SIZE_Y = 170; public final static int CATEGORY_DIALOG_SIZE_X = 400; public final static int CATEGORY_DIALOG_SIZE_Y = 400; private JDialog frame; private IndexBrowserPanel indexBrowser; private FCPQueueManager queueManager; private Hsqldb db; private Index index; private JButton okButton; private JButton cancelButton; private int formState; private JButton resetCommentsButton; private JTextField publicKeyField = null; private JTextField privateKeyField = null; private JCheckBox publishPrivateKeyBox = null; private JCheckBox allowCommentsBox = null; private JLabel categoryLabel = null; private JButton changeCategory = null; private JPopupMenu popupMenuA; private JPopupMenu popupMenuB; /** * Use it to add an already existing index (won't add it ; just get the basic values) * Various fields will be disabled (publish private key, etc). */ public IndexConfigDialog(IndexBrowserPanel indexBrowser, FCPQueueManager queueManager) { this(indexBrowser, queueManager, null); } /** * Use it to modify an existing index (will modify automagically) * @param index if index is provided, changes will be automagically set */ public IndexConfigDialog(IndexBrowserPanel indexBrowser, FCPQueueManager queueManager, Index index) { this.indexBrowser = indexBrowser; this.queueManager = queueManager; this.index = index; this.db = indexBrowser.getDb(); } public String getPublicKey() { String key = publicKeyField.getText(); if (!FreenetURIHelper.isAKey(key)) return null; return key; } public String getPrivateKey() { String key = privateKeyField.getText(); if (!FreenetURIHelper.isAKey(key)) return null; return key; } public boolean getPublishPrivateKey() { return publishPrivateKeyBox.isSelected(); } public boolean getAllowComments() { return allowCommentsBox.isSelected(); } /** * If this function return true, you can use the get[...]() function * to get the user input. * (Note: What a mess !) * @return false if the user cancelled */ public boolean promptUser() { prepareDialog(); return (showDialog()); } private void prepareDialog() { frame = new JDialog(indexBrowser.getMainWindow().getMainFrame(), I18n.getMessage("thaw.plugin.index.indexSettings")); frame.getContentPane().setLayout(new BorderLayout()); /* main elements (fields, checkboxes, etc) */ publicKeyField = new JTextField((index == null) ? "USK@" : index.getPublicKey()); privateKeyField = new JTextField((index == null) ? "SSK@" : index.getPrivateKey()); publishPrivateKeyBox = new JCheckBox(I18n.getMessage("thaw.plugin.index.publishPrivateKey"), ((index == null) ? false : index.publishPrivateKey())); publishPrivateKeyBox.setEnabled(index != null && index.getPrivateKey() != null); allowCommentsBox = new JCheckBox(I18n.getMessage("thaw.plugin.index.allowComments"), (index == null) ? false : (index.getCommentPublicKey() != null)); allowCommentsBox.setEnabled((index == null) ? false : (index.getPrivateKey() != null)); categoryLabel = new JLabel(""); resetCommentsButton = new JButton(I18n.getMessage("thaw.plugin.index.comment.reset")); resetCommentsButton.setEnabled(index != null && index.getPrivateKey() != null); resetCommentsButton.addActionListener(this); updateCategoryLabel(); changeCategory = new JButton(I18n.getMessage("thaw.plugin.index.changeCategory")); changeCategory.setEnabled(index != null && index.getPrivateKey() != null); changeCategory.addActionListener(this); /* public & private keys */ final JPanel labelPanel = new JPanel(); final JPanel textFieldPanel = new JPanel(); labelPanel.setLayout(new GridLayout(2, 1)); textFieldPanel.setLayout(new GridLayout(2, 1)); labelPanel.add(new JLabel(I18n.getMessage("thaw.plugin.index.indexKey")+ " "), BorderLayout.WEST); textFieldPanel.add(publicKeyField, BorderLayout.CENTER); popupMenuA = new JPopupMenu(); JMenuItem item = new JMenuItem(I18n.getMessage("thaw.common.paste")); popupMenuA.add(item); new thaw.gui.GUIHelper.PasteHelper(item, publicKeyField); publicKeyField.addMouseListener(this); labelPanel.add(new JLabel(I18n.getMessage("thaw.plugin.index.indexPrivateKey")+" "), BorderLayout.WEST); textFieldPanel.add(privateKeyField, BorderLayout.CENTER); popupMenuB = new JPopupMenu(); item = new JMenuItem(I18n.getMessage("thaw.common.paste")); popupMenuB.add(item); new thaw.gui.GUIHelper.PasteHelper(item, privateKeyField); privateKeyField.addMouseListener(this); frame.getContentPane().add(labelPanel, BorderLayout.WEST); frame.getContentPane().add(textFieldPanel, BorderLayout.CENTER); /** various other settings **/ final JPanel indexSettingsPanel = new JPanel(); indexSettingsPanel.setLayout(new GridLayout(4, 1)); final JPanel mainButtonPanel = new JPanel(); mainButtonPanel.setLayout(new GridLayout(1, 2)); cancelButton = new JButton(I18n.getMessage("thaw.common.cancel")); okButton = new JButton(I18n.getMessage("thaw.common.ok")); cancelButton.addActionListener(this); okButton.addActionListener(this); mainButtonPanel.add(okButton); mainButtonPanel.add(cancelButton); JPanel commentPanel = new JPanel(new BorderLayout()); commentPanel.add(allowCommentsBox, BorderLayout.CENTER); commentPanel.add(resetCommentsButton, BorderLayout.EAST); JPanel categoryPanel = new JPanel(new BorderLayout()); categoryPanel.add(categoryLabel, BorderLayout.CENTER); categoryPanel.add(changeCategory, BorderLayout.EAST); indexSettingsPanel.add(publishPrivateKeyBox); indexSettingsPanel.add(commentPanel); indexSettingsPanel.add(categoryPanel); indexSettingsPanel.add(mainButtonPanel); frame.getContentPane().add(indexSettingsPanel, BorderLayout.SOUTH); } private boolean showDialog() { /* let's rock'n'rool :p */ frame.setSize(SIZE_X, SIZE_Y); frame.setVisible(true); try { synchronized(this) { wait(); } } catch(final InterruptedException e) { /* \_o< */ } frame.setVisible(false); frame.dispose(); if (formState == 2) /* cancelled */ return false; if (index != null) { updateValues(index); } return true; } public void updateValues(Index index) { index.setPublicKey(getPublicKey()); index.setPrivateKey(getPrivateKey()); if (getPrivateKey() != null) index.setPublishPrivateKey(getPublishPrivateKey()); if (index.canHaveComments() && !getAllowComments()) { Logger.notice(this, "Purging comments ..."); index.purgeCommentKeys(); } else if (!index.canHaveComments() && getAllowComments()) { Logger.notice(this, "Purging comments & regenerating keys ..."); index.regenerateCommentKeys(queueManager); } } private JDialog categoryDialog; private JList categoryList; private JTextField categoryField; private JButton categoryOkButton; private JButton categoryCancelButton; public void updateCategoryLabel() { String cat = (index == null ? null : index.getCategory()); if (cat == null) cat = I18n.getMessage("thaw.plugin.index.categoryUnspecified"); categoryLabel.setText(I18n.getMessage("thaw.plugin.index.category") +": "+cat); } public Vector getCategories() { Vector v = new Vector(); try { synchronized(db.dbLock) { PreparedStatement st; st = db.getConnection().prepareStatement("SELECT id, name "+ "FROM categories "+ "ORDER BY name"); ResultSet set = st.executeQuery(); while(set.next()) { v.add(set.getString("name")); } st.close(); } } catch(SQLException e) { Logger.error(this, "Can't get index categories list because : "+e.toString()); } return v; } public void showCategoryDialog() { Vector cats = getCategories(); categoryDialog = new JDialog(frame, I18n.getMessage("thaw.plugin.index.category")); categoryList = new JList(cats); categoryOkButton = new JButton(I18n.getMessage("thaw.common.ok")); categoryCancelButton = new JButton(I18n.getMessage("thaw.common.cancel")); categoryField = new JTextField(""); categoryList.addListSelectionListener(this); categoryOkButton.addActionListener(this); categoryCancelButton.addActionListener(this); String cat = index.getCategory(); if (cat != null) { categoryList.setSelectedIndex(cats.indexOf(cat)); categoryField.setText(cat); } categoryDialog.getContentPane().setLayout(new BorderLayout(5, 5)); JPanel buttonPanel = new JPanel(new GridLayout(1, 2)); buttonPanel.add(categoryOkButton); buttonPanel.add(categoryCancelButton); JPanel southPanel = new JPanel(new GridLayout(2, 1)); southPanel.add(categoryField); southPanel.add(buttonPanel); categoryDialog.getContentPane().add(new JLabel(I18n.getMessage("thaw.plugin.index.categories")), BorderLayout.NORTH); categoryDialog.getContentPane().add(new JScrollPane(categoryList), BorderLayout.CENTER); categoryDialog.getContentPane().add(southPanel, BorderLayout.SOUTH); categoryDialog.setSize(CATEGORY_DIALOG_SIZE_X, CATEGORY_DIALOG_SIZE_Y); categoryDialog.setVisible(true); } public void valueChanged(ListSelectionEvent e) { categoryField.setText((String)categoryList.getSelectedValue()); } public void actionPerformed(final ActionEvent e) { if (e.getSource() == okButton) { formState = 1; synchronized(this) { notifyAll(); } return; } else if (e.getSource() == cancelButton) { formState = 2; synchronized(this) { notifyAll(); } return; } else if (e.getSource() == resetCommentsButton) { index.regenerateCommentKeys(queueManager); } else if (e.getSource() == changeCategory) { showCategoryDialog(); } else if (e.getSource() == categoryOkButton) { index.setCategory(categoryField.getText()); categoryDialog.setVisible(false); categoryDialog.dispose(); updateCategoryLabel(); } else if (e.getSource() == categoryCancelButton) { categoryDialog.setVisible(false); categoryDialog.dispose(); } } public void mouseClicked(final MouseEvent e) { } public void mouseEntered(final MouseEvent e) { } public void mouseExited(final MouseEvent e) { } public void mousePressed(final MouseEvent e) { showPopupMenu(e); } public void mouseReleased(final MouseEvent e) { showPopupMenu(e); } protected void showPopupMenu(final MouseEvent e) { if(e.isPopupTrigger()) { if (e.getComponent() == publicKeyField) popupMenuA.show(e.getComponent(), e.getX(), e.getY()); if (e.getComponent() == privateKeyField) popupMenuB.show(e.getComponent(), e.getX(), e.getY()); } } }