home *** CD-ROM | disk | FTP | other *** search
/ BUG 4 / BUGCD1997_05.BIN / aplic / visualj / vjtrial.exe / RCDATA / CABINET / vjdbwiz.awx / TEMPLATE / DAO.JAV < prev    next >
Text File  |  1997-01-28  |  39KB  |  1,447 lines

  1. $$IF(comments)
  2. ////////////////////////////////////////////////////////////////////////////////
  3. //
  4. // Java Source: $$AppName$$.java
  5. $$IF(use_DAO)
  6. // Description: Applet with DAO support for accessing the
  7. //              "$$fname$$" database.
  8. $$ELSE
  9. // Description: Applet with RDO support for accessing the
  10. //              "$$DSN$$" data source.
  11. $$ENDIF
  12. //
  13.  
  14. $$ENDIF
  15. import java.applet.*;
  16. import java.awt.*;
  17. import java.util.*;
  18. $$IF(comments)
  19.  
  20. //--------------------------------------------------------------------------
  21. $$IF(use_DAO)
  22. // DAO SUPPORT: Import the DA0 3.5 object library and the COM classes
  23. $$ELSE
  24. // RDO SUPPORT: Import the RDO 2.0 object library and the COM classes
  25. $$ENDIF
  26. //--------------------------------------------------------------------------
  27.  
  28. $$ENDIF
  29. $$IF(todo)
  30. $$IF(use_DAO)
  31. // TODO: Run the "Type Library Wizard" on the DAO 3.5 object library!
  32. $$ELSE
  33. // TODO: Run the "Type Library Wizard" on the RDO 2.0 object library!
  34. $$ENDIF
  35.  
  36. $$ENDIF
  37. $$IF(use_DAO)
  38. import dao350.*;
  39. $$ELSE
  40. import msrdo20.*;
  41. $$ENDIF
  42. import com.ms.com.*;
  43. import Alert;
  44.  
  45. $$IF(comments)
  46. //--------------------------------------------------------------------------
  47. $$IF(use_DAO)
  48. // DAO SUPPORT: Class that defines a database field
  49. $$ELSE
  50. // RDO SUPPORT: Class that defines a database field
  51. $$ENDIF
  52. //--------------------------------------------------------------------------
  53.  
  54. $$ENDIF
  55. $$IF(comments)
  56. /**
  57.  * Field class that defines the field's name and type as well as it's
  58.  * attached Label and TextField components.
  59.  */
  60. $$ENDIF
  61. class DBField
  62. {
  63. $$IF(comments)
  64.     /**
  65.      * Name of field
  66.      */
  67. $$ENDIF
  68.     String strName;
  69. $$IF(comments)
  70.  
  71.     /**
  72.      * Type of field as a string
  73.      */
  74. $$ENDIF
  75.     String strType;
  76. $$IF(comments)
  77.  
  78. $$IF(use_DAO)
  79.     /**
  80.      * Type of field as a Variant type (vt)
  81.      */
  82. $$ENDIF
  83. $$ENDIF
  84. $$IF(use_DAO)
  85.     short vt;
  86. $$ENDIF
  87. $$IF(comments)
  88.  
  89.     /**
  90.      * Label attached to field (if any)
  91.      */
  92. $$ENDIF
  93.     Label label;
  94. $$IF(comments)
  95.  
  96.     /**
  97.      * TextField attached to field (if any)
  98.      */
  99. $$ENDIF
  100.     TextField field;
  101. $$IF(comments)
  102.  
  103.     /**
  104.      * Attributes of field
  105.      */
  106. $$ENDIF
  107.     int attributes;
  108. $$IF(comments)
  109.  
  110. $$IF(use_DAO)
  111.     /**
  112.      * Validation text for field
  113.      */
  114. $$ENDIF
  115. $$ENDIF
  116. $$IF(use_DAO)
  117.     String strValidation;
  118. $$ENDIF
  119. $$IF(comments)
  120.  
  121.     /**
  122.      * Constructor
  123.      * @param strName Name of field in database
  124.      * @param strType Description of field type
  125. $$IF(use_DAO)
  126.      * @param vt Type of Variant (see Variant.Variant*)
  127. $$ENDIF
  128.      */
  129. $$ENDIF
  130. $$IF(use_DAO)
  131.     public DBField(String strName, String strType, short vt)
  132. $$ELSE
  133.     public DBField(String strName, String strType)
  134. $$ENDIF
  135.     {
  136.         this.strName = strName;
  137.         this.strType = strType;
  138. $$IF(use_DAO)
  139.         this.vt = vt;
  140. $$ENDIF
  141.     }
  142. }
  143.  
  144. $$IF(comments)
  145. /**
  146.  * Frame class for the $$AppName$$ applet.
  147.  */
  148. $$ENDIF
  149. class DBFrame extends Frame
  150. {
  151. $$IF(comments)
  152.     /**
  153.      * The applet that brought up this frame window.
  154.      */
  155. $$ENDIF
  156.     $$AppName$$ applet;
  157.  
  158. $$IF(comments)
  159.     /**
  160.      * Constructor
  161.      * @param applet Applet to notify (via applet.stop) when the frame window closes.
  162.      * @param strTitle The title of this frame window.
  163.      */
  164. $$ENDIF
  165.     public DBFrame($$AppName$$ applet$$AppName$$, String strTitle)
  166.     {
  167. $$IF(comments)
  168.         // Send title to superclass and set applet member
  169. $$ENDIF
  170.         super(strTitle);
  171.         this.applet = applet$$AppName$$;
  172.     }
  173.  
  174. $$IF(comments)
  175.     /**
  176.      * This method is used to intercept the WINDOW_DESTROY event so the
  177.      * recordset can be closed. It is accomplished by calling the
  178.      * applet's exit() method.
  179.      * @param evt Event description class.
  180.      * @return True if the event was handled, false otherwise
  181.      */
  182. $$ENDIF
  183.     public synchronized boolean handleEvent(Event evt)
  184.     {
  185.         switch (evt.id)
  186.         {
  187.             case Event.WINDOW_DESTROY: 
  188. $$IF(comments)
  189.  
  190.                 //-------------------------------------------------------------
  191.                 // DAO SUPPORT: Close database and window on WINDOW_DESTROY
  192.                 //-------------------------------------------------------------
  193.  
  194. $$ENDIF
  195.                 applet.exit();
  196.                 return true;
  197.  
  198.             default:
  199.                 return super.handleEvent(evt);
  200.         }            
  201.     }
  202. }
  203.  
  204. $$IF(comments)
  205. /**
  206.  * Main $$AppName$$ applet/application class.
  207.  */
  208. $$ENDIF
  209. public class $$AppName$$ extends Applet
  210. {
  211. $$IF(comments)
  212.     /**
  213.      * The $$AppName$$ applet (if we created it in main).
  214.      */
  215. $$ENDIF
  216.     static protected $$AppName$$ applet = null;
  217. $$IF(comments)
  218.  
  219.     /**
  220.      * The frame window if it's currently active.
  221.      */
  222. $$ENDIF
  223.     protected Frame frame;
  224. $$IF(comments)
  225.  
  226.     //--------------------------------------------------------------------------
  227. $$IF(use_DAO)
  228.     // DAO SUPPORT: Variables used for DAO support.
  229. $$ELSE
  230.     // RDO SUPPORT: Variables used for RDO support.
  231. $$ENDIF
  232.     //--------------------------------------------------------------------------
  233.     
  234. $$ENDIF
  235. $$IF(readonly)
  236.     protected boolean readOnly = true;
  237. $$ELSE
  238.     protected boolean readOnly = false;
  239. $$ENDIF
  240. $$IF(use_DAO)
  241.     protected String strDatabase = "$$dbesc$$";
  242. $$IF(recordset)
  243.     protected String strRecordset = "$$recordset$$";
  244. $$ENDIF
  245.     protected int recordCount;
  246.     protected static Variant varEmpty;
  247. $$IF(comments)
  248.     // Valid table not specified via wizard,
  249.     // must specify table name here.
  250.     // protected String strRecordset = "<name>";
  251.  
  252.     // DAO Objects
  253. $$ENDIF
  254.     protected _DBEngine m_IEngine;
  255.     protected Database database;
  256.     protected Recordset recordset;
  257. $$ELSE
  258. $$IF(comments)
  259.     // RDO Data
  260. $$ENDIF
  261.     protected String m_strConnect = "$$ODBC_CONNECT_ESC$$";
  262.     protected String m_strDummyQueryName = "Dummy_Query_$$AppName$$";
  263. $$IF(resultset)
  264.     protected String m_strTable = "$$resultset$$";
  265. $$ENDIF
  266.     protected int recordCount;
  267.  
  268. $$IF(comments)
  269.     // RDO Interfaces
  270. $$ENDIF
  271.     protected static _rdoEngine m_IEngine;
  272.     protected static _rdoEnvironment m_IEnvironment;
  273.     protected static _rdoConnection m_IConnection;
  274.     protected static rdoPreparedStatement m_IPreparedStatement;
  275.     protected static _rdoResultset m_IResultset;
  276.     protected static Variant varEmpty;
  277. $$ENDIF
  278.  
  279. $$IF(comments)
  280.     /**
  281.      * Fields to include in the display and their types.
  282.      * Any fields you didn't select will still appear here, but they will
  283.      * be commented out.  To include a field, just uncomment it.
  284.      */
  285. $$ENDIF
  286.     static DBField[] field =
  287.     {
  288. $$BEGINLOOP(fieldcount)
  289. $$IF(include)
  290.         $$fieldentry$$
  291. $$ELSE
  292.      // $$fieldentry$$
  293. $$ENDIF
  294. $$ENDLOOP       
  295.     };
  296.  
  297. $$IF(comments)
  298.     /**
  299.      * An associative array that maps the string name of a field
  300.      * to the DBField class associated with it.
  301.      */
  302. $$ENDIF
  303.     static Hashtable hashField = new Hashtable();
  304.  
  305.     static 
  306.     {
  307.         for (int i = 0; i < field.length; i++)
  308.         {
  309.             hashField.put(field[i].strName, field[i]);
  310.         }
  311.     }
  312.  
  313. $$IF(comments)
  314.     /**
  315.      * The number of columns to use when laying out fields.
  316.      * If you want to specify anthing other than a fixed number of
  317.      * columns, you can change the initial value of this variable.
  318.      *
  319.      * Here is an example that will ensure that no column has more
  320.      * than 10 rows in it.
  321.      *
  322.      *   protected int columns = (field.length + 9) / 10;
  323.      *
  324.      */
  325. $$ENDIF
  326.     protected int columns = 1;
  327. $$IF(comments)
  328.  
  329.     /**
  330.      * Width of TextFields (in characters)
  331.      */
  332. $$ENDIF
  333.     protected int textFieldWidth = 25;
  334.  
  335. $$IF(comments)
  336.     /**
  337.      * Global vName variant for COM thread safety
  338.      */
  339. $$ENDIF
  340.     Variant vName;
  341. $$IF(comments)
  342.  
  343.     /**
  344.      * Global vValue variant for COM thread safety
  345.      */
  346. $$ENDIF
  347.     Variant vValue;
  348. $$IF(comments)
  349.  
  350.     /**
  351.      * Global vOriginalValue variant for COM thread safety
  352.      */
  353. $$ENDIF
  354.     Variant vOriginalValue;
  355.  
  356. $$IF(comments)
  357.     // Containers of database components
  358. $$ENDIF
  359.     protected Panel db = new Panel();
  360.     protected Panel dbcolumn[] = new Panel[columns * 2];
  361.     
  362. $$IF(comments)
  363.     // Toolbar with "Next", "Prev", "First" and "Last" buttons
  364. $$ENDIF
  365.     protected Panel tools = new Panel();
  366.     protected Panel toolbar = new Panel();
  367.     protected Button buttonFirst = new Button("<< First");
  368.     protected Button buttonPrev = new Button("< Prev");
  369.     protected Button buttonNext = new Button("Next >");
  370.     protected Button buttonLast = new Button("Last >>");
  371.  
  372. $$IF(comments)
  373.     // Toolbar with "Save!" and "Re-read" buttons
  374. $$ENDIF
  375.     protected Panel updatetools = new Panel();
  376.     protected Button buttonUpdate = new Button("Save!");
  377.     protected Button buttonAdd = new Button("Add!");
  378.     protected Button buttonDelete = new Button("Delete!");
  379.     protected Button buttonReread = new Button("Re-read");
  380.     protected Button buttonExit = new Button("Exit");
  381.  
  382. $$IF(comments)
  383.     // User feedback labels for showing current position in database.
  384.     // Need a big empty status label to allow for status string display
  385. $$ENDIF
  386.     protected Panel feedback = new Panel();
  387.     protected Label labelDatabase = new Label("", Label.CENTER);
  388.     protected Label labelRecordset = new Label("", Label.CENTER);
  389.     protected Label labelPosition = new Label("", Label.CENTER);
  390.     protected Label labelStatus = new Label("                                                                                                ");
  391.  
  392. $$IF(comments)
  393.     /**
  394.      * Run the frame window
  395.      */
  396. $$ENDIF
  397.     protected void makeFrame()
  398.     {
  399.         frame = new DBFrame(this, "$$AppName$$"); 
  400.     }
  401.  
  402. $$IF(comments)
  403.     /**
  404.      * Entry point for applications
  405.      * @param args Arguments to the application.
  406.      */
  407. $$ENDIF
  408.     public static void main(String[] args)
  409.     {
  410.         applet = new $$AppName$$();
  411.         applet.makeFrame();
  412.         applet.frame.add("Center", applet);
  413.         applet.init();
  414.         applet.start();
  415.         applet.frame.pack();
  416.         applet.frame.show();
  417.         applet.frame.setResizable(false);
  418.     }
  419.  
  420. $$IF(comments)
  421.     /** 
  422.      * The getAppletInfo() method returns a string describing the applet's
  423.      * author, copyright date, or miscellaneous information.
  424.      */
  425. $$ENDIF
  426.     public String getAppletInfo()
  427.     {
  428.         return "Name: $$AppName$$\n" +
  429.                "Author: Unknown\n" +
  430.                "Created with Microsoft Visual J++ Version 1.1";
  431.     }
  432.  
  433.     public void init()
  434.     {
  435. $$IF(comments)
  436.         //--------------------------------------------------------------------------
  437. $$IF(use_DAO)
  438.         // DAO SUPPORT: Open the database and set up field info
  439.  
  440.         // Initialize database engine through license manager
  441. $$ELSE
  442.         // RDO SUPPORT: Open the data source and set up field info
  443.  
  444.         // Initialize database engine through license manager
  445. $$ENDIF
  446.         //--------------------------------------------------------------------------
  447. $$ENDIF
  448. $$IF(comments)
  449.         // Use a global empty variant for optional variant args
  450. $$ENDIF
  451.         varEmpty = new Variant();
  452.         varEmpty.putEmpty();
  453.  
  454. $$IF(use_DAO)
  455.         ILicenseMgr mgr = new LicenseMgr();
  456.         m_IEngine = (_DBEngine)mgr.createWithLic
  457.         (
  458.             "mbmabptebkjcdlgtjmskjwtsdhjbmkmwtrak",
  459.             "{00000010-0000-0010-8000-00AA006D2EA4}",
  460.             null, 
  461.             ComContext.INPROC_SERVER
  462.         );
  463.  
  464. $$IF(comments)
  465.         // Open database
  466. $$ENDIF
  467.         Variant vExclusive = new Variant();
  468.         Variant vReadOnly = new Variant();
  469.         Variant vConnect = new Variant();
  470.         vExclusive.putBoolean(false);
  471.         vReadOnly.putBoolean(readOnly);
  472.         vConnect.putString("");
  473.         database = m_IEngine.OpenDatabase(strDatabase, vExclusive, vReadOnly, vConnect);
  474.  
  475. $$IF(comments)
  476.         // Create a new recordset
  477. $$ENDIF
  478.         Variant vOpenType = new Variant();
  479.         Variant vOptions = new Variant();
  480.         Variant vLockType = new Variant();
  481. $$// REVIEW: These casts to short probably shouldn't be req'd.
  482. $$// Maybe Variant needs a putShort that takes an int or something.
  483.         vOpenType.putShort((short)RecordsetTypeEnum.dbOpenDynaset);
  484.         vOptions.putShort((short)0);
  485. $$IF(comments)
  486.         // NOTE: The RecordsetOptionEnum.dbReadOnly value is shared by LockTypeEnum
  487.         // There is no LockTypeEnum value denoting read only concurrency
  488. $$ENDIF
  489.         vLockType.putInt(readOnly ? RecordsetOptionEnum.dbReadOnly : LockTypeEnum.dbOptimistic);
  490.         recordset = database.OpenRecordset(strRecordset, vOpenType, vOptions, vLockType);
  491.  
  492. $$IF(comments)
  493.         // Count records in record set
  494. $$ENDIF
  495.         if (recordset.getEOF())
  496.             recordCount = 0;
  497.         else
  498.         {
  499.             int nOptions = 0;
  500.             recordset.MoveLast(nOptions);
  501.             recordCount = recordset.getRecordCount();
  502.             recordset.MoveFirst();
  503.         }
  504. $$ELSE
  505. $$IF(comments)
  506.         // Use the runtime key to get the engine interface
  507. $$ENDIF
  508.         ILicenseMgr mgr = new LicenseMgr();
  509.         m_IEngine = (_rdoEngine)mgr.createWithLic(
  510.             "B1692F60-23B0-11D0-8E95-00A0C90F26F8",
  511.             "{5E71F04C-551F-11CF-8152-00AA00A40C25}",
  512.             null, 
  513.             ComContext.INPROC_SERVER);
  514.  
  515.         m_IEnvironment = m_IEngine.rdoCreateEnvironment("", "", "");
  516.  
  517.         Variant varPromptOption = new Variant();
  518.         Variant varReadOnly = new Variant();
  519.         Variant varConnectString = new Variant();
  520.         Variant varOptions = varEmpty;
  521.  
  522. $$IF(comments)
  523.         // Set the OpenConnection parameters
  524. $$ENDIF
  525.         varPromptOption.putInt(PromptConstants.rdDriverComplete);
  526.         varReadOnly.putBoolean(readOnly);
  527.         varConnectString.putString(m_strConnect);
  528.  
  529. $$IF(comments)
  530.         // Open a connection
  531. $$ENDIF
  532.         m_IConnection = m_IEnvironment.OpenConnection("", varPromptOption,
  533.             varReadOnly, varConnectString, varOptions);
  534.  
  535. $$IF(comments)
  536.         // Set the SQL
  537. $$ENDIF
  538.         String strSQL = "SELECT ";
  539.         for (int nField = 0; nField < field.length; nField++)
  540.         {
  541.             strSQL += field[nField].strName;
  542.             if (nField + 1 < field.length)
  543.                 strSQL += ", ";
  544.         }
  545.         strSQL += " FROM " + m_strTable;
  546.         Variant varSQL = new Variant();
  547.         varSQL.putString(strSQL);
  548.  
  549. $$IF(comments)
  550.         // Set the prepared statement
  551. $$ENDIF
  552.         m_IPreparedStatement = m_IConnection.CreatePreparedStatement(m_strDummyQueryName, varSQL);
  553.  
  554.  
  555. $$IF(comments)
  556.         // Get a resultset, setting cursor type and concurrency
  557. $$ENDIF
  558.         Variant varType = new Variant();
  559.         Variant varConcurrency = new Variant();
  560.         varOptions = varEmpty;
  561.         varType.putInt(ResultsetTypeConstants.rdOpenKeyset);
  562.         varConcurrency.putInt(LockTypeConstants.rdConcurRowVer);
  563.         m_IResultset = m_IConnection.OpenResultset(m_strDummyQueryName,
  564.             varType, varConcurrency, varOptions);
  565.  
  566. $$IF(comments)
  567.         // Don't count records, just set nonzero if not empty
  568. $$ENDIF
  569.         if (!m_IResultset.getEOF())
  570.             recordCount = 1;
  571.  
  572. $$ENDIF    
  573. $$IF(comments)
  574.         // Create COM variants
  575. $$ENDIF
  576.         vName = new Variant();
  577.         vValue = new Variant();
  578.         vOriginalValue = new Variant();
  579.  
  580. $$IF(comments)
  581.         //--------------------------------------------------------------------------
  582. $$IF(use_DAO)
  583.         // DAO SUPPORT: Create, arrange and initialize components for each field.
  584. $$ELSE
  585.         // RDO SUPPORT: Create, arrange and initialize components for each field.
  586. $$ENDIF
  587.         //--------------------------------------------------------------------------
  588.  
  589. $$ENDIF
  590. $$IF(comments)
  591.         // Create column panels
  592. $$ENDIF
  593.         columns *= 2;
  594.         db.setLayout(new GridLayout(0, columns));
  595.         for (int col = 0; col < columns; col++)
  596.         {
  597.             db.add(dbcolumn[col] = new Panel());
  598.             dbcolumn[col].setLayout(new GridLayout(0, 1));
  599.         }
  600.  
  601. $$IF(comments)
  602.         // Add new components for each field
  603. $$ENDIF
  604.         int col = 0;
  605. $$IF(use_DAO)
  606.         Fields fields = recordset.getFields();
  607. $$ELSE
  608.         rdoColumns rdoCols = m_IResultset.getrdoColumns();
  609. $$ENDIF
  610.         for (int i = 0; i < field.length; i++)
  611.         {
  612.             DBField df = (DBField)hashField.get(field[i].strName);
  613.             vName.putString(field[i].strName);
  614. $$IF(use_DAO)
  615.             _Field thisfield = fields.getItem(vName);
  616.             df.strValidation = thisfield.getValidationText();
  617.             df.attributes = thisfield.getAttributes();
  618. $$ELSE
  619.             _rdoColumn rdoCol = rdoCols.getItem(vName);
  620.             df.attributes = rdoCol.getAttributes();
  621. $$ENDIF
  622.             String attribs = new String();
  623.             df.field = new TextField(textFieldWidth);
  624. $$IF(use_DAO)
  625.             if (!readOnly && ((df.attributes & FieldAttributeEnum.dbUpdatableField) == 0))
  626. $$ELSE
  627.             if (!readOnly && ((df.attributes & AttributeConstants.rdUpdatableColumn) == 0))
  628. $$ENDIF
  629.             {
  630.                 attribs += " (ReadOnly)";
  631.                 df.field.disable();
  632.             }
  633. $$IF(use_DAO)
  634.             if ((df.attributes & FieldAttributeEnum.dbAutoIncrField) != 0)
  635. $$ELSE
  636.             if ((df.attributes & AttributeConstants.rdAutoIncrColumn) != 0)
  637. $$ENDIF
  638.             {
  639.                 attribs += " (Auto)";
  640.                 df.field.disable();
  641.             }
  642.             df.label = new Label
  643.             (
  644.                 df.strName + " (" + df.strType + ")" + attribs + " :",
  645.                 Label.RIGHT
  646.             );
  647.             if (readOnly)
  648.             {
  649.                 df.field.disable();
  650.             }
  651.             dbcolumn[col++].add(df.label);
  652.             dbcolumn[col++].add(df.field);
  653.             col %= columns;
  654.         }
  655. $$IF(comments)
  656.         // Set the layout of the toolbar panel
  657. $$ENDIF
  658.         toolbar.setLayout(new GridLayout(1, 0));
  659.         toolbar.add(buttonFirst);
  660.         toolbar.add(buttonPrev);
  661.         toolbar.add(buttonNext);
  662.         toolbar.add(buttonLast);
  663.  
  664. $$IF(comments)
  665.         // Set the layout of the update tools panel
  666. $$ENDIF
  667.         updatetools.setLayout(new GridLayout(1, 0));
  668.         updatetools.add(buttonUpdate);
  669.         updatetools.add(buttonAdd);
  670.         updatetools.add(buttonDelete);
  671.         updatetools.add(buttonReread);
  672.  
  673. $$IF(comments)
  674.         // Combine the tools together
  675. $$ENDIF
  676.         tools.setLayout(new FlowLayout());
  677.         tools.add(toolbar);
  678.         if (!readOnly)
  679.         {
  680.             tools.add(updatetools);
  681.         }
  682.         if (frame != null)
  683.             tools.add(buttonExit);
  684.         
  685. $$IF(comments)
  686.         // Set layout for feedback panel
  687. $$ENDIF
  688.         feedback.setLayout(new GridLayout(0, 1));
  689.         feedback.add(labelDatabase);
  690.         feedback.add(labelRecordset);
  691.         feedback.add(labelPosition);  
  692.         feedback.add(labelStatus);
  693.  
  694. $$IF(comments)
  695.         // Lay out the component groups vertically
  696. $$ENDIF
  697.         GridBagLayout gb = new GridBagLayout();
  698.         setLayout(gb);
  699.         GridBagConstraints c = new GridBagConstraints();
  700.         c.insets = new Insets(20, 30, 20, 30);
  701.         c.gridx = 0;
  702.         add(feedback);
  703.         gb.setConstraints(feedback, c);
  704.         add(db);
  705.         gb.setConstraints(db, c);
  706.         add(tools);
  707.         gb.setConstraints(tools, c);
  708.         
  709. $$IF(comments)
  710.         // Update fields based on current record
  711. $$ENDIF
  712.         updateUI();
  713. $$IF(todo)
  714.  
  715.         // TODO: Place additional initialization code here
  716. $$ENDIF
  717.     }
  718.  
  719. $$IF(comments)
  720.     /**
  721.      * Destroy() is called when your applet is terminating and being unloaded.
  722.      */
  723. $$ENDIF
  724.     public void destroy()
  725.     {
  726. $$IF(todo)
  727.         // TODO: Place applet cleanup code here
  728. $$ENDIF
  729.     }
  730.  
  731. $$IF(comments)
  732.     /**
  733.      * The start() method is called when the page containing the applet
  734.      * first appears on the screen. The AppletWizard's initial implementation
  735.      * of this method starts execution of the applet's thread.
  736.      */
  737. $$ENDIF
  738.     public void start()
  739.     {
  740. $$IF(todo)
  741.         // TODO: Place applet startup code here
  742. $$ENDIF
  743.     }
  744.  
  745. $$IF(comments)
  746.     /**
  747.      * The stop() method is called when the page containing the applet is
  748.      * no longer on the screen.  We get rid of our frame window here (if one
  749.      * exists) and either exit the system (if we're an application) or 
  750.      * enable the button again (if we're an applet).
  751.      */
  752. $$ENDIF
  753.     public synchronized void stop()
  754.     {
  755. $$IF(comments)
  756.         // If started as application, exit
  757. $$ENDIF
  758.         if (frame != null)
  759.             System.exit(0);
  760. $$IF(todo)
  761.  
  762.         // TODO: Place additional applet stop code here
  763. $$ENDIF
  764.     }
  765.  
  766. $$IF(comments)
  767.     /**
  768.      * This method is called when an action occurs inside this component.
  769.      * @param evt Event class with information about the action.
  770.      * @param o Argument object.
  771.      * @return True if the event was handled, false otherwise
  772.      */
  773. $$ENDIF
  774.     public synchronized boolean action(Event evt, Object o)
  775.     {
  776. $$IF(comments)
  777.  
  778.         //--------------------------------------------------------------------------
  779. $$IF(use_DAO)
  780.         // DAO SUPPORT: Perform actions when the user presses a toolbar button
  781. $$ELSE
  782.         // RDO SUPPORT: Perform actions when the user presses a toolbar button
  783. $$ENDIF
  784.         //--------------------------------------------------------------------------
  785.  
  786. $$ENDIF
  787.         labelStatus.setText("");
  788.  
  789.         if (evt.target == buttonFirst)
  790.         {
  791. $$IF(use_DAO)
  792.             recordset.MoveFirst();
  793.             updateUI();
  794. $$ELSE
  795.             m_IResultset.MoveFirst();
  796.             updateUI();
  797.             buttonFirst.enable(false);
  798.             buttonPrev.enable(false);
  799. $$ENDIF
  800.             return true;
  801.         }
  802.         else if (evt.target == buttonPrev)
  803.         {
  804. $$IF(use_DAO)
  805.             recordset.MovePrevious();
  806.             updateUI();
  807. $$ELSE
  808.             m_IResultset.MovePrevious();
  809.             if (m_IResultset.getBOF())
  810.             {
  811.                 buttonPrev.enable(false);
  812.                 labelStatus.setText("Beginning of resultset reached, can't scroll to prior record.");
  813.             }
  814.             else
  815.                 updateUI();
  816. $$ENDIF
  817.             return true;
  818.         }
  819.         else if (evt.target == buttonNext)
  820.         {
  821. $$IF(use_DAO)
  822.             recordset.MoveNext();
  823.             updateUI();
  824. $$ELSE
  825.             m_IResultset.MoveNext();
  826.             if (m_IResultset.getEOF())
  827.             {
  828.                 buttonNext.enable(false);
  829.                 labelStatus.setText("End of resultset reached, can't scroll to next record.");
  830.             }
  831.             else
  832.                 updateUI();
  833. $$ENDIF
  834.             return true;
  835.         }
  836.         else if (evt.target == buttonLast)
  837.         {
  838. $$IF(use_DAO)
  839.             int nOptions = 0;
  840.             recordset.MoveLast(nOptions);
  841.             updateUI();
  842. $$ELSE
  843.             Variant varOptions = varEmpty;
  844.             m_IResultset.MoveLast(varOptions);
  845.             updateUI();
  846.             buttonNext.enable(false);
  847.             buttonLast.enable(false);
  848. $$ENDIF
  849.             return true;
  850.         }
  851.         else if (evt.target == buttonUpdate)
  852.         {
  853.             buttonUpdate.disable();
  854.             buttonAdd.disable();
  855.             buttonUpdate.disable();
  856. $$IF(use_DAO)
  857.             updateDatabase(EditModeEnum.dbEditInProgress);
  858. $$ELSE
  859.             updateDatabase(EditModeConstants.rdEditInProgress);
  860. $$ENDIF
  861.             buttonUpdate.enable();
  862.             buttonAdd.enable();
  863.             buttonDelete.enable();
  864.             return true;
  865.         }
  866.         else if (evt.target == buttonAdd)
  867.         {
  868.             buttonUpdate.disable();
  869.             buttonAdd.disable();
  870.             buttonUpdate.disable();
  871. $$IF(use_DAO)
  872.             updateDatabase(EditModeEnum.dbEditAdd);
  873. $$ELSE
  874.             updateDatabase(EditModeConstants.rdEditAdd);
  875. $$ENDIF
  876.             buttonUpdate.enable();
  877.             buttonAdd.enable();
  878.             buttonDelete.enable();
  879.             return true;
  880.         }
  881.         else if (evt.target == buttonDelete)
  882.         {
  883.             buttonUpdate.disable();
  884.             buttonAdd.disable();
  885.             buttonUpdate.disable();
  886. $$IF(use_DAO)
  887.             updateDatabase(EditModeEnum.dbEditNone);
  888. $$ELSE
  889.             updateDatabase(EditModeConstants.rdEditNone);
  890. $$ENDIF
  891.             buttonUpdate.enable();
  892.             buttonAdd.enable();
  893.             buttonDelete.enable();
  894.             return true;
  895.         }
  896.         else if (evt.target == buttonReread)
  897.         {
  898.             updateUI();
  899.             return true;
  900.         }
  901.         else if (evt.target == buttonExit)
  902.         {
  903.             exit();
  904.         }
  905. $$IF(todo)
  906.  
  907.         // TODO: Place additional action handlers here
  908.  
  909. $$ENDIF
  910.         return false;
  911.     }
  912.  
  913. $$IF(comments)
  914.     /**
  915.      * Close any open results and notify the applet/application to 
  916.      * close this frame window.
  917.      */
  918. $$ENDIF
  919.     protected void exit()
  920.     {
  921. $$IF(comments)
  922. $$IF(use_DAO)
  923.         // Close any open recordset
  924. $$ELSE
  925.         // Close any open resultset
  926. $$ENDIF
  927. $$ENDIF
  928. $$IF(use_DAO)
  929.         if (recordset != null)
  930.         {
  931.             recordset.Close();
  932.             recordset = null;
  933.         }
  934. $$ELSE
  935.         if (m_IResultset != null)
  936.         {
  937.             m_IResultset.Close();
  938.             m_IResultset = null;
  939.         }
  940. $$ENDIF
  941. $$IF(comments)
  942.  
  943.         // Notify the application to exit by calling the
  944.         // stop() method of the applet.
  945. $$ENDIF
  946.         stop();
  947.     }
  948.     
  949. $$IF(comments)
  950.     //--------------------------------------------------------------------------
  951. $$IF(use_DAO)
  952.     // DAO SUPPORT: Methods to update the database and the UI
  953. $$ELSE
  954.     // RDO SUPPORT: Methods to update the database and the UI
  955. $$ENDIF
  956.     //--------------------------------------------------------------------------
  957.  
  958. $$ENDIF
  959. $$IF(comments)
  960.     /**
  961.      * Updates the contents of the TextField associated with a given field
  962.      * using the current record.
  963.      * @param f Field to update
  964.      */
  965. $$ENDIF
  966.     void updateTextField(DBField f)
  967.     {
  968. $$IF(use_DAO)
  969.         if (recordset != null)
  970. $$ELSE
  971.         if (m_IResultset != null)
  972. $$ENDIF
  973.         {
  974.             String strValue;
  975.             try
  976.             {
  977. $$IF(comments)
  978.                 // Get the field's value at the current record
  979. $$ENDIF
  980.                 vName.putString(f.strName);
  981. $$IF(comments)
  982.  
  983.                 // Attempt to get the value
  984. $$ENDIF
  985.                 Variant vValue;
  986. $$IF(use_DAO)
  987.                 vValue = recordset.getCollect(vName);
  988. $$ELSE
  989.                 vValue = m_IResultset.getCollect(vName);
  990. $$ENDIF
  991. $$IF(comments)
  992.  
  993.                 // We want booleans to be 'true' and 'false'
  994. $$ENDIF
  995. $$IF(use_DAO)
  996.                 if (f.vt == Variant.VariantBoolean)
  997. $$ELSE
  998.                 if (f.strType.toUpperCase() == "BIT")
  999. $$ENDIF
  1000.                 {
  1001.                     Boolean b = new Boolean(vValue.getBoolean());
  1002.                     strValue = b.toString();
  1003.                 }
  1004.                 else
  1005.                 {
  1006.                     strValue = vValue.toString();
  1007.                 }
  1008.             }
  1009. $$IF(comments)
  1010.  
  1011.             // Converting a variant of type VT_NULL to a String can cause
  1012.             // this exception to be thrown.
  1013. $$ENDIF
  1014.             catch (ClassCastException c)
  1015.             {
  1016. $$IF(comments)
  1017.                 // Choose "" as the String representation for null.
  1018. $$ENDIF
  1019.                 strValue = "";
  1020.             }
  1021. $$IF(comments)
  1022.  
  1023.             // Set the text of the TextField associated with the field
  1024. $$ENDIF
  1025.             f.field.setText(strValue);
  1026.         }
  1027.     }
  1028.  
  1029. $$IF(comments)
  1030.     /**
  1031.      * Updates the field in the database based on the associated TextField.
  1032.      * @param df Field to update.
  1033.      */
  1034. $$ENDIF
  1035.     void updateDatabaseField(DBField df) throws Exception
  1036.     {
  1037. $$IF(use_DAO)
  1038.         if (recordset != null)
  1039. $$ELSE
  1040.         if (m_IResultset != null)
  1041. $$ENDIF
  1042.         {
  1043.             try
  1044.             {
  1045. $$IF(comments)
  1046.                 // Convert field value to the right variant type
  1047. $$ENDIF
  1048.                 String strValue = df.field.getText();
  1049.                 vValue.putString(strValue);
  1050.                 vName.putString(df.strName);
  1051. $$IF(comments)
  1052.  
  1053.                 // We want booleans to be 'true' and 'false'
  1054. $$ENDIF
  1055. $$IF(use_DAO)
  1056.                 if (df.vt == Variant.VariantBoolean)
  1057. $$ELSE
  1058.                 if (df.strType.toUpperCase() == "BIT")
  1059. $$ENDIF
  1060.                 {
  1061.                     if (strValue.equals("true"))
  1062.                     {
  1063.                         vValue.putBoolean(true);
  1064.                     }
  1065.                     else 
  1066.                     if (strValue.equals("false")) 
  1067.                     {
  1068.                         vValue.putBoolean(false);
  1069.                     }
  1070.                     else
  1071.                     {
  1072.                         throw new Exception(df.strName + " must be either 'true' or 'false' in lowercase.");
  1073.                     }
  1074.                 }
  1075. $$IF(use_DAO)
  1076.                 else
  1077.                 {
  1078. $$IF(comments)
  1079.                     // Convert to variant type
  1080. $$ENDIF
  1081.                     vValue.changeType(df.vt);
  1082.                 }
  1083. $$ENDIF
  1084. $$IF(comments)
  1085.  
  1086.                 // Write to database unless the original value was null
  1087.                 // and the text field is empty.
  1088. $$ENDIF
  1089. $$IF(use_DAO)
  1090.                 vOriginalValue = recordset.getCollect(vName);
  1091. $$ELSE
  1092.                 vOriginalValue = m_IResultset.getCollect(vName);
  1093. $$ENDIF
  1094.                 if (!((vOriginalValue.getvt() == Variant.VariantNull) &&
  1095.                       (strValue.equals(""))))
  1096.                 {
  1097. $$IF(use_DAO)
  1098.                     recordset.putCollect(vName, vValue);
  1099. $$ELSE
  1100.                     m_IResultset.putCollect(vName, vValue);
  1101. $$ENDIF
  1102.                 }
  1103.             }
  1104. $$IF(comments)
  1105.  
  1106.             // Converting a variant of type VT_NULL can cause this exception
  1107. $$ENDIF
  1108.             catch (ClassCastException c)
  1109.             {
  1110.             }
  1111.         }
  1112.     }
  1113.  
  1114. $$IF(comments)
  1115.     /**
  1116.      * Converts an exception into a human readable string possibly involving the
  1117.      * DBField structure and the HRESULT value if it's a COM exception.
  1118.      */
  1119. $$ENDIF
  1120.     protected String getExceptionMessage(Exception e, DBField f)
  1121.     {
  1122.         if (e instanceof ComFailException)
  1123.         {
  1124. $$IF(use_DAO)
  1125.             int h = ((ComFailException)e).getHResult();
  1126.             switch (h)
  1127.             {
  1128.             case 0x800a0c5b:
  1129.                 return "Field value is too long";
  1130.  
  1131.             case 0x800a0cf4:
  1132.                 if ((f == null) || f.strValidation.equals(""))
  1133.                 {
  1134.                     return "Validation rule failed";
  1135.                 }
  1136.                 else
  1137.                 {
  1138.                     return f.strValidation;
  1139.                 }
  1140.  
  1141.             default:
  1142.                 return "DAO COM Exception " + e.getMessage();
  1143.             }
  1144. $$ELSE
  1145.             return "RDO COM Exception " + e.getMessage();
  1146. $$ENDIF
  1147.         }
  1148.         return e.getMessage();
  1149.     }
  1150.  
  1151. $$IF(comments)
  1152.     /**
  1153.      * Updates the database from the information in the TextFields.
  1154.      */
  1155. $$ENDIF
  1156.     protected void updateDatabase(int nMode)
  1157.     {
  1158. $$IF(comments)
  1159.         // Update each field
  1160. $$ENDIF
  1161.         try
  1162.         {
  1163. $$IF(comments)
  1164.             // If no mode, must be a delete
  1165. $$ENDIF
  1166. $$IF(use_DAO)
  1167.             if (nMode == EditModeEnum.dbEditNone)
  1168.             {
  1169.                 recordset.Delete();
  1170.  
  1171. $$IF(comments)
  1172.                 // If deleting last record, scroll back
  1173. $$ENDIF
  1174.                 recordset.MoveNext();
  1175.                 if (recordset.getEOF())
  1176.                     recordset.MovePrevious();
  1177. $$IF(comments)
  1178.  
  1179.                 // Decrement the record count
  1180. $$ENDIF
  1181.                 recordCount--;
  1182.             }
  1183. $$IF(comments)
  1184.             // Go into edit/addnew mode to change the recordset
  1185. $$ENDIF
  1186.             else
  1187.             {
  1188.                 if (nMode == EditModeEnum.dbEditAdd)
  1189.                     recordset.AddNew();
  1190.                 else
  1191.                     recordset.Edit();
  1192.  
  1193. $$ELSE
  1194.             if (nMode == EditModeConstants.rdEditNone)
  1195.             {
  1196.                 m_IResultset.Delete();
  1197.  
  1198.                 m_IResultset.MoveNext();
  1199.  
  1200. $$IF(comments)
  1201.                 // If deleting last record, scroll back
  1202. $$ENDIF
  1203.                 if (m_IResultset.getEOF())
  1204.                 {
  1205.                     m_IResultset.MovePrevious();
  1206.  
  1207. $$IF(comments)
  1208.                     // If all records deleted set the record count to 0
  1209. $$ENDIF
  1210.                     if (m_IResultset.getBOF())
  1211.                         recordCount = 0;
  1212.                 }
  1213.             }
  1214. $$IF(comments)
  1215.             // Go into edit/addnew mode to change the recordset
  1216. $$ENDIF
  1217.             else
  1218.             {
  1219.                 if (nMode == EditModeConstants.rdEditAdd)
  1220.                     m_IResultset.AddNew();
  1221.                 else
  1222.                     m_IResultset.Edit();
  1223.  
  1224. $$ENDIF
  1225.                 int i;
  1226.                 for (i = 0; i < field.length; i++)
  1227.                 {
  1228. $$IF(comments)
  1229.                     // If the field is updatable and it is not autoincrement
  1230. $$ENDIF
  1231. $$IF(use_DAO)
  1232.                     if (((field[i].attributes & FieldAttributeEnum.dbUpdatableField) != 0) &&
  1233.                         ((field[i].attributes & FieldAttributeEnum.dbAutoIncrField) == 0))
  1234. $$ELSE
  1235.                     if (((field[i].attributes & AttributeConstants.rdUpdatableColumn) != 0) &&
  1236.                         ((field[i].attributes & AttributeConstants.rdAutoIncrColumn) == 0))                
  1237. $$ENDIF
  1238.                     {
  1239.                         try
  1240.                         {
  1241. $$IF(comments)
  1242.                             // Try to update the field.
  1243. $$ENDIF
  1244.                             updateDatabaseField(field[i]);
  1245.                         }
  1246.                         catch (Exception e)
  1247.                         {
  1248. $$IF(comments)
  1249.                             // If the update failed, alert the user and cancel the update
  1250. $$ENDIF
  1251.                             String strError;
  1252.                             strError = "Error updating " + field[i].strName + " : " + getExceptionMessage(e, field[i]);
  1253.                             if (frame != null)
  1254.                                 new Alert(frame, "Modification Failed!", strError);
  1255.                             else
  1256.                                 labelStatus.setText(strError);
  1257. $$IF(use_DAO)
  1258.                             recordset.CancelUpdate(UpdateTypeEnum.dbUpdateRegular);
  1259. $$ELSE
  1260.                             m_IResultset.CancelUpdate();
  1261. $$ENDIF
  1262.                             break;
  1263.                         }
  1264.                     }
  1265.                 }
  1266.                 if (i == field.length)
  1267.                 {
  1268. $$IF(comments)
  1269.                     // Commit the update
  1270. $$ENDIF
  1271. $$IF(use_DAO)
  1272.                     recordset.Update(UpdateTypeEnum.dbUpdateRegular, false);
  1273.                     if (nMode == EditModeEnum.dbEditAdd)
  1274.                     {
  1275. $$IF(comments)
  1276.                         // Increment the record count
  1277. $$ENDIF
  1278.                         recordCount++;
  1279.  
  1280. $$IF(comments)
  1281.                         // If adding to empty recordset make sure to set currency
  1282. $$ENDIF
  1283.                         if (recordset.getEOF())
  1284.                             recordset.MoveFirst();
  1285.                     }
  1286. $$ELSE
  1287.                     m_IResultset.Update();
  1288.  
  1289.                     if (nMode == EditModeConstants.rdEditAdd)
  1290.                     {
  1291. $$IF(comments)
  1292.                         // Make sure recordCount not zero now
  1293. $$ENDIF
  1294.                         recordCount = 1;
  1295.  
  1296. $$IF(comments)
  1297.                         // If adding to empty recordset make sure to set currency
  1298. $$ENDIF
  1299.                         if (m_IResultset.getEOF())
  1300.                             m_IResultset.MoveFirst();
  1301.                     }
  1302. $$ENDIF
  1303.                 }
  1304.             }
  1305.         }
  1306. $$IF(use_DAO)
  1307.         catch (ComException eCom)
  1308.         {
  1309.             String strError = new String();
  1310.             Errors errs = m_IEngine.getErrors();
  1311.             Variant var = new Variant();
  1312.  
  1313.             for (int n = 0; n < errs.getCount(); n++)
  1314.             {
  1315.                 var.putInt(n);
  1316.                 dao350.Error err = errs.getItem(var);
  1317.                 if (nMode == EditModeEnum.dbEditAdd)
  1318.                     strError += "Error adding record: ";
  1319.                 else if (nMode == EditModeEnum.dbEditInProgress)
  1320.                     strError += "Error updating record: ";
  1321.                 else
  1322.                     strError += "Error deleting record: ";
  1323.                 
  1324.                 strError += err.getDescription();
  1325.             }
  1326.  
  1327.             if (frame != null)
  1328.                 new Alert(frame, "Modification Failed!", strError);
  1329.             else
  1330.                 labelStatus.setText(strError);
  1331.         }
  1332. $$ELSE
  1333.         catch (ComException eCom)
  1334.         {
  1335.             String strError = new String();
  1336.             rdoErrors errs = m_IEngine.getrdoErrors();
  1337.             Variant var = new Variant();
  1338.  
  1339.             for (int n = 0; n < errs.getCount(); n++)
  1340.             {
  1341.                 var.putInt(n);
  1342.                 rdoError err = errs.getItem(var);
  1343.                 if (nMode == EditModeConstants.rdEditAdd)
  1344.                     strError += "Error adding record: ";
  1345.                 else if (nMode == EditModeConstants.rdEditInProgress)
  1346.                     strError += "Error updating record: ";
  1347.                 else
  1348.                     strError += "Error deleting record: ";
  1349.                 
  1350.                 strError += err.getDescription();
  1351.             }
  1352.  
  1353.             if (frame != null)
  1354.                 new Alert(frame, "Modification Failed!", strError);
  1355.             else
  1356.                 labelStatus.setText(strError);
  1357.         }
  1358. $$ENDIF
  1359.         catch (Exception e)
  1360.         {
  1361. $$IF(comments)
  1362.             // Failed to update the table in the database
  1363. $$ENDIF
  1364.             String strError;
  1365.             strError = "Error updating record: " + getExceptionMessage(e, null);
  1366.             if (frame != null)
  1367.                 new Alert(frame, "Modification Failed!", strError);
  1368.             else
  1369.                 labelStatus.setText(strError);
  1370.         }
  1371.         updateUI();
  1372.     }
  1373.  
  1374. $$IF(comments)
  1375.     /**
  1376.      * Updates all TextFields using the field array.  Then updates all feedback 
  1377.      * labels based on the current record.
  1378.      */
  1379. $$ENDIF
  1380.     protected void updateUI()
  1381.     {
  1382. $$IF(use_DAO)
  1383.         int pos = -1;
  1384. $$ENDIF
  1385. $$IF(comments)
  1386.         // Update each field if there are records
  1387. $$ENDIF
  1388.         if (recordCount > 0)
  1389.         {
  1390.             for (int i = 0; i < field.length; i++)
  1391.             {
  1392.                 try
  1393.                 {
  1394.                     updateTextField(field[i]);
  1395.                 }
  1396.                 catch (Exception e)
  1397.                 {
  1398. $$IF(comments)
  1399.                 // Getting the field value failed for some reason
  1400. $$ENDIF
  1401.                 String strError;
  1402.                 strError = "Error retrieving field value for " + field[i].strName + " : " + e.getMessage();
  1403.                 if (frame != null)
  1404.                     new Alert(frame, "Data Fetch Failed!", strError);
  1405.                 else
  1406.                     labelStatus.setText(strError);
  1407.                 break;
  1408.                 }
  1409.             }
  1410.  
  1411. $$IF(use_DAO)
  1412.             pos = recordset.getAbsolutePosition();
  1413. $$ENDIF
  1414.         }
  1415.  
  1416. $$IF(comments)
  1417.         // Set the states of the buttons and the feedback labels
  1418. $$ENDIF
  1419. $$IF(use_DAO)
  1420.         buttonFirst.enable(pos != 0 && recordCount > 0);
  1421.         buttonPrev.enable(pos != 0 && recordCount > 0);
  1422.         buttonNext.enable(pos != (recordCount - 1));
  1423.         buttonLast.enable(pos != (recordCount - 1));
  1424.         labelDatabase.setText("Database: " + strDatabase + (readOnly ? " (Read Only)" : ""));
  1425.         labelRecordset.setText("Table: " + strRecordset);
  1426.         labelPosition.setText("Record: " + (pos + 1) + " of " + recordCount);
  1427. $$ELSE
  1428.         buttonFirst.enable(recordCount > 0);
  1429.         buttonPrev.enable(recordCount > 0);
  1430.         buttonNext.enable(recordCount > 0);
  1431.         buttonLast.enable(recordCount > 0);
  1432.         labelDatabase.setText("Datasource: $$DSN$$" + (readOnly ? " (Read Only)" : ""));
  1433.         labelRecordset.setText("Table: " + m_strTable);
  1434. $$ENDIF
  1435.         if (recordCount == 0)
  1436.             labelStatus.setText("There are no records in the table!");
  1437.     }
  1438. $$IF(todo)
  1439.  
  1440.     // TODO: Place additional applet code here
  1441. $$ENDIF
  1442. }
  1443.  
  1444. $$IF(comments)
  1445. ///////////////////////////////// End of File /////////////////////////////////
  1446. $$ENDIF
  1447.