import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; /** * JTestEmbWindow.java * * Title: JTestEmbFril * * Description: * Tutorial example based on test_emb.c in the Fril Foreign Language Interface manual. * Low level interface functions are used to pass queries to the embedded Fril. The queries * are * (append X Y (apples bananas cherries)) which is resatsifiable * (reverse (1 3.14159 Pi) X) * ( ) where and are user-supplied constants. * Each query is set by clicking on a button; the goal can then be examined using the "show" * button or executed. * * @author T. P. Martin * @date June 2001 * @version 1.0b1 */ public class JTestEmbWindow extends javax.swing.JFrame { private static JFril theFril; private static boolean frilStatus = false; private static final String THISCLASS = "JTestEmbWindow::"; // BEGIN GUI CODE // member declarations javax.swing.JButton jQuitButton = new javax.swing.JButton(); javax.swing.JButton jAppendButton = new javax.swing.JButton(); javax.swing.JButton jReverseButton = new javax.swing.JButton(); javax.swing.JButton jOtherQueryButton = new javax.swing.JButton(); javax.swing.JButton jRunButton = new javax.swing.JButton(); javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane(); javax.swing.JTextArea jFrilTextOutput = new javax.swing.JTextArea(); javax.swing.JTextField jPredicateText = new javax.swing.JTextField(); javax.swing.JTextField jArgumentText = new javax.swing.JTextField(); javax.swing.JButton jShowButton = new javax.swing.JButton(); javax.swing.JButton jClearButton = new javax.swing.JButton(); javax.swing.JPanel jPanel1 = new javax.swing.JPanel(); javax.swing.JCheckBox jClearCheckBox = new javax.swing.JCheckBox(); javax.swing.JScrollPane jScrollPane2 = new javax.swing.JScrollPane(); javax.swing.JTextArea jInputTextArea = new javax.swing.JTextArea(); // END GUI CODE // initialisation - create a JFril and ask it to load the file "lists.frl". // If it's not there, public JTestEmbWindow() { FrilWriter out = new FrilWriter(jFrilTextOutput); theFril = new JFril(out); if (theFril == null) { jFrilTextOutput.append("\n Couldn't startup Fril\n"); } else { frilStatus = true; jFrilTextOutput.append("embedded Fril library version " + theFril.jFrilGetVersion() + " loaded\n"); if (theFril.jFrilExecuteFril("load lists") == 1) // load Fril source for append/reverse jFrilTextOutput.append("\n Fril source file loaded\n"); else jFrilTextOutput.append("\n Fril source file not loaded - queries may not work\n"); } } public void initComponents() throws Exception { // BEGIN GUI INITIALISATION CODE // the following code sets the frame's initial state jQuitButton.setText("Quit"); jQuitButton.setLocation(new java.awt.Point(250, 290)); jQuitButton.setVisible(true); jQuitButton.setToolTipText("exit the demo"); jQuitButton.setSize(new java.awt.Dimension(90, 30)); jAppendButton.setText("append"); jAppendButton.setLocation(new java.awt.Point(10, 210)); jAppendButton.setVisible(true); jAppendButton.setToolTipText("chooses the \"append\" query"); jAppendButton.setSize(new java.awt.Dimension(150, 20)); jReverseButton.setText("reverse"); jReverseButton.setLocation(new java.awt.Point(10, 230)); jReverseButton.setVisible(true); jReverseButton.setToolTipText("chooses the \"reverse\" query"); jReverseButton.setSize(new java.awt.Dimension(150, 20)); jOtherQueryButton.setText("Other query"); jOtherQueryButton.setLocation(new java.awt.Point(10, 250)); jOtherQueryButton.setVisible(true); jOtherQueryButton.setToolTipText("enter a predicate and argument on the right"); jOtherQueryButton.setSize(new java.awt.Dimension(150, 20)); jOtherQueryButton.setSelected(true); jRunButton.setText("Run"); jRunButton.setLocation(new java.awt.Point(10, 290)); jRunButton.setVisible(true); jRunButton.setToolTipText("runs the query selected by the buttons above"); jRunButton.setSize(new java.awt.Dimension(100, 30)); jPredicateText.setLocation(new java.awt.Point(170, 220)); jPredicateText.setVisible(true); jPredicateText.setToolTipText("type the name of a Fril predicate"); jPredicateText.setSize(new java.awt.Dimension(170, 25)); jPredicateText.setText("list"); jArgumentText.setLocation(new java.awt.Point(170, 250)); jArgumentText.setVisible(true); jArgumentText.setToolTipText("type a Fril constant here as argument"); jArgumentText.setSize(new java.awt.Dimension(170, 25)); jArgumentText.setText("all"); jScrollPane1.setLocation(new java.awt.Point(10, 10)); jScrollPane1.setVisible(true); jScrollPane1.setSize(new java.awt.Dimension(330, 170)); jScrollPane1.getViewport().add(jFrilTextOutput); jFrilTextOutput.setVisible(true); jFrilTextOutput.setToolTipText("Fril output appears here"); jShowButton.setText("Show"); jShowButton.setLocation(new java.awt.Point(130, 290)); jShowButton.setVisible(true); jShowButton.setToolTipText("Shows the goal passed to Fril"); jShowButton.setSize(new java.awt.Dimension(100, 30)); jClearButton.setText("Clear output"); jClearButton.setLocation(new java.awt.Point(170, 185)); jClearButton.setVisible(true); jClearButton.setSize(new java.awt.Dimension(170, 20)); jPanel1.setLocation(new java.awt.Point(10, 210)); jPanel1.setVisible(true); jPanel1.setLayout(new java.awt.BorderLayout(0, 0)); jPanel1.setSize(new java.awt.Dimension(150, 60)); jClearCheckBox.setText("Clear every time"); jClearCheckBox.setLocation(new java.awt.Point(10, 185)); jClearCheckBox.setVisible(true); jClearCheckBox.setSelected(true); jClearCheckBox.setToolTipText("check here to clear the output window every time a query is run"); jClearCheckBox.setSize(new java.awt.Dimension(150, 20)); setLocation(new java.awt.Point(5, 40)); setTitle("JTestEmbWindow"); getContentPane().setLayout(null); setSize(new java.awt.Dimension(353, 345)); getContentPane().add(jQuitButton); getContentPane().add(jAppendButton); getContentPane().add(jReverseButton); getContentPane().add(jOtherQueryButton); getContentPane().add(jRunButton); getContentPane().add(jPredicateText); getContentPane().add(jArgumentText); getContentPane().add(jScrollPane1); getContentPane().add(jShowButton); getContentPane().add(jClearButton); getContentPane().add(jPanel1); getContentPane().add(jClearCheckBox); jQuitButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { jQuitButtonActionPerformed(e); } }); jRunButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { jRunButtonActionPerformed(e); } }); jAppendButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { jAppendButtonActionPerformed(e); } }); jReverseButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { jReverseButtonActionPerformed(e); } }); jOtherQueryButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { jOtherQueryButtonActionPerformed(e); } }); jShowButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { jShowButtonActionPerformed(e); } }); jClearButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { jClearButtonActionPerformed(e); } }); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { thisWindowClosing(e); } }); // END GUI INTIALISATION CODE } private boolean mShown = false; public void addNotify() { super.addNotify(); if (mShown) return; // resize frame to account for menubar JMenuBar jMenuBar = getJMenuBar(); if (jMenuBar != null) { int jMenuBarHeight = jMenuBar.getPreferredSize().height; Dimension dimension = getSize(); dimension.height += jMenuBarHeight; setSize(dimension); } mShown = true; } // Close the window when the close box is clicked void thisWindowClosing(java.awt.event.WindowEvent e) { setVisible(false); dispose(); System.exit(0); } public void jRunButtonActionPerformed(java.awt.event.ActionEvent e) { boolean res; String theInput; Integer listid; int frilRet = JFril.JFRILTERMINATED ; if(jClearCheckBox.isSelected() ) // clear output window if requested clearTextArea(); if(frilStatus) { frilRet = theFril.jFrilExecuteGoal(""); // run the query } while (frilRet == JFril.JFRILREQUESTINPUT ) // does the query require input ? { theInput = JOptionPane.showInputDialog(jArgumentText, "Type Fril input here"); // get input if(theInput.equals("")) frilRet = JFril.JFRILFAILED; else frilRet = theFril.jFrilExecuteGoal(theInput); // re-enter execution with the input for Fril } jFrilTextOutput.append("Query returned " + frilRet); // a bit of feedback frilStatus = theFril.jFrilGetStatus(); // in case the query terminated Fril } // set up the goal (append X Y (apples bananas cherries)) using low level functions public void jAppendButtonActionPerformed(java.awt.event.ActionEvent e) { boolean res; Integer argid; Integer listid; if(frilStatus) { theFril.jFrilInitialiseInterface(); argid = theFril.jFrilCreateList(4); listid = theFril.jFrilCreateList(3); res = ((argid != null) && (listid != null)); if (res) res = theFril.jFrilPutAtom(argid.intValue(), 1, "append"); if (res) res = theFril.jFrilPutAtom(listid.intValue(), 1, "apples"); if (res) res = theFril.jFrilPutAtom(listid.intValue(), 2, "bananas"); if (res) res = theFril.jFrilPutAtom(listid.intValue(), 3, "cherries"); if (res) res = theFril.jFrilPutList(argid.intValue(), 4, listid.intValue()); if (res) res = theFril.jFrilPutGoal(argid.intValue()); if (res) jFrilTextOutput.append("append query is set up\n"); else jFrilTextOutput.append("Error creating append query"); } else jFrilTextOutput.append("Fril is not running"); } // set up the goal (reverse (1 3.14159 Pi) X) using low level functions public void jReverseButtonActionPerformed(java.awt.event.ActionEvent e) { boolean res; Integer argid; Integer listid; if(frilStatus) { theFril.jFrilInitialiseInterface(); argid = theFril.jFrilCreateList(3); listid = theFril.jFrilCreateList(3); res = ((argid != null) && (listid != null)); if (res) res = theFril.jFrilPutAtom(argid.intValue(), 1, "reverse"); if (res) res = theFril.jFrilPutInt(listid.intValue(), 1, 1); if (res) res = theFril.jFrilPutFloat(listid.intValue(), 2, (float)(java.lang.Math.PI)); if (res) res = theFril.jFrilPutAtom(listid.intValue(), 3, "Pi"); if (res) res = theFril.jFrilPutList(argid.intValue(), 2, listid.intValue()); if (res) res = theFril.jFrilPutGoal(argid.intValue()); if (res) jFrilTextOutput.append("reverse query is set up\n"); else jFrilTextOutput.append("Error creating reverse query"); } else jFrilTextOutput.append("Fril is not running"); } // read two constants from the input text fields and setup the goal public void jOtherQueryButtonActionPerformed(java.awt.event.ActionEvent e) { boolean res; Integer argid; if(frilStatus) { if((jPredicateText.getText()).equals("") || (jArgumentText.getText()).equals("")) { jFrilTextOutput.append("enter constant predicate and argument in the boxes below"); } else { theFril.jFrilInitialiseInterface(); argid = theFril.jFrilCreateList(2); res = (argid != null); if (res) res = theFril.jFrilPutAtom(argid.intValue(), 1, jPredicateText.getText()); if (res) res = theFril.jFrilPutAtom(argid.intValue(), 2, jArgumentText.getText()); if (res) res = theFril.jFrilPutGoal(argid.intValue()); if (res) jFrilTextOutput.append("user-specified query is set up\n" + jPredicateText.getText() + " " + jArgumentText.getText()); else jFrilTextOutput.append("Error creating user-specified query"); } } else jFrilTextOutput.append("Fril is not running"); } // show the current goal public void jShowButtonActionPerformed(java.awt.event.ActionEvent e) { if(frilStatus) showAllArgs(JFril.JFRILFSLIST, 0); else jFrilTextOutput.append("Fril is not running"); } // button pressed to clear output window public void jClearButtonActionPerformed(java.awt.event.ActionEvent e) { clearTextArea(); } // quit public void jQuitButtonActionPerformed(java.awt.event.ActionEvent e) { setVisible(false); dispose(); System.exit(0); } public void clearTextArea() // does what it says { jFrilTextOutput.setText(""); } /* * showAllArgs(id, indent) displays all the elements in the list * referenced by "id", indenting each element by "indent" spaces. This can be * used to display a goal to be passed to Fril either before or after * execution. */ private void showAllArgs(int id, int indent) { int i; /* loop counter */ Integer len; /* stores the length of the list */ String str; /* used by "getatom" */ Integer integ; /* used by "getint" */ Float flo; /* used by "getfloat" */ Integer newid; /* used by "getlist" */ Integer type; /* used by "getitemtype" */ int ind; /* loop counter for indenting */ len = theFril.jFrilGetListLen(id); if (len != null) /* find out how many elements there are */ { for (i = 1; i <= java.lang.Math.abs(len.intValue()); i++) /* negative length indicates an unterminated list (...|X) */ { jFrilTextOutput.append("\n"); /* start on new line and indent appropriately */ for (ind = 0; ind++ < indent; jFrilTextOutput.append(" ")); jFrilTextOutput.append("item " + i + " is "); type = theFril.jFrilGetItemType(id, i); if (type != null) /* execute appropriate "get" function, according to argument type */ { switch (type.intValue()) { case JFril.JFRILATOM: /* constant */ str = theFril.jFrilGetAtom(id, i); if (str != null) jFrilTextOutput.append("atom : " + str); break; case JFril.JFRILINT: /* integer */ integ = theFril.jFrilGetInt(id, i); if (integ != null) jFrilTextOutput.append("integer : " + integ); break; case JFril.JFRILFLOAT: /* float */ flo = theFril.jFrilGetFloat(id, i); if(flo != null) jFrilTextOutput.append("float : " + flo); break; case JFril.JFRILLIST: /* list - recursively print elements at indent+2 */ newid = theFril.jFrilGetList(id, i); if (newid != null) { jFrilTextOutput.append("list"); showAllArgs(newid.intValue(), indent + 2); } break; case JFril.JFRILVBLE: /* variable */ jFrilTextOutput.append("uninstantiated variable "); break; case JFril.JFRILFSET: /* variable */ jFrilTextOutput.append("fuzzy set "); break; default: jFrilTextOutput.append("bad return value from getitemtype"); } } else jFrilTextOutput.append(THISCLASS + "couldn't get item type\n"); } if (len.intValue() < 0) jFrilTextOutput.append("\nlist terminated by | X\n"); } else jFrilTextOutput.append(THISCLASS + "couldn't get listlen\n"); } /* * Fril sends its output to a Writer (or subclass). Here we use * a StringWriter which dumps its contents and clears itself when * the flush() method is called. * It keeps a record of the window's text area. */ private class FrilWriter extends StringWriter { private JTextArea myTextArea; FrilWriter(JTextArea frilTextArea) { super(); myTextArea = frilTextArea; } public void flush() { myTextArea.append(this.toString()); super.flush(); this.getBuffer().delete(0, this.getBuffer().length()); } } }