From 21230edbafdd30fcf0c43d1dc64ccbf4ca5e06a8 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Wed, 7 May 2014 17:33:57 +0200 Subject: Agent now extends Item, so they can have workflows. All traces of the old 'Entity' superclasses should be removed, including proxies and paths. Very large change, breaks API compatibility with CRISTAL 2.x. --- src/main/java/com/c2kernel/gui/ItemFinder.java | 222 +++++++++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 src/main/java/com/c2kernel/gui/ItemFinder.java (limited to 'src/main/java/com/c2kernel/gui/ItemFinder.java') diff --git a/src/main/java/com/c2kernel/gui/ItemFinder.java b/src/main/java/com/c2kernel/gui/ItemFinder.java new file mode 100644 index 0000000..6b1ed00 --- /dev/null +++ b/src/main/java/com/c2kernel/gui/ItemFinder.java @@ -0,0 +1,222 @@ +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; + +public class ItemFinder 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 =ImageLoader.findImage("next.png"); + mFindIcon =ImageLoader.findImage("find.png"); + } + catch (Exception e) + { + Logger.error("Couldn't load images: " + e); + } + } + + public ItemFinder() { + 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) { + nextMatch(); + } + }); + findNextButton.setEnabled(false); + add(findNextButton); + add(Box.createHorizontalStrut(15)); + + // create plugins + Logger.msg(6, "ItemFinder() - creating plugins"); + String requiredListeners = Gateway.getProperties().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"); + String searchTerm = inputField.getText(); + if (searchTerm.length() == 0) return; // don't allow null searches + + findButton.setEnabled(false); findNextButton.setEnabled(false); + MainFrame.progress.startBouncing("Searching. Please Wait"); + findNextButton.setEnabled(false); + String term = inputField.getText(); +// The following block does property searching when the field contains a colon, but that returns EntityPaths, which the tree can't handle +// int colonPos = term.indexOf(':'); +// if (colonPos > 0) +// matches = lookup.search(rootNode,term.substring(0, colonPos), term.substring(colonPos+1)); +// else + matches = lookup.search(rootNode,term); + if (!matches.hasMoreElements()) { + MainFrame.progress.stopBouncing("No results"); + currentConsumer.push(searchTerm); // for subscribers who don't care if it exists + findButton.setEnabled(true); + return; + } + MainFrame.progress.stopBouncing("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 final DomainKeyListener listener; + private final 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()); + } + } + } + +} -- cgit v1.2.3