diff scripts/java/org/octave/JDialogBox.java @ 15625:acf0addfc610

include Octave Forge java package in core Octave * scripts/java: New directory tree. * scripts/Makefile.am: Include java/module.mk. (JAR_FILES): New variable. (nobase_fcnfile_DATA): Include $(JAR_FILES) in the list. (all-local): Depend on $(JAR_FILES). (java/PKG_ADD, java_GEN_FCN_FILES, java/$(octave_dirstamp)): New rules. * libinterp/link-deps (LIBOCTINTERP_LINK_DEP): Include $(JAVA_LIBS) in the list. * dldfcn/__java__.h, dldfcn/__java__.cc: New files. * dldfcn/module-files (__java__.cc): New file description. * doc/interpreter/java.txi: New file. * doc/interpreter/octave.texi: Include java.texi. * doc/interpreter/java-images: New directory. * doc/interpreter/Makefile.am (JAVA_IMAGES): New variable. (IMAGES): Include $(JAVA_IMAGSES) in the list. (MUNGED_TEXI_SRC): Include java.texi in the list. * configure.ac: Check for Java libraries and tools. Include Java info in the summary message. * build-aux/common.mk (JAVA_CPPFLAGS, JAVA_LIBS): New variables. * NEWS: Update. * contributors.in: Include Martin Hepperle in the list.
author John W. Eaton <jwe@octave.org>
date Fri, 23 Nov 2012 15:29:13 -0500
parents
children 6e39fe7992d9
line wrap: on
line diff
new file mode 100755
--- /dev/null
+++ b/scripts/java/org/octave/JDialogBox.java
@@ -0,0 +1,986 @@
+ /*
+  ** Copyright (C) 2010 Martin Hepperle
+  **
+  ** This program is free software; you can redistribute it and/or modify
+  ** it under the terms of the GNU General Public License as published by
+  ** the Free Software Foundation; either version 2 of the License, or
+  ** (at your option) any later version.
+  **
+  ** This program is distributed in the hope that it will be useful,
+  ** but WITHOUT ANY WARRANTY; without even the implied warranty of
+  ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  ** GNU General Public License for more details.
+  **
+  ** You should have received a copy of the GNU General Public License
+  ** along with this program; If not, see <http://www.gnu.org/licenses/>.
+  */
+
+package org.octave;
+
+import java.net.*;
+import java.util.*;
+
+import java.awt.*;
+import javax.swing.*;
+
+/**
+ * <p>Implementation of various dialog box functions</p>
+ *
+ * <p>The following functions are provided for being called via
+ * Octave script files:</p>
+ * <ul>
+ * <li>errordlg</li>
+ * <li>helpdlg</li>
+ * <li>inputdlg</li>
+ * </ul>
+ *
+ * <p>Copyright (c) 2010 Martin Hepperle</p>
+ *
+ * @author Martin Hepperle
+ * @version 1.0
+ */
+public class JDialogBox
+{
+   public static final int CLOSE_OK = 1;
+   public static final int CLOSE_NO = 2;
+   public static final int CLOSE_CANCEL = 3;
+
+   // dialog type
+   public static int FLAG_LABEL = 1;
+   public static int FLAG_TEXT = 2;
+   public static int FLAG_INPUT = 4;
+   public static int FLAG_LIST = 8;
+   // icon selection
+   public static int FLAG_QUESTION = 32;
+   public static int FLAG_ERROR = 64;
+   public static int FLAG_WARNING = 128;
+   public static int FLAG_INFORMATION = 256;
+
+   public static int DLG_QUEST = FLAG_QUESTION | FLAG_TEXT;
+   public static int DLG_INPUT = FLAG_QUESTION | FLAG_INPUT;
+   public static int DLG_LIST = FLAG_QUESTION | FLAG_LIST;
+
+   private final static String m_OK = "OK";
+   private final static String m_Yes = "Yes";
+   private final static String m_No = "No";
+   private final static String m_Cancel = "Cancel";
+
+   private JButton m_ButtonNO;
+   private JButton m_ButtonOK;
+   private JButton m_ButtonCANCEL;
+   private JButton m_Focus;
+   private JTextArea m_TextField[];
+   private JList m_List;
+   private JFrame m_ParentFrame;
+   private int m_CloseMethod;
+
+   // ------------------------------------
+   // implementation of listdlg function
+   // ------------------------------------
+
+   /**
+    *
+    * @param listcell String[] - a array of strings, one for each list entry
+    * @param selmode String
+    * @param sizecell Object[]
+    * @param initialcell Object[]
+    * @param name String
+    * @param promptcell String[]
+    * @param okstring String
+    * @param cancelstring String
+    * @return String[]
+    */
+   public static int[] listdlg ( String[] listcell,
+                                 String selmode,
+                                 Object[] sizecell,
+                                 Object[] initialcell,
+                                 String name,
+                                 String[] promptcell,
+                                 String okstring,
+                                 String cancelstring )
+   {
+      JDialogBox d = new JDialogBox ();
+      d.genericdlg ( promptcell, listcell, name, selmode,
+                     DLG_LIST,
+                     sizecell, initialcell, okstring, null, cancelstring );
+      return ( d.getSelectedIndices () );
+   }
+
+
+   // ------------------------------------
+   // implementation of inputdlg function
+   // -------------------------------------
+
+   /**
+    * Implements a variation of the inputdlg function.
+    *
+    * @param prompt String[] - an array of text strings to be used as labels.
+    * @param title String - a text string to be used to label the dialog caption.
+    * @param RowsCols int - defines the width of the text fields in columns.
+    * @param defaults Object[] - an array of text strings or numbers to be
+    * placed into the text fields as default values.
+    * @return String[] - an array of text strings containing the content of the
+    * text fields.
+    */
+   public static String[] inputdlg ( String[] prompt,
+                                     String title,
+                                     Object[] RowsCols,
+                                     Object[] defaults )
+   {
+      JDialogBox d = new JDialogBox ();
+      d.genericdlg ( prompt, null, title, "on",
+                     FLAG_INPUT | FLAG_QUESTION,
+                     RowsCols, defaults, m_OK, null, m_Cancel );
+      return ( d.getInput () );
+   }
+
+
+   /**
+    * Extract the current content from the text fields of an inputdlg.
+    *
+    * @return String[] - the text contained in the fields of an inputdlg.
+    * null if the dialog was cancelled.
+    */
+   private String[] getInput ()
+   {
+      String s[] = null;
+
+      if ( m_CloseMethod == CLOSE_OK )
+      {
+         s = new String[m_TextField.length];
+
+         for ( int i = 0; i < s.length; i++ )
+         {
+            s[i] = new String ( m_TextField[i].getText () );
+         }
+      }
+
+      return ( s );
+   }
+
+
+   private String getResult ()
+   {
+      String s = null;
+
+      if ( m_CloseMethod == CLOSE_OK )
+      {
+         s = m_ButtonOK.getText ();
+      }
+      else if ( m_CloseMethod == CLOSE_CANCEL )
+      {
+         s = m_ButtonCANCEL.getText ();
+      }
+      else
+      {
+         s = m_ButtonNO.getText ();
+      }
+
+      return ( s );
+   }
+
+
+   /**
+    * Extract the current content from the text fields of an inputdlg.
+    *
+    * @return String[] - the text contained in the fields of an inputdlg.
+    * null if the dialog was cancelled.
+    */
+   private String[] getSelection ()
+   {
+      String s[] = null;
+
+      if ( m_CloseMethod == CLOSE_OK )
+      {
+         int selection[] = m_List.getSelectedIndices ();
+
+         s = new String[selection.length];
+
+         for ( int i = 0; i < s.length; i++ )
+         {
+
+            // s[i] = new String ( Integer.toString(selection[i]) );
+            s[i] = ( m_List.getSelectedValues ()[i] ).toString ();
+         }
+      }
+
+      return ( s );
+   }
+
+
+   private int[] getSelectedIndices ()
+   {
+      int s[] = null;
+
+      if ( m_CloseMethod == CLOSE_OK )
+      {
+         s = m_List.getSelectedIndices ();
+         for ( int i = 0; i < s.length; i++ )
+         {
+
+            // translate to 1 based indices
+            s[i] = s[i] + 1;
+         }
+      }
+
+      return ( s );
+   }
+
+
+   public void SelectAll ()
+   {
+      if ( null != m_List )
+      {
+         m_List.setSelectionInterval ( 0, m_List.getModel ().getSize () - 1 );
+      }
+   }
+
+
+   // -------------------------------------
+   // implementation of helpdlg function
+   // -------------------------------------
+
+   /**
+    * Implements a simple helpdlg with default text and caption. Not very useful.
+    *
+    * Octave > helpdlg('helpstring','title')
+    *
+    * Called via helpdlg.m.
+    *
+    * @param helpstring String - a message string to be presented to the user.
+    * The string can have embedded newline (\n) characters to break the message
+    * into multiple lines.
+    * @param title String - a text string to be used to label the dialog caption.
+    * @return int - always 1
+    */
+   public static int helpdlg ( String helpstring, String title )
+   {
+      JDialogBox d = new JDialogBox ();
+      String s[] = new String[1];
+      s[0] = helpstring;
+      return ( d.genericdlg ( s, null, title, "on",
+                              FLAG_TEXT | FLAG_INFORMATION, null, null,
+                              m_OK, null, m_Cancel ) );
+   }
+
+
+   // -------------------------------------
+   // implementation of emptydlg function
+   // -------------------------------------
+
+   /**
+    * Implements a simple helpdlg with default text and caption. Not very useful.
+    *
+    * Octave > emptydlg('messagestring','title')
+    *
+    * Called via dlgbox.m.
+    *
+    * @param messagestring String - a message string to be presented to the user.
+    * The string can have embedded newline (\n) characters to break the message
+    * into multiple lines.
+    * @param title String - a text string to be used to label the dialog caption.
+    * @return int - always 1
+    */
+   public static int emptydlg ( String helpstring, String title )
+   {
+      JDialogBox d = new JDialogBox ();
+      String s[] = new String[1];
+      s[0] = helpstring;
+      return ( d.genericdlg ( s, null, title, "on",
+                              FLAG_TEXT, null, null,
+                              m_OK, null, m_Cancel ) );
+   }
+
+
+   // -------------------------------------------
+   // implementation of questdlg related functions
+   // -------------------------------------------
+
+   /**
+    * Implements a simple questdlg with default text and caption. Not very useful.
+    *
+    * @param question String - the question to be presented
+    * @param title String - the caption
+    * @param options String[] - 'str1', 'str2', 'str3', 'default'
+    * @return String - the caption of the button pressed by the user
+    */
+   public static String questdlg ( String question,
+                                   String title,
+                                   String[] options )
+   {
+      JDialogBox d = new JDialogBox ();
+      String s[] = new String[1];
+      s[0] = question;
+      d.genericdlg ( s, options, title, "on",
+                     DLG_QUEST, null, null,
+                     options[0], options[1], options[2] );
+      return ( d.getResult () );
+   }
+
+
+   // -------------------------------------
+   // implementation of errordlg function
+   // -------------------------------------
+
+   /**
+    * Implements a simple errordlg with default text and caption. Not very useful.
+    *
+    * @param errorstring String - the error message to display.
+    * @param dlgname String - the caption of the dialog box.
+    * @return int - always 1
+    */
+   public static int errordlg ( String errorstring, String dlgname )
+   {
+      JDialogBox d = new JDialogBox ();
+      String s[] = new String[1];
+      s[0] = errorstring;
+      return ( d.genericdlg ( s, null, dlgname, "on", FLAG_TEXT | FLAG_ERROR,
+                              null, null,
+                              m_OK, null, m_Cancel ) );
+   }
+
+
+   // -------------------------------------------
+   // implementation of warndlg related functions
+   // -------------------------------------------
+
+   /**
+    * Implements a simple warndlg with default text and caption. Not very useful.
+    *
+    * Called via warndlg.m.
+    *
+    * @param errorstring String - the message to be presented to the user.
+    * @param dlgname String - the caption of the dialog box.
+    * @return int - always 1
+    */
+   public static int warndlg ( String errorstring, String dlgname )
+   {
+      JDialogBox d = new JDialogBox ();
+      String s[] = new String[1];
+      s[0] = errorstring;
+      return ( d.genericdlg ( s, null, dlgname, "on", FLAG_TEXT | FLAG_WARNING,
+                              null, null,
+                              m_OK, null, m_Cancel ) );
+   }
+
+
+   // -------------------------------------
+   // generic dlg function
+   // -------------------------------------
+   /**
+    * A generic dialog creation and display function.
+    *
+    * @param message String[]
+    * @param list String[]
+    * @param caption String
+    * @param on String
+    * @param flag int
+    * @param RowsCols Object[]
+    * @param defaults Object[]
+    * @param okstring String
+    * @param nostring String
+    * @param cancelstring String
+    * @return int
+    */
+   public int genericdlg ( String message[],
+                           String list[],
+                           String caption,
+                           String on,
+                           int flag,
+                           Object[] RowsCols,
+                           Object[] defaults,
+                           String okstring,
+                           String nostring,
+                           String cancelstring )
+   {
+      TeXtranslator theTranslator = new TeXtranslator ();
+      setSystemLnF ( true );
+
+      caption = theTranslator.replace ( caption );
+
+      m_ButtonNO = null;
+      m_ButtonOK = null;
+      m_ButtonCANCEL = null;
+
+      // create a modal dialog with an empty frame as its parent
+      m_ParentFrame = new JFrame ();
+
+      // --- trick to bring dialog to the front
+      // In Windows, the dialog is not brought to the foreground, but hidden
+      // behind the Octave window as long as the parent frame is not visible.
+      // To avoid that the frame is visible, we move it outside of the screen.
+      m_ParentFrame.setBounds ( Toolkit.getDefaultToolkit ().getScreenSize ().
+                                width + 100,
+                                Toolkit.getDefaultToolkit ().getScreenSize ().
+                                height + 100, 1, 1 );
+      m_ParentFrame.setVisible ( true );
+      //-- end of trick
+
+      JDialog dlg;
+      dlg = new JDialog ( m_ParentFrame );
+      dlg.setTitle ( caption );
+
+      dlg.setModal ( true );
+      dlg.setDefaultCloseOperation ( JDialog.DISPOSE_ON_CLOSE );
+
+      DlgListener theListener = new DlgListener ( this );
+
+      Container d = dlg.getContentPane ();
+      d.setLayout ( new BorderLayout ( 8, 8 ) );
+
+      // spacer
+      d.add ( new JLabel ( " " ), BorderLayout.NORTH );
+      d.add ( new JLabel ( "  " ), BorderLayout.EAST );
+
+      JPanel p = new JPanel ();
+
+      if ( FLAG_LABEL == ( FLAG_LABEL & flag ) )
+      {
+         // a single line label
+         JLabel l = new JLabel ( theTranslator.replace ( message[0] ) );
+         p.add ( l );
+      }
+      else if ( FLAG_TEXT == ( FLAG_TEXT & flag ) )
+      {
+         String msg = theTranslator.replace ( message[0] );
+         // a multi-line text display for helpdlg
+         StringTokenizer st = new StringTokenizer ( msg, "\n" );
+
+         int nRows = ( null == RowsCols ) ? 1 :
+                     Integer.parseInt ( RowsCols[0].toString () );
+         nRows = Math.max ( nRows, st.countTokens () );
+         int nCols = Math.max ( 1, msg.length () / nRows );
+
+         p.setLayout ( new GridLayout ( message.length, 1 ) );
+         JTextArea ta = new JTextArea ( msg, nRows, nCols );
+         ta.setEditable ( false );
+         ta.setFocusable ( false );
+         ta.setOpaque ( false );
+         // replace ugly monospaced font
+         ta.setFont ( p.getFont () );
+         p.add ( ta );
+      }
+      else if ( FLAG_INPUT == ( FLAG_INPUT & flag ) )
+      {
+         // a multi label/textfield entry dialog for inputdlg
+         GridBagConstraints gbc = new GridBagConstraints ();
+         gbc.insets.top = 4;
+         gbc.insets.left = 8;
+         gbc.gridx = 0;
+         gbc.anchor = GridBagConstraints.NORTHWEST;
+
+         p.setLayout ( new GridBagLayout () );
+         m_TextField = new JTextArea[message.length];
+
+         // default values
+         int nRows = 1;
+         int nCols = 10;
+
+         for ( int i = 0; i < message.length; i++ )
+         {
+            String msg = theTranslator.replace ( message[i] );
+            JLabel l = new JLabel ( msg );
+            l.setHorizontalAlignment ( Label.LEFT );
+            gbc.gridy = 2 * i;
+            p.add ( l, gbc );
+            /**
+             * @todo CHECK handling of RowsCols for inputdlg
+             */
+            if ( RowsCols != null )
+            {
+               if ( RowsCols.length == 2 * message.length )
+               {
+                  nRows = Integer.parseInt ( RowsCols[i].toString () );
+                  nCols = Integer.parseInt ( RowsCols[RowsCols.length / 2 +
+                                             i].toString () );
+               }
+            }
+
+            m_TextField[i] = new JTextArea ( "", Math.max ( nRows, 1 ), nCols );
+            // avoid resizing
+            m_TextField[i].setPreferredSize ( new Dimension ( Math.max ( nRows,
+               1 ), nCols ) );
+            m_TextField[i].setAutoscrolls ( false );
+            m_TextField[i].setFont ( p.getFont () );
+            m_TextField[i].setBorder ( new javax.swing.border.EtchedBorder () );
+            m_TextField[i].addKeyListener ( theListener );
+
+            gbc.gridy = 2 * i + 1;
+            p.add ( m_TextField[i], gbc );
+         }
+
+         if ( defaults != null )
+         {
+            if ( defaults.length == message.length )
+            {
+               for ( int i = 0; i < message.length; i++ )
+               {
+                  String def = theTranslator.replace ( defaults[i].toString () );
+                  m_TextField[i].setText ( def );
+               }
+            }
+         }
+      }
+      else if ( DLG_LIST == ( DLG_LIST & flag ) )
+      {
+         GridBagConstraints gbc = new GridBagConstraints ();
+         gbc.insets.top = 4;
+         gbc.insets.left = 8;
+         gbc.gridx = 0;
+         gbc.anchor = GridBagConstraints.NORTHWEST;
+
+         p.setLayout ( new GridBagLayout () );
+
+         for ( int i = 0; i < message.length; i++ )
+         {
+            // a single line label
+            String msg = theTranslator.replace ( message[i] );
+            JLabel l = new JLabel ( msg );
+            gbc.gridy = i;
+            p.add ( l, gbc );
+         }
+
+         String lst[] = new String[list.length];
+
+         for ( int i = 0; i < list.length; i++ )
+         {
+            lst[i] = theTranslator.replace ( list[i] );
+         }
+         m_List = new JList ( lst );
+
+         // replace ugly monospaced font
+         m_List.setFont ( p.getFont () );
+
+         m_List.setMinimumSize ( new Dimension ( Math.max ( 1,
+            Integer.parseInt ( RowsCols[0].toString () ) ),
+                                                 Math.max ( 1,
+            Integer.parseInt ( RowsCols[1].toString () ) ) ) );
+         m_List.setPreferredSize ( new Dimension ( Math.max ( 1,
+            Integer.parseInt ( RowsCols[1].toString () ) ),
+            Math.max ( 1,
+                       Integer.parseInt ( RowsCols[0].toString () ) ) ) );
+         m_List.setBorder ( new javax.swing.border.EtchedBorder () );
+
+         gbc.gridy = message.length;
+         gbc.fill = GridBagConstraints.HORIZONTAL;
+         p.add ( m_List, gbc );
+
+         if ( on.toLowerCase ().equals ( "single" ) )
+         {
+            // single selection list
+            m_List.setSelectionMode ( ListSelectionModel.SINGLE_SELECTION );
+
+            m_List.setSelectedIndex ( Integer.parseInt (
+               defaults[0].toString () ) - 1 );
+         }
+         else
+         {
+            // multiple selection possible
+            m_List.setSelectionMode ( ListSelectionModel.
+                                      MULTIPLE_INTERVAL_SELECTION );
+
+            int selection[] = new int[defaults.length];
+            for ( int i = 0; i < defaults.length; i++ )
+            {
+               selection[i] = Integer.parseInt ( defaults[i].toString () ) - 1;
+            }
+            m_List.setSelectedIndices ( selection );
+
+            JButton b = new JButton ( "Select All" );
+            b.setActionCommand ( "SELALL" );
+            b.addActionListener ( theListener );
+            gbc.gridy = message.length + 1;
+            gbc.fill = GridBagConstraints.HORIZONTAL;
+            p.add ( b, gbc );
+         }
+
+      }
+
+      // prepare icon, if any
+      String sIconFile = null;
+      String sIconResource = null;
+      Icon theIcon = null;
+
+      if ( FLAG_ERROR == ( FLAG_ERROR & flag ) )
+      {
+         sIconFile = "images/error.png";
+         // Java for Windows
+         sIconResource = "OptionPane.errorIcon";
+         // Java for Linux does not offer these standard icons...
+      }
+      else if ( FLAG_WARNING == ( FLAG_WARNING & flag ) )
+      {
+         sIconFile = "images/warning.png";
+         // Java for Windows
+         sIconResource = "OptionPane.warningIcon";
+         // Java for Linux does not offer these standard icons...
+      }
+      else if ( FLAG_QUESTION == ( FLAG_QUESTION & flag ) )
+      {
+         sIconFile = "images/question.png";
+         // Java for Windows
+         sIconResource = "OptionPane.questionIcon";
+         // Java for Linux does not offer these standard icons...
+      }
+      else if ( FLAG_INFORMATION == ( FLAG_INFORMATION & flag ) )
+      {
+         sIconFile = "images/information.png";
+         // Java for Windows
+         sIconResource = "OptionPane.informationIcon";
+         // Java for Linux does not offer these standard icons...
+      }
+
+      // first try to find the UIManager specific icon to fit look and feel
+      // Note: the Windows XP look and feel offers 50 icons.
+      if ( sIconResource != null )
+      {
+         UIDefaults df = UIManager.getLookAndFeelDefaults ();
+         theIcon = df.getIcon ( sIconResource );
+      }
+
+      // fallback on bitmap image resource if icon was not found
+      if ( theIcon == null &&
+           sIconFile != null )
+      {
+         URL theResource = JDialogBox.class.getResource ( sIconFile );
+         if ( theResource != null )
+         {
+            theIcon = new ImageIcon ( theResource );
+         }
+      }
+
+      if ( theIcon != null )
+      {
+         // dummy panel to provide space around icon
+         JPanel pi = new JPanel ( new GridLayout ( 1, 3 ) );
+         pi.add ( new JLabel () );
+         pi.add ( new JLabel ( theIcon ) );
+         pi.add ( new JLabel () );
+         d.add ( pi, BorderLayout.WEST );
+
+         // use Octave icon if available. otherwise use dialog icon
+         Icon theOctaveIcon = getOctaveIcon ();
+         prepareFrameIcon ( m_ParentFrame,
+                            theOctaveIcon == null ? theIcon : theOctaveIcon );
+      }
+
+      d.add ( p, BorderLayout.CENTER );
+
+      // button bar (2 rows of 3 columns each
+
+      p = new JPanel ();
+      p.setLayout ( new java.awt.GridLayout ( 2, 3 ) );
+
+      // spacer row
+      p.add ( new JLabel () );
+      p.add ( new JLabel () );
+      p.add ( new JLabel () );
+
+      if ( DLG_QUEST == ( DLG_QUEST & flag ) )
+      {
+         // questdlg with empty option[2]: only two buttons
+         if ( nostring.length () < 1 )
+         {
+            // spacer: left
+            p.add ( new JLabel () );
+         }
+      }
+      else
+      {
+         // spacer: left
+         p.add ( new JLabel () );
+      }
+
+      m_ButtonOK = new JButton ( theTranslator.replace ( okstring ) );
+      m_ButtonOK.setActionCommand ( "OK" );
+      m_ButtonOK.addActionListener ( theListener );
+      m_Focus = m_ButtonOK;
+      p.add ( m_ButtonOK );
+
+      if ( DLG_QUEST == ( DLG_QUEST & flag ) )
+      {
+         // questdlg with empty option[2]: only two buttons
+         if ( nostring.length () > 01 )
+         {
+            // questdlg has three buttons
+            m_ButtonNO = new JButton ( theTranslator.replace ( nostring ) );
+            m_ButtonNO.setActionCommand ( "NO" );
+            m_ButtonNO.addActionListener ( theListener );
+            p.add ( m_ButtonNO );
+            if ( DLG_QUEST == ( DLG_QUEST & flag ) )
+            {
+               // select default button
+               if ( list[3].equals ( nostring ) )
+               {
+                  m_Focus = m_ButtonNO;
+               }
+            }
+         }
+      }
+
+      if ( DLG_INPUT == ( DLG_INPUT & flag ) ||
+           DLG_LIST == ( DLG_LIST & flag ) ||
+           DLG_QUEST == ( DLG_QUEST & flag ) )
+      {
+         m_ButtonCANCEL = new JButton ( theTranslator.replace ( cancelstring ) );
+         m_ButtonCANCEL.setActionCommand ( "CANCEL" );
+         m_ButtonCANCEL.addActionListener ( theListener );
+         p.add ( m_ButtonCANCEL );
+         if ( DLG_QUEST == ( DLG_QUEST & flag ) )
+         {
+            // select default button
+            if ( list[3].equals ( cancelstring ) )
+            {
+               m_Focus = m_ButtonCANCEL;
+            }
+         }
+      }
+      else
+      {
+         // spacer: right
+         p.add ( new JLabel () );
+      }
+
+      d.add ( p, BorderLayout.SOUTH );
+      dlg.pack ();
+
+      dlg.addWindowListener ( theListener );
+
+      if ( on.equals ( "on" ) )
+      {
+         m_ParentFrame.setAlwaysOnTop ( true );
+      }
+
+      // center dialog on screen
+      Dimension dlgSize = dlg.getSize ();
+      Dimension screenSize = Toolkit.getDefaultToolkit ().getScreenSize ();
+
+      dlg.setLocation ( ( screenSize.width - dlgSize.width ) / 2,
+                        ( screenSize.height - dlgSize.height ) / 2 );
+
+      dlg.setVisible ( true );
+      dlg.requestFocus ();
+
+      m_ParentFrame.setVisible ( false );
+
+      return ( 1 );
+   }
+
+
+   /**
+    *
+    * @return Icon - null if icon was not found
+    */
+   private Icon getOctaveIcon ()
+   {
+      Icon theIcon = null;
+      URL theResource = JDialogBox.class.getResource ( "images/octave.png" );
+      if ( theResource != null )
+      {
+         theIcon = new ImageIcon ( theResource );
+      }
+      return theIcon;
+   }
+
+
+   /**
+    * Replace the standard Java frame icon with an Octave Icon.
+    *
+    * @param theFrame Frame - the Frame to decorate
+    * @param theIcon Icon - the icon to use if octave icon is not found.
+    */
+   private void prepareFrameIcon ( Frame theFrame, Icon theIcon )
+   {
+      // prepare icon for upper left corner of Frame window
+      // maybe there is a simpler way to achieve this
+      int w = theIcon.getIconWidth ();
+      int h = theIcon.getIconHeight ();
+      // Frame must be made displayable by packing it for createImage() to succeed
+      theFrame.pack ();
+      Image theImage = theFrame.createImage ( w, h );
+      theIcon.paintIcon ( theFrame, theImage.getGraphics (), 0, 0 );
+      theFrame.setIconImage ( theImage );
+   }
+
+
+   /**
+    * Select Look and Feel
+    *
+    * @param bSystemLnF boolean - if true, the current systesm Look&Feel is used,
+    * otherwise the Swing/Metal cross platform Look&Feel is used.
+    */
+   private void setSystemLnF ( boolean bSystemLnF )
+   {
+      try
+      {
+         if ( bSystemLnF )
+         {
+            // switch from Swing LnF to local system LnF
+            UIManager.setLookAndFeel ( UIManager.
+                                       getSystemLookAndFeelClassName () );
+         }
+         else
+         {
+            // use Swing LnF
+            UIManager.setLookAndFeel ( UIManager.
+                                       getCrossPlatformLookAndFeelClassName () );
+         }
+      }
+      catch ( Exception exception )
+      {
+         exception.printStackTrace ();
+      }
+   }
+
+
+   /**
+    * Called when the dialog is closed. Allows for specific cleanup actions.
+    *
+    * @param closeMethod int - OctaveDialog.CLOSE_OK, OctaveDialog.CLOSE_CANCEL
+    */
+   public void closeDialog ( int closeMethod )
+   {
+      m_CloseMethod = closeMethod;
+      m_ParentFrame.dispose ();
+   }
+
+
+   public void setFocus ()
+   {
+      if ( null != m_Focus )
+      {
+         m_Focus.requestFocus ();
+         m_ParentFrame.getRootPane ().setDefaultButton ( m_Focus );
+         m_ParentFrame.setAlwaysOnTop ( true );
+      }
+   }
+
+
+   /**
+    * Tests the dialogs
+    *
+    * @param args String[] - not used.
+    */
+   public static void main ( String[] args )
+   {
+      TeXtranslator t = new TeXtranslator();
+
+      if(false)
+      {
+         // find out key names of icon UI resources
+         UIDefaults df = UIManager.getLookAndFeelDefaults ();
+
+         for ( Enumeration e = df.keys (); e.hasMoreElements (); )
+         {
+            String s = e.nextElement ().toString ();
+
+            if ( s.toLowerCase ().contains ( "icon" ) )
+            {
+               System.out.println ( s );
+            }
+         }
+      }
+
+      try
+      {
+         Class[] argTypes = new Class[1];
+         argTypes[0] = String.class;
+
+         java.lang.reflect.Constructor c = ClassHelper.findConstructor ( java.lang.StringBuffer.class,
+                                                       argTypes );
+         Object argValues[] = new Object[1];
+         argValues[0] = new String("initial value");
+         Object sb = c.newInstance(argValues);
+         System.out.println(sb.toString());
+
+         ClassHelper.invokeMethod(sb,"append",argValues,argTypes);
+         System.out.println(sb.toString());
+
+         argValues = new Object[2];
+         argTypes = new Class[2];
+         argTypes[0] =  Integer.class;
+         argTypes[1] = String.class;
+         argValues[0] = new Integer(0);
+         argValues[1] = new String("inserted");
+
+         ClassHelper.invokeMethod(sb,"insert",argValues,argTypes);
+         System.out.println(sb.toString());
+      }
+      catch ( Throwable e )
+      {}
+
+      if ( true )
+      {
+         return;
+      }
+
+      helpdlg ( "If you need help\nyou should ask for help\nif someone is around\notherwise you are on your own.",
+                "Information" );
+
+      String[] options = new String[4];
+      options[0] = "Yeah \\vartheta is too low";
+      options[1] = "Maybe";
+      options[2] = "Nay \\vartheta is too high";
+      options[3] = "Maybe";
+
+      System.out.println ( questdlg ( "Is it too cold?", "Temperature", options ) );
+
+      // test variants of errordlg
+      // does not affect layering of dialog
+      errordlg ( "Background error!", "Error" );
+
+      // test variants of helpdlg
+
+      // test variants of inputdlg
+      String prompt[] = new String[2];
+      prompt[0] = "Question 1";
+      prompt[1] = "Question 2";
+      String defaults[] = new String[2];
+      defaults[0] = "1.1";
+      defaults[1] = "2.2";
+      String title = "Enter values";
+
+      Integer rc[] = new Integer[2 * 2];
+      rc[0] = new Integer ( 1 );
+      rc[1] = new Integer ( 2 );
+      rc[2] = new Integer ( 10 );
+      rc[3] = new Integer ( 20 );
+
+      inputdlg ( prompt, title, rc, defaults );
+
+      String listcell[] = new String[4];
+      listcell[0] = "a \\alpha";
+      listcell[1] = "b \\beta";
+      listcell[2] = "c \\gamma";
+      listcell[3] = "d \\delta";
+
+      Integer size[] = new Integer[2];
+      size[0] = new Integer ( 80 );
+      size[1] = new Integer ( 100 );
+
+      Integer initial[] = new Integer[2];
+      initial[0] = new Integer ( 4 );
+      initial[1] = new Integer ( 2 );
+
+      String promptcell[] = new String[2];
+      promptcell[0] = "Select something";
+      promptcell[1] = "(or even more than one thing)";
+
+      int idx[] = listdlg ( listcell,
+                            "Multiple",
+                            size,
+                            initial,
+                            "name",
+                            promptcell,
+                            "okstring",
+                            "cancelstring" );
+
+      if ( idx != null )
+      {
+         for ( int i = 0; i < idx.length; i++ )
+         {
+            System.out.println ( idx[i] );
+         }
+      }
+   }
+}