summaryrefslogtreecommitdiff
path: root/src/main/java/org/cristalise/gui/ItemFinder.java
diff options
context:
space:
mode:
authorAndrew Branson <andrew.branson@cern.ch>2014-10-07 09:18:33 +0200
committerAndrew Branson <andrew.branson@cern.ch>2014-10-07 09:18:33 +0200
commit5e4034b5cba89460a62fa958fc78c2b85acb3d5f (patch)
treeaa8e32f014801459ad65acdf45eee70d16008fe6 /src/main/java/org/cristalise/gui/ItemFinder.java
parenta5a9d90ec6714ad6a9358c35ca7093e5868373f7 (diff)
Repackage to org.cristalise
Diffstat (limited to 'src/main/java/org/cristalise/gui/ItemFinder.java')
-rw-r--r--src/main/java/org/cristalise/gui/ItemFinder.java223
1 files changed, 223 insertions, 0 deletions
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());
+ }
+ }
+ }
+
+}