package com.c2kernel.gui; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.IOException; import java.util.Enumeration; import java.util.StringTokenizer; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextField; import javax.swing.JToggleButton; import com.c2kernel.lookup.DomainPath; import com.c2kernel.lookup.LDAPLookup; import com.c2kernel.lookup.Path; import com.c2kernel.process.Gateway; import com.c2kernel.utils.Language; import com.c2kernel.utils.Logger; import com.c2kernel.utils.Resource; public class EntityFinder extends Box implements Runnable { JTextField inputField; JButton findButton; JButton findNextButton; GridBagLayout gridbag = new GridBagLayout(); LDAPLookup lookup = Gateway.getLDAPLookup(); DomainKeyConsumer defaultConsumer = null; DomainKeyConsumer currentConsumer = null; Enumeration matches; Path rootNode = MainFrame.userNode.getPath(); static protected ImageIcon mFindIcon = null; static protected ImageIcon mNextIcon = null; static { try { mNextIcon =Resource.getImageResource("next.png"); mFindIcon =Resource.getImageResource("find.png"); } catch (Exception e) { Logger.error("Couldn't load images: " + e); } } public EntityFinder() { super(BoxLayout.X_AXIS); initPanel(); } public void pushNewKey(String key) { inputField.setText(key); runSearch(); } public void setDefaultConsumer(DomainKeyConsumer newConsumer) { defaultConsumer = newConsumer; currentConsumer = newConsumer; } public void setConsumer(DomainKeyConsumer newConsumer, String label) { currentConsumer = newConsumer; findButton.setText(label); } public void clearConsumer(DomainKeyConsumer oldConsumer) { if (currentConsumer == oldConsumer) { currentConsumer = defaultConsumer; findButton.setText(""); } } private void initPanel() { JLabel search = new JLabel(" "+Language.translate("Search")+":"); add(search); add(Box.createHorizontalStrut(7)); inputField = new JTextField(20); add(inputField); add(Box.createHorizontalStrut(5)); inputField.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { pushNewKey(inputField.getText()); } }); findButton = new JButton(mFindIcon);//(Language.translate("Find")); findButton.setMargin(new Insets(2, 5, 2, 5)); findButton.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { pushNewKey(inputField.getText()); } }); add(findButton); add(Box.createHorizontalStrut(5)); findNextButton = new JButton(mNextIcon);//(Language.translate("Next")); findNextButton.setMargin(new Insets(2, 5, 2, 5)); findNextButton.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { MainFrame.status.setText("Navigating to next match"); nextMatch(); } }); findNextButton.setEnabled(false); add(findNextButton); add(Box.createHorizontalStrut(15)); // create plugins Logger.msg(6, "ItemFinder() - creating plugins"); String requiredListeners = Gateway.getProperty("DomainKeyListeners"); if (requiredListeners != null) { StringTokenizer tok = new StringTokenizer(requiredListeners, ","); while (tok.hasMoreTokens()) { String listenerName = tok.nextToken(); Logger.msg(6, "ItemFinder() - creating a " + listenerName); try { Class listenerClass = Class.forName(listenerName); DomainKeyListener newListener = (DomainKeyListener)listenerClass.newInstance(); newListener.init(); newListener.setConsumer(this); JToggleButton listenerButton = new JToggleButton(newListener.getIcon(), false); listenerButton.addItemListener(new ListenerButtonListener(newListener, listenerButton)); listenerButton.setMargin(new Insets(0, 2, 0, 2)); listenerButton.setToolTipText("Enable "+newListener.getDescription()); add(listenerButton); add(Box.createHorizontalStrut(7)); } catch (Exception e) { Logger.error("ItemFinder() - could not create a "+listenerName+": "+e); } } add(Box.createHorizontalGlue()); } } private void runSearch() { Thread searcher = new Thread(this); searcher.start(); } @Override public void run() { Thread.currentThread().setName("Entity Search"); MainFrame.status.setText("Searching. Please Wait"); findButton.setEnabled(false); findNextButton.setEnabled(false); String searchTerm = inputField.getText(); if (searchTerm.length() == 0) return; // don't allow null searches findNextButton.setEnabled(false); matches = lookup.search(rootNode,inputField.getText()); if (!matches.hasMoreElements()) { MainFrame.status.setText("No results"); currentConsumer.push(searchTerm); // for subscribers who don't care if it exists findButton.setEnabled(true); return; } MainFrame.status.setText("Selecting first match."); nextMatch(); } void nextMatch() { findButton.setEnabled(false); findNextButton.setEnabled(false); DomainPath nextMatch = (DomainPath)matches.nextElement(); try { currentConsumer.push(nextMatch); } catch (NullPointerException e) { //case the item searched is not found ! } findButton.setEnabled(true); findNextButton.setToolTipText("Click to show next match"); if (matches.hasMoreElements()) findNextButton.setEnabled(true); } private class ListenerButtonListener implements ItemListener { private DomainKeyListener listener; private JToggleButton listenerButton; public ListenerButtonListener(DomainKeyListener newListener, JToggleButton listenerButton) { this.listener = newListener; this.listenerButton = listenerButton; } @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { // Switch on try { if (!(listener.enable())) listenerButton.doClick(); // allow plugins to disable themselves } catch (IOException ex) { JOptionPane.showMessageDialog(null, ex.getMessage(), "Error initialising "+listener.getDescription(), JOptionPane.ERROR_MESSAGE); listenerButton.doClick(); } listenerButton.setToolTipText("Disable "+listener.getDescription()); } else { // Switch off listener.disable(); listenerButton.setToolTipText("Enable "+listener.getDescription()); } } } }