From 5e4034b5cba89460a62fa958fc78c2b85acb3d5f Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Tue, 7 Oct 2014 09:18:33 +0200 Subject: Repackage to org.cristalise --- src/main/java/org/cristalise/gui/ItemFinder.java | 223 +++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 src/main/java/org/cristalise/gui/ItemFinder.java (limited to 'src/main/java/org/cristalise/gui/ItemFinder.java') diff --git a/src/main/java/org/cristalise/gui/ItemFinder.java b/src/main/java/org/cristalise/gui/ItemFinder.java new file mode 100644 index 0000000..04f5bcf --- /dev/null +++ b/src/main/java/org/cristalise/gui/ItemFinder.java @@ -0,0 +1,223 @@ +package org.cristalise.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.Iterator; +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 org.cristalise.kernel.lookup.DomainPath; +import org.cristalise.kernel.lookup.Lookup; +import org.cristalise.kernel.lookup.Path; +import org.cristalise.kernel.process.Gateway; +import org.cristalise.kernel.utils.Language; +import org.cristalise.kernel.utils.Logger; + + +public class ItemFinder extends Box implements Runnable { + JTextField inputField; + JButton findButton; + JButton findNextButton; + GridBagLayout gridbag = new GridBagLayout(); + Lookup lookup = Gateway.getLookup(); + DomainKeyConsumer defaultConsumer = null; + DomainKeyConsumer currentConsumer = null; + Iterator 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().getString("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.hasNext()) { + 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.next(); + 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.hasNext()) 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