From d02d6a5cdc156170151ed54b51f70b7f6bdce327 Mon Sep 17 00:00:00 2001 From: Ze Zhang Date: Mon, 31 Oct 2022 06:07:07 +0000 Subject: [PATCH] Updates for JTOpen 11.1 --- demos/.project | 11 + demos/ToolboxME/JdbcDemo.java | 834 ++++++++++++++++++ demos/ToolboxME/JdbcMidpBid.java | 522 +++++++++++ demos/ToolboxME/PrimeRealEstateDB.java | 293 ++++++ demos/ToolboxME/ToolboxMidpDemo.java | 706 +++++++++++++++ demos/qcdemo/LICENSE.TXT | 166 ++++ demos/qcdemo/README.TXT | 27 + .../QCDemo/QCCommandButtonPanel.form | 21 + .../QCDemo/QCCommandButtonPanel.java | 66 ++ .../QCDemo/QCCommandButtonPanelBeanInfo.java | 315 +++++++ .../JTOpenContrib/QCDemo/QCCommandPanel.form | 94 ++ .../JTOpenContrib/QCDemo/QCCommandPanel.java | 296 +++++++ .../QCDemo/QCCommandPanelBeanInfo.java | 315 +++++++ .../JTOpenContrib/QCDemo/QCDemo.java | 31 + .../JTOpenContrib/QCDemo/QCDetailsPane.java | 51 ++ .../QCDemo/QCDetailsPaneBeanInfo.java | 337 +++++++ .../JTOpenContrib/QCDemo/QCExplorerPane.java | 51 ++ .../QCDemo/QCExplorerPaneBeanInfo.java | 343 +++++++ .../JTOpenContrib/QCDemo/QCHash.java | 172 ++++ .../JTOpenContrib/QCDemo/QCIFSPanel.form | 165 ++++ .../JTOpenContrib/QCDemo/QCIFSPanel.java | 392 ++++++++ .../QCDemo/QCIFSPanelBeanInfo.java | 315 +++++++ .../JTOpenContrib/QCDemo/QCJdbcURL.java | 181 ++++ .../JTOpenContrib/QCDemo/QCJobListPanel.form | 140 +++ .../JTOpenContrib/QCDemo/QCJobListPanel.java | 250 ++++++ .../QCDemo/QCJobListPanelBeanInfo.java | 315 +++++++ .../JTOpenContrib/QCDemo/QCListPane.java | 51 ++ .../QCDemo/QCListPaneBeanInfo.java | 335 +++++++ .../SoftWoehr/JTOpenContrib/QCDemo/QCMgr.java | 400 +++++++++ .../JTOpenContrib/QCDemo/QCMgrViewer.form | 53 ++ .../JTOpenContrib/QCDemo/QCMgrViewer.java | 126 +++ .../QCDemo/QCMgrViewerBeanInfo.java | 315 +++++++ .../JTOpenContrib/QCDemo/QCNotebookPanel.form | 133 +++ .../JTOpenContrib/QCDemo/QCNotebookPanel.java | 131 +++ .../QCDemo/QCNotebookPanelBeanInfo.java | 313 +++++++ .../QCDemo/QCPrinterListPanel.form | 89 ++ .../QCDemo/QCPrinterListPanel.java | 228 +++++ .../QCDemo/QCPrinterListPanelBeanInfo.java | 315 +++++++ .../QCDemo/QCSQLQueryBuilderPanel.form | 187 ++++ .../QCDemo/QCSQLQueryBuilderPanel.java | 344 ++++++++ .../QCSQLQueryBuilderPanelBeanInfo.java | 313 +++++++ .../QCDemo/QCSQLResultSetFormPanel.form | 31 + .../QCDemo/QCSQLResultSetFormPanel.java | 78 ++ .../QCSQLResultSetFormPanelBeanInfo.java | 313 +++++++ .../QCDemo/QCSQLResultSetTablePanel.form | 31 + .../QCDemo/QCSQLResultSetTablePanel.java | 78 ++ .../QCSQLResultSetTablePanelBeanInfo.java | 313 +++++++ .../JTOpenContrib/QCDemo/QCServiceClient.java | 27 + .../JTOpenContrib/QCDemo/QCServiceHash.java | 113 +++ .../JTOpenContrib/QCDemo/QCServiceRecord.java | 28 + .../QCDemo/QCSpooledFileViewerPanel.form | 144 +++ .../QCDemo/QCSpooledFileViewerPanel.java | 225 +++++ .../QCSpooledFileViewerPanelBeanInfo.java | 315 +++++++ .../JTOpenContrib/QCDemo/QCTopFrame.form | 54 ++ .../JTOpenContrib/QCDemo/QCTopFrame.java | 103 +++ .../QCDemo/QCTopFrameBeanInfo.java | 299 +++++++ .../JTOpenContrib/QCDemo/QCTreePane.java | 51 ++ .../QCDemo/QCTreePaneBeanInfo.java | 333 +++++++ .../JTOpenContrib/QCDemo/QCUserListPanel.form | 83 ++ .../JTOpenContrib/QCDemo/QCUserListPanel.java | 194 ++++ .../QCDemo/QCUserListPanelBeanInfo.java | 315 +++++++ .../QCDemo/QCVNodeDisplayer.java | 32 + demos/qcdemo/html/images/QCCommandPanel.jpg | Bin 0 -> 39546 bytes .../qcdemo/html/images/QCCommandPanelBad.jpg | Bin 0 -> 46098 bytes .../html/images/QCConnectionManagerViewer.jpg | Bin 0 -> 37290 bytes demos/qcdemo/html/images/QCIFSPanel.jpg | Bin 0 -> 93920 bytes demos/qcdemo/html/images/QCJobListPanel.jpg | Bin 0 -> 38797 bytes .../qcdemo/html/images/QCPrinterListPanel.jpg | Bin 0 -> 45057 bytes .../html/images/QCSQLQueryBuilderPanel.jpg | Bin 0 -> 51594 bytes .../html/images/QCSQLResultFormPanel.jpg | Bin 0 -> 28370 bytes .../html/images/QCSQLResultTablePanel.jpg | Bin 0 -> 42768 bytes .../qcdemo/html/images/QCSpooledFilePanel.jpg | Bin 0 -> 62033 bytes demos/qcdemo/html/images/QCUserListPanel.jpg | Bin 0 -> 31572 bytes demos/qcdemo/html/index.html | 95 ++ demos/qcdemo/html/progman.html | 91 ++ demos/qcdemo/html/userman.html | 464 ++++++++++ .../util/ChangeValidationListEntry.java | 114 +++ .../util/CompareValidationListEntries.java | 156 ++++ .../util/DeleteValidationListEntry.java | 90 ++ .../util/InsertValidationListEntry.java | 114 +++ .../util/ListValidationListEntries.java | 95 ++ ...rieveValidationListEntryEncryptedData.java | 94 ++ .../as400/access/util/ValidationListUtil.java | 58 ++ 83 files changed, 14273 insertions(+) create mode 100644 demos/.project create mode 100644 demos/ToolboxME/JdbcDemo.java create mode 100644 demos/ToolboxME/JdbcMidpBid.java create mode 100644 demos/ToolboxME/PrimeRealEstateDB.java create mode 100644 demos/ToolboxME/ToolboxMidpDemo.java create mode 100644 demos/qcdemo/LICENSE.TXT create mode 100644 demos/qcdemo/README.TXT create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandButtonPanel.form create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandButtonPanel.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandButtonPanelBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandPanel.form create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandPanel.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandPanelBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCDemo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCDetailsPane.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCDetailsPaneBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCExplorerPane.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCExplorerPaneBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCHash.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCIFSPanel.form create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCIFSPanel.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCIFSPanelBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJdbcURL.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJobListPanel.form create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJobListPanel.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJobListPanelBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCListPane.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCListPaneBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgr.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgrViewer.form create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgrViewer.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgrViewerBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCNotebookPanel.form create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCNotebookPanel.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCNotebookPanelBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCPrinterListPanel.form create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCPrinterListPanel.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCPrinterListPanelBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLQueryBuilderPanel.form create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLQueryBuilderPanel.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLQueryBuilderPanelBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetFormPanel.form create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetFormPanel.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetFormPanelBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetTablePanel.form create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetTablePanel.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetTablePanelBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCServiceClient.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCServiceHash.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCServiceRecord.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSpooledFileViewerPanel.form create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSpooledFileViewerPanel.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSpooledFileViewerPanelBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTopFrame.form create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTopFrame.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTopFrameBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTreePane.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTreePaneBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCUserListPanel.form create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCUserListPanel.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCUserListPanelBeanInfo.java create mode 100644 demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCVNodeDisplayer.java create mode 100644 demos/qcdemo/html/images/QCCommandPanel.jpg create mode 100644 demos/qcdemo/html/images/QCCommandPanelBad.jpg create mode 100644 demos/qcdemo/html/images/QCConnectionManagerViewer.jpg create mode 100644 demos/qcdemo/html/images/QCIFSPanel.jpg create mode 100644 demos/qcdemo/html/images/QCJobListPanel.jpg create mode 100644 demos/qcdemo/html/images/QCPrinterListPanel.jpg create mode 100644 demos/qcdemo/html/images/QCSQLQueryBuilderPanel.jpg create mode 100644 demos/qcdemo/html/images/QCSQLResultFormPanel.jpg create mode 100644 demos/qcdemo/html/images/QCSQLResultTablePanel.jpg create mode 100644 demos/qcdemo/html/images/QCSpooledFilePanel.jpg create mode 100644 demos/qcdemo/html/images/QCUserListPanel.jpg create mode 100644 demos/qcdemo/html/index.html create mode 100644 demos/qcdemo/html/progman.html create mode 100644 demos/qcdemo/html/userman.html create mode 100644 demos/validationlist/com/kingland/as400/access/util/ChangeValidationListEntry.java create mode 100644 demos/validationlist/com/kingland/as400/access/util/CompareValidationListEntries.java create mode 100644 demos/validationlist/com/kingland/as400/access/util/DeleteValidationListEntry.java create mode 100644 demos/validationlist/com/kingland/as400/access/util/InsertValidationListEntry.java create mode 100644 demos/validationlist/com/kingland/as400/access/util/ListValidationListEntries.java create mode 100644 demos/validationlist/com/kingland/as400/access/util/RetrieveValidationListEntryEncryptedData.java create mode 100644 demos/validationlist/com/kingland/as400/access/util/ValidationListUtil.java diff --git a/demos/.project b/demos/.project new file mode 100644 index 000000000..6855a11d6 --- /dev/null +++ b/demos/.project @@ -0,0 +1,11 @@ + + + demos + + + + + + + + diff --git a/demos/ToolboxME/JdbcDemo.java b/demos/ToolboxME/JdbcDemo.java new file mode 100644 index 000000000..e2963ee5c --- /dev/null +++ b/demos/ToolboxME/JdbcDemo.java @@ -0,0 +1,834 @@ +////////////////////////////////////////////////////////////////////////////////// +// +// ToolboxME for iSeries example. This program demonstrates how your wireless +// device can connect to an iSeries server and use JDBC to perform work on a +// remote database. +// +////////////////////////////////////////////////////////////////////////////////// + +import java.sql.*; // SQL Interfaces provided by JdbcMe +import com.ibm.as400.micro.*; // JdbcMe implementation +import java.awt.*; +import java.awt.event.*; +import java.io.*; +import javax.microedition.io.*; // Part of the CLDC specification +import de.kawt.*; // Part of the CLDC specification + +class DemoConstants +{ + // These constants are actually used mainly by the demo + // for the JDBC driver. The Jdbc and JDBC application + // creator IDs ( http://www.palmos.com/dev ) + // are reserved at palm computing. + public static final int demoAppID = 0x4a444243; // JDBC + // Make the dbCreator something else so that the + // user can actually see the Palm DB seperately from + // the JdbcDemo application. + public static final int dbCreator = 0x4a444231; // JDB1 + public static final int dbType = 0x4a444231; // JDB1 +} + +/** + * Little configuration dialog box to display the + * current connections/statements, the + * URL being used, user id and password + */ +class ConfigurationDialog extends Dialog implements ActionListener +{ + TextField data; + ConfigurationDialog(Frame w) + { + super(w, "Configuration"); + + // Show/Modify current URL connection + data = new TextField(JdbcDemo.mainFrame.jdbcPanel.url); + add("Center", data); + + // Ok button. + Panel panel = new Panel(); + Button button = new Button("Ok"); + button.addActionListener(this); + panel.add(button); + add("South", panel); + pack(); + } + + public void actionPerformed(ActionEvent e) + { + JdbcDemo.mainFrame.jdbcPanel.url = data.getText(); + data = null; + setVisible(false); + } +} + +/** + * Little configuration dialog box to display the + * current connections/statements, the + * URL being used, user id and password + */ +class MultiChoiceDialog extends Dialog implements ActionListener +{ + Choice task; + ActionListener theListener; + MultiChoiceDialog(Frame w, String title, String prompt, String choices[], ActionListener it) + { + super(w, title); + theListener = it; + + // Show/Modify current URL connection + Label txt = new Label(prompt); + add("West", txt); + task = new Choice(); + for (int i=0; i=count; ++i) + { + data.add(rs.getString(i)); + } + } + data.repaint(); + } + catch (Exception e) + { + JdbcDemo.mainFrame.exceptionFeedback(e); + } + } + + + /** + * Move to the previous row in the result set. + **/ + public void goPrevRow() + { + try + { + if (rs == null || rsmd == null) + return; + + int count = rsmd.getColumnCount(); + int i; + data.removeAll(); + if (!rs.previous()) + data.add("Start of data"); + else + { + for (i=1; i<=count; ++i) + { + data.add(rs.getString(i)); + } + } + data.repaint(); + } + catch (Exception e) + { + JdbcDemo.mainFrame.exceptionFeedback(e); + } + } + + /** + * Perform a query and store the results in the local devices database + **/ + public void goResultsToPalmDB() + { + try + { + if (stmtObject == null) + { + FeedbackDialog dialog = new FeedbackDialog(JdbcDemo.mainFrame, "Skip", "No Statement"); + dialog.show(); + dialog = null; + return; + } + + boolean results = ((JdbcMeStatement)stmtObject).executeToOfflineData(sql.getText(), "JdbcResultSet", DemoConstants.dbCreator, DemoConstants.dbType); + if (!results) + { + FeedbackDialog dialog = new FeedbackDialog(JdbcDemo.mainFrame, "No Data", "Not a query"); + dialog.show(); + dialog = null; + return; + } + data.removeAll(); + data.add("Updated Palm DB 'JdbcResultSet'"); + data.repaint(); + } + catch (Exception e) + { + JdbcDemo.mainFrame.exceptionFeedback(e); + } + } + + + /** + * Perform a query from the database that resides on the palm device. + **/ + public void goQueryFromPalmDB() + { + try + { + if (rs != null) + { + rs.close(); + rs = null; + } + rs = new JdbcMeOfflineResultSet ("JdbcResultSet", DemoConstants.dbCreator, DemoConstants.dbType); + rsmd = rs.getMetaData(); + // If we want to debug some output, this + // method can be used to dump the contents + // of the PalmDB represented by the result set + // (Uses System.out so its mostly useful in + // the Palm emulator when debugging your + // applications. + // ((JdbcMeOfflineResultSet)rs).dumpDB(true); + + // show the first row. + goNextRow(); + } + catch (SQLException e) + { + JdbcDemo.mainFrame.exceptionFeedback(e); + } + } +} + +public class JdbcDemo extends Frame +{ + /** An ActionListener that ends the application. Only + * one is required, and can be reused + */ + private static ActionListener exitActionListener = null; + /** + * The main application in this process. + */ + static JdbcDemo mainFrame = null; + + JdbcPanel jdbcPanel = null; + + public static ActionListener getExitActionListener() + { + if (exitActionListener == null) + { + exitActionListener = new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + System.exit(0); + } + }; + } + return exitActionListener; + } + + /** + * Demo Constructor + **/ + public JdbcDemo() + { + super("Jdbc Demo"); + setLayout(new BorderLayout()); + + jdbcPanel = new JdbcPanel(); + add("Center", jdbcPanel); + + addWindowListener(new WindowAdapter() + { + public void windowClosing(WindowEvent e) + { + System.exit(0); + } + }); + setSize(200,300); + pack(); + } + + public void exceptionFeedback(Exception e) + { + Dialog dialog = new FeedbackDialog(JdbcDemo.mainFrame, e); + dialog.show(); + dialog = null; + } + + /** + * Main method. + **/ + public static void main(String args[]) + { + try + { + mainFrame = new JdbcDemo(); + mainFrame.show(); + mainFrame.jdbcPanel.goConfigure(); + } + catch (Exception e) + { + System.exit(1); + } + } +} diff --git a/demos/ToolboxME/JdbcMidpBid.java b/demos/ToolboxME/JdbcMidpBid.java new file mode 100644 index 000000000..6d1bb86c0 --- /dev/null +++ b/demos/ToolboxME/JdbcMidpBid.java @@ -0,0 +1,522 @@ +////////////////////////////////////////////////////////////////////////////////// +// +// ToolboxME for iSeries example. This program is an example MIDlet that shows how +// you might code a JdbcMe application for the MIDP profile. Refer to the +// startApp, pauseApp, destroyApp and commandAction methods to see how it handles +// each requested transition. +// +////////////////////////////////////////////////////////////////////////////////// + +import javax.microedition.midlet.*; +import javax.microedition.lcdui.*; +import java.sql.*; +import javax.microedition.rms.*; + +import com.ibm.as400.micro.*; + + +public class JdbcMidpBid extends MIDlet implements CommandListener +{ + private static int BID_PROPERTY = 0; + private Display display; + + private TextField urlText = new TextField("urltext", "jdbc:as400://mySystem;user=myUid;password=myPwd;", 65, TextField.ANY); + private TextField jdbcmeText = new TextField("jdbcmetext", "meserver=myMEServer", 40, TextField.ANY); + private TextField jdbcmeTraceText = new TextField("jdbcmetracetext", "0", 10, TextField.ANY); + private final static String GETBIDS = "No bids are available, select here to download bids"; + private List main = new List("JdbcMe Bid Demo", Choice.IMPLICIT); + private List listings = null; + private Form aboutBox; + private Form bidForm; + private Form settingsForm; + private int bidRow = 0; + private String bidTarget = null; + private String bidTargetKey = null; + private TextField bidText = new TextField("bidtext", "", 10, TextField.NUMERIC); + private Form errorForm = null; + + private Command exitCommand = new Command("Exit", Command.SCREEN, 0); + private Command backCommand = new Command("Back", Command.SCREEN, 0); + private Command cancelCommand = new Command("Cancel", Command.SCREEN, 0); + private Command goCommand = new Command("Go", Command.SCREEN, 1); + private Displayable onErrorGoBackTo = null; + + /* + * Construct a new JdbcMidpBid. + */ + public JdbcMidpBid() + { + display = Display.getDisplay(this); + } + + /** + * Show the main screen + */ + public void startApp() + { + main.append("Show Bids", null); + main.append("Get New Bids", null); + main.append("Settings", null); + main.append("About", null); + main.addCommand(exitCommand); + main.setCommandListener(this); + + display.setCurrent(main); + } + + public void commandAction(Command c, Displayable s) + { + // All exitCommand processing is the same. + if (c == exitCommand) + { + destroyApp(false); + notifyDestroyed(); + return; + } + if (s instanceof List) + { + List current = (List)s; + + // An action occurred on the main page + if (current == main) + { + int idx = current.getSelectedIndex(); + switch (idx) + { + case 0: // Show current bids + showBids(); + break; + case 1: // Get New Bids + getNewBids(); + break; + case 2: // Settings + doSettings(); + break; + case 3: // About + aboutBox(); + break; + default : + break; + } + return; + } // current == main + + // An action occurred on the listings page + if (current == listings) + { + if (c == backCommand) + { + display.setCurrent(main); + return; + } + if (c == List.SELECT_COMMAND) + { + int idx = listings.getSelectedIndex(); + String stext = listings.getString(idx); + if (stext.equals(GETBIDS)) + { + getNewBids(); + return; + } + int commaIdx = stext.indexOf(','); + bidTargetKey = stext.substring(0, commaIdx); + bidTarget = stext.substring(commaIdx+1) + "\n"; + // Also keep track of which offline result set row + // This is. It happens to be the same as the index + // in the list. + bidRow = idx; + + bidOnProperty(); + } + } // current == listings + return; + } // instanceof List + if (s instanceof Form) + { + Form current = (Form)s; + if (current == errorForm) + { + if (c == backCommand) + display.setCurrent(onErrorGoBackTo); + + return; + } // errorForm + if (current == settingsForm) + { + if (c == backCommand) + { + // Done with settings. + display.setCurrent(main); + settingsForm = null; + return; + } + } // settingsForm + if (current == aboutBox) + { + if (c == backCommand) + { + // Done with about box. + display.setCurrent(main); + aboutBox = null; + return; + } + } + if (current == bidForm) + { + if (c == cancelCommand) + { + display.setCurrent(listings); + bidForm = null; + return; + } + if (c == goCommand) + { + submitBid(); + if (display.getCurrent() != bidForm) + { + // If we're no longer positioned at the + // bidForm, we will get rid of it. + bidForm = null; + } + return; + } + return; + } // current == bidForm + } // instanceof Form + } + + public void aboutBox() + { + aboutBox = new Form("aboutbox"); + aboutBox.setTitle("About"); + aboutBox.append(new StringItem("", "Midp RealEstate example for JdbcMe ")); + aboutBox.addCommand(backCommand); + aboutBox.setCommandListener(this); + display.setCurrent(aboutBox); + } + + /** + * The settings form. + */ + public void doSettings() + { + settingsForm = new Form("settingsform"); + settingsForm.setTitle("Settings"); + settingsForm.append(new StringItem("", "DB URL")); + settingsForm.append(urlText); + settingsForm.append(new StringItem("", "JdbcMe server")); + settingsForm.append(jdbcmeText); + settingsForm.append(new StringItem("", "Trace")); + + settingsForm.addCommand(backCommand); + settingsForm.setCommandListener(this); + display.setCurrent(settingsForm); + } + + + /** + * Show the bid screen for the bid target + * that we selected. + */ + public void bidOnProperty() + { + StringItem item = new StringItem("", bidTarget); + + bidText = new TextField("bidtext", "", 10, TextField.NUMERIC); + bidText.setString(""); + + bidForm = new Form("bidform"); + bidForm.setTitle("Submit a bid for:"); + BID_PROPERTY = 0; + bidForm.append(item); + bidForm.append(new StringItem("", "Your bid:")); + bidForm.append(bidText); + bidForm.addCommand(cancelCommand); + bidForm.addCommand(goCommand); + bidForm.setCommandListener(this); + display.setCurrent(bidForm); + } + + /** + * Update the listings card with the + * current list of bids that we're interested in. + */ + public void getNewBids() + { + // Reset the old listing + listings = null; + listings = new List("JdbcMe Bids", Choice.IMPLICIT); + java.sql.Connection conn = null; + Statement stmt = null; + try + { + conn = DriverManager.getConnection(urlText.getString() + ";" + jdbcmeText.getString()); + + stmt = conn.createStatement(); + + // Since we don't want the prepared statement to persist, + // a normal statement is really better in this environemnt. + String sql = "select mls, address, currentbid from qjdbcme.realestate where currentbid <> 0"; + + boolean results =((JdbcMeStatement)stmt).executeToOfflineData(sql,"JdbcMidpBidListings",0, 0); + if (results) + { + setupListingsFromOfflineData(); + } + else + { + listings.append("No bids found", null); + listings.addCommand(backCommand); + listings.setCommandListener(this); + } + } + catch (Exception e) + { + // Currently no valid listings retrieved, so lets + // reset it to empty. + listings = new List("JdbcMe Bids", Choice.IMPLICIT); + listings.append(GETBIDS, null); + listings.addCommand(backCommand); + listings.setCommandListener(this); + + // Return to main after showing the error. + showError(main, e); + return; + } + finally + { + if (conn != null) + { + try + { + conn.close(); + } + catch (Exception e) + { + } + } + conn = null; + stmt = null; + } + showBids(); + } + + public void setupListingsFromOfflineData() + { + // Skip the first four rows in the record store + // (eyecatcher, version, num columns, sql column + // types) + // and each subsequent row in the record store is + // a single column. Our query returns 3 columns which + // we'll return concatenated as a single string. + ResultSet rs = null; + listings.addCommand(backCommand); + listings.setCommandListener(this); + try + { + int i = 5; + int max = 0; + StringBuffer buf = new StringBuffer(20); + + // Creator and dbtype unused in MIDP + rs = new JdbcMeOfflineResultSet("JdbcMidpBidListings", 0, 0); + if (rs == null) + { + // New listings... + listings = new List("JdbcMe Bids", Choice.IMPLICIT); + listings.append(GETBIDS, null); + listings.addCommand(backCommand); + listings.setCommandListener(this); + return; + } + + i = 0; + String s = null; + while (rs.next()) + { + ++i; + + s = rs.getString(1); + buf.append(s); + + buf.append(","); + s = rs.getString(2); + buf.append(s); + + buf.append(", $"); + s = rs.getString(3); + buf.append(s); + + listings.append(buf.toString(), null); + buf.setLength(0); + } + + if (i == 0) + { + listings.append("No bids found", null); + return; + } + } + catch (Exception e) + { + // Currently no valid listings retrieved, so lets + // reset it to empty. + listings = new List("JdbcMe Bids", Choice.IMPLICIT); + listings.append(GETBIDS, null); + listings.addCommand(backCommand); + listings.setCommandListener(this); + + // Return to main after showing the error. + showError(main, e); + return; + } + finally + { + if (rs != null) + { + try + { + rs.close(); + } + catch (Exception e) + { + } + rs = null; + } + System.gc(); + } + } + + /** + * Update the listings card with the + * current list of bids that we're interested in. + */ + public void submitBid() + { + java.sql.Connection conn = null; + Statement stmt = null; + try + { + conn = DriverManager.getConnection(urlText.getString() + ";" + jdbcmeText.getString()); + + stmt = conn.createStatement(); + + // Since we don't want the prepared statement to persist, + // a normal statement is really better in this environemnt. + StringBuffer buf = new StringBuffer(100); + buf.append("Update QJdbcMe.RealEstate Set CurrentBid = "); + buf.append(bidText.getString()); + buf.append(" Where MLS = '"); + buf.append(bidTargetKey); + buf.append("' and CurrentBid < "); + buf.append(bidText.getString()); + String sql = buf.toString(); + + int updated = stmt.executeUpdate(sql); + if (updated == 1) + { + // BID Accepted. + String oldS = listings.getString(bidRow); + int commaIdx = bidTarget.indexOf(','); + String bidAddr = bidTarget.substring(0, commaIdx); + + String newS = bidTargetKey + "," + bidAddr + ", $" + bidText.getString(); + + ResultSet rs = null; + try + { + // Creator and dbtype unused in MIDP + rs = new JdbcMeOfflineResultSet("JdbcMidpBidListings", 0, 0); + rs.absolute(bidRow+1); + rs.updateString(3, bidText.getString()); + rs.close(); + } + catch (Exception e) + { + if (rs != null) + rs.close(); + } + + // Also update our live list of that result set. + listings.set(bidRow, newS, null); + display.setCurrent(listings); + conn.commit(); + } + else + { + conn.rollback(); + throw new SQLException("Failed to bid, someone beat you to it"); + } + } + catch (SQLException e) + { + // Return to the bid form after showing the error. + showError(bidForm, e); + return; + } + finally + { + if (conn != null) + { + try + { + conn.close(); + } + catch (Exception e) + { + } + } + conn = null; + stmt = null; + } + + // Exit without exception, then show the current bids + showBids(); + } + + /** + * Show an error condition. + */ + public void showError(Displayable d, Exception e) + { + String s = e.toString(); + + onErrorGoBackTo = d; + errorForm = new Form("Error"); + errorForm.setTitle("SQL Error"); + errorForm.append(new StringItem("", s)); + errorForm.addCommand(backCommand); + errorForm.setCommandListener(this); + display.setCurrent(errorForm); + } + + /** + * Show the current bids. + */ + public void showBids() + { + if (listings == null) + { + // If we have no current listings, lets set + // them up. + listings = new List("JdbcMe Bids", Choice.IMPLICIT); + setupListingsFromOfflineData(); + } + display.setCurrent(listings); + } + + /** + * Time to pause, free any space we don't need right now. + */ + public void pauseApp() + { + display.setCurrent(null); + } + + /** + * Destroy must cleanup everything. + */ + public void destroyApp(boolean unconditional) + { + } +} diff --git a/demos/ToolboxME/PrimeRealEstateDB.java b/demos/ToolboxME/PrimeRealEstateDB.java new file mode 100644 index 000000000..f3387ee09 --- /dev/null +++ b/demos/ToolboxME/PrimeRealEstateDB.java @@ -0,0 +1,293 @@ +import java.util.*; +import java.sql.*; + +/** + * This class connects to a target iSeries database + * and primes the target system with the database + * schema, tables, stored procedures required by + * the JdbcMidpBid demo application. This is a + * one time setup for each you plan on running to. + *

+ * This class loads the AS/400 Native JDBC driver + * or the IBM Toolbox for Java driver to perform the prime. + *

+ * Set the CLASSPATH to point to the Naitve or Toolbox + * driver then run the java program like the following: + *

+ * java PrimeRealEstateDB jdbc:as400://myAS400 myUid myPwd + * + **/ +public class PrimeRealEstateDB +{ + java.sql.Connection conn; + public PrimeRealEstateDB(Connection conn) + { + this.conn = conn; + } + public void run() throws SQLException { + Statement stmt = conn.createStatement(); + try + { + System.out.println("Try: Create Collection QJdbcMe"); + stmt.execute("Create collection QJdbcMe"); + } + catch (Exception e) + { + try + { + System.out.println("Try: Create Schema QJdbcMe"); + stmt.execute("Create Schema QJdbcMe"); + } + catch (Exception ex) + { + } + } + try + { + System.out.println("Try: Drop Table QJdbcMe.RECalendar"); + stmt.execute("Drop Table QJdbcMe.RECalendar"); + } + catch (Exception e) + { + } + // Not in a try block. This must work + System.out.println("Create Table QJdbcMe.RECalendar"); + stmt.execute("Create Table QJdbcMe.RECalendar " + +"(" + +"Mls CHAR(6) NOT NULL WITH DEFAULT, " + +"ApptDate CHAR(10) NOT NULL WITH DEFAULT, " + +"ApptTime CHAR(5) NOT NULL WITH DEFAULT," + +"Unique (" + +" Mls, ApptDate, ApptTime" + +" )" + +")"); + try + { + System.out.println("Try: Drop Procedure QJdbcMe.RESchedule"); + stmt.execute("Drop Procedure QJdbcMe.RESchedule"); + } + catch (Exception e) + { + } + try + { + System.out.println("Create Procedure QJdbcMe.RESchedule"); + stmt.execute("Create Procedure" + +" QJdbcMe.RESchedule" + +" ( IN MlsP CHAR (6), in ApptDateP CHAR(10)" + +" ,IN ApptTimeP CHAR (5) )" + +" RESULT SETS 1" + +" LANGUAGE SQL NOT DETERMINISTIC" + +" BEGIN" + +" Declare c1 cursor for select ApptDate || ' ' || ApptTime" + +" from QJdbcMe.RECalendar " + +" where MLS = MlsP and ApptDate = ApptDateP and" + +" ApptTime = ApptTimeP;" + +" Insert into QJdbcMe.RECalendar values(MlsP, ApptDateP, ApptTimeP);" + +" Open c1;" + +" Set Result Sets Cursor c1;" + +" end"); + } + catch (Exception e) + { + System.err.println("================================================\n"+ + "WARNING WARNING SQL Stored procedure didn't work\n"); + System.err.println("JdbcRealEstate 'schedule showing' won't work\n"+ + "================================================"); + } + try + { + System.out.println("Try: Drop Table QJdbcMe.RealEstate"); + stmt.execute("Drop Table QJdbcMe.RealEstate"); + } + catch (Exception e) + { + } + // Not in a try block. This must work + System.out.println("Create Table QJdbcMe.RealEstate"); + stmt.execute("Create Table QJdbcMe.RealEstate " + +"(" + +"Mls CHAR(6) NOT NULL WITH DEFAULT, " + +"Address VARCHAR(25), " + +"City VARCHAR(25), " + +"State CHAR(2)," + +"Zip CHAR(5)," + + +"YearBuilt CHAR(4)," + +"Style VARCHAR(15)," + +"SqFt INT, " + +"Bedrooms INT, " + +"Baths INT, " + + +"Acres FLOAT, " + +"GarageStalls INT, " + +"Price DECIMAL ( 11, 2) , " + +"CurrentBid DECIMAL ( 11, 2) , " + + +"Primary Key (MLS)" + +")"); + + PreparedStatement pStmt = conn.prepareStatement + ("Insert Into QJdbcMe.RealEstate values(" + +"?, ?, ?, ?, ?, " + +"?, ?, ?, ?, ?, " + +"?, ?, ?, ?" + +")"); + + // Not in a try block. This must work + PrimeRow primeRows = new PrimeRow(14); + int countRows = primeRows.numRowCapable(); + System.out.println("Insert rows into QJdbcMe.RealEstate..."); + for (int i=0; i [ ]"); + System.exit(1); + } + try + { + Class.forName("com.ibm.db2.jdbc.app.DB2Driver"); + } + catch (Exception e) + { + System.out.println("Didn't find class com.ibm.db2.jdbc.app.DB2Driver"); + } + try + { + Class.forName("COM.ibm.db2.jdbc.app.DB2Driver"); + } + catch (Exception e) + { + System.out.println("Didn't find class COM.ibm.db2.jdbc.app.DB2Driver"); + } + try + { + Class.forName("com.ibm.as400.access.AS400JDBCDriver"); + } + catch (Exception e) + { + System.out.println("Didn't find class com.ibm.as400.access.AS400JDBCDriver"); + } + + try + { + Connection conn; + if (args.length == 1) + { + conn = DriverManager.getConnection(args[0]); + } + else + { + conn = DriverManager.getConnection(args[0], args[1], args[2]); + } + conn.setAutoCommit(false); + + try + { + PrimeRealEstateDB p = new PrimeRealEstateDB(conn); + p.run(); + conn.commit(); + } + catch (Exception e) + { + System.out.println("Error, will rollback... Error:" + e); + e.printStackTrace(); + try + { + conn.rollback(); + } + catch (Exception ex) + { + System.out.println("Rollback Failed: " + ex); + } + } + finally + { + try + { + conn.close(); + } + catch (Exception e) + { + } + } + } + catch (Exception e) + { + System.out.println("Error, will rollback... Error:" + e); + e.printStackTrace(); + } + System.exit(0); + } +} + +/** + * A little abstraction that contains all of the + * rows of data that our RealEstate demo will use. + */ +class PrimeRow +{ + public final static int ExpectedColumns = 14; + public static final String rows[] = { + // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + // mls address city state zip year style sqft bedrooms baths acre garage Price Current Bid + "JDBCA0", "9321 22th St SW", "Rochester", "MN", "55902", "1970", "Hide-out", "3000", "5", "3", "0.25", "3", "109000.99", "0", + "JDBCA1", "3605 Hwy 52 N", "Rochester", "MN", "55906", "1948", "Commercial", "100000", "6000", "250", "40.5", "0", "999999999.99", "0", + "JDBCA2", "11 Buy IBM Stock", "Rochester", "MN", "55901", "2000", "Mansion", "3500", "6", "4", "3", "4", "199000.00", "222000.00", + "JDBCA3", "12 Use IBM Software", "Rochester", "MN", "55901", "2000", "Mansion", "3500", "6", "4", "3", "4", "189000.00", "201000.00", + "JDBCA4", "450 OS/400 Way", "Rochester", "MN", "55901", "2000", "2 Story" , "3000", "7", "5", "3", "9", "201000.00", "210000.00", + "JDBCA5", "1 Microsoft Way", "Redmond" , "WA", "20911", "1980", "Commercial", "40000", "2500", "100", "5.0", "0", "10099.79", "0", + "JDBCA6", "2 Microsoft Way", "Redmond" , "WA", "20911", "2001", "Commercial", "30000", "2400", "90", "3.0", "0", "10099.69", "0", + "JDBCA7", "101 IBM Chip Rd", "Rochester", "MN", "55906", "1980", "Split" , "1700", "2", "2", "0.25", "1", "114000.00", "0", + "JDBCA8", "115 IBM Disk Drive", "Rochester", "MN", "55906", "1981", "Rambler" , "2200", "3", "2", "0.25", "2", "129000.00", "0", + "JDBCA9", "987 Tech. Ct NE", "Rochester", "MN", "55906", "1989", "Multi-lvl", "2400", "4", "2", "0.25", "2", "169000.00", "0", + "JDBCB1", "10 Elm Street", "Somewhere", "MN", "55911", "1965", "2 story" , "2100", "3", "2", "0.25", "2", "103000.00", "0", + "JDBCB2", "11 Elm Street", "Somewhere", "MN", "55911", "1966", "2 story" , "1900", "3", "2", "0.25", "2", "101000.00", "0", + "JDBCB3", "12 Elm Street", "Somewhere", "MN", "55911", "1967", "2 story" , "2200", "3", "2", "0.25", "2", "89000.00", "92000.00", + "JDBCB4", "13 Elm Street", "Somewhere", "MN", "55911", "1968", "2 story" , "1500", "2", "1", "0.25", "2", "29000.00", "10000.00", + "JDBCB5", "14 Elm Street", "Somewhere", "MN", "55911", "1967", "2 story" , "2400", "3", "2", "0.25", "2", "79000.00", "0", + "JDBCB6", "15 Elm Street", "Somewhere", "MN", "55911", "1966", "2 story" , "2500", "3", "2", "0.25", "2", "101000.00", "0", + "JDBCB7", "16 Elm Street", "Somewhere", "MN", "55911", "1965", "2 story" , "2600", "3", "2", "0.25", "2", "110000.00", "0", + }; + java.sql.Connection conn; + + public PrimeRow(int numColumns) throws IllegalArgumentException { + if (numColumns != ExpectedColumns) + { + throw new IllegalArgumentException("Table Change? Expected " + ExpectedColumns + + " columns"); + + } + } + public int numRowCapable() + { + return(rows.length / ExpectedColumns); + } + public void setRow(PreparedStatement stmt, int row) + throws SQLException, IllegalArgumentException { + if (row > numRowCapable()) + { + throw new IllegalArgumentException("Invalid Row: row(" + row + + ") >= maxRow(" + numRowCapable() + ")"); + } + for (int i=0; i + +

+ + + + + + + + + + + + + + + + + + diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandButtonPanel.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandButtonPanel.java new file mode 100644 index 000000000..fe44b6c04 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandButtonPanel.java @@ -0,0 +1,66 @@ +/* + * QCCommandButtonPanel.java + * + * Created on July 13, 2000, 3:52 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** A panel to continually reinstance the CommandCallButton since one can't + * effectively change servers once setServer() has been called. + * @author jax + * @version 1.0 + */ +public class QCCommandButtonPanel extends javax.swing.JPanel { + + /** Creates new form QCCommandButtonPanel + */ + public QCCommandButtonPanel() { + initComponents (); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the FormEditor. + */ + private void initComponents () {//GEN-BEGIN:initComponents + commandCallButton1 = new com.ibm.as400.vaccess.CommandCallButton (); + setLayout (new java.awt.BorderLayout ()); + + commandCallButton1.setText ("Run a Command"); + + + add (commandCallButton1, java.awt.BorderLayout.CENTER); + + }//GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private com.ibm.as400.vaccess.CommandCallButton commandCallButton1; + // End of variables declaration//GEN-END:variables + + /** Returns the CommandCallButton instance currently active in this panel. + * @return The current CommandCallButton which is reinstanced + * every time the server is changed, since you can't + * effectively setServer() more than once. + */ + public com.ibm.as400.vaccess.CommandCallButton getButton() { + return commandCallButton1; + } + /** Reinstance the CommandCallButton because that object can't have setServer() + * called on it multiple times per design. + * @param text The label for the button. + */ + public synchronized void renew(String text) { + remove(commandCallButton1); + commandCallButton1 = new com.ibm.as400.vaccess.CommandCallButton (); + commandCallButton1.setText (text); + add (commandCallButton1, java.awt.BorderLayout.CENTER); + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandButtonPanelBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandButtonPanelBeanInfo.java new file mode 100644 index 000000000..043ac5980 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandButtonPanelBeanInfo.java @@ -0,0 +1,315 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCCommandButtonPanelBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_optimizedDrawingEnabled = 0; + private static final int PROPERTY_colorModel = 1; + private static final int PROPERTY_minimumSize = 2; + private static final int PROPERTY_visible = 3; + private static final int PROPERTY_toolkit = 4; + private static final int PROPERTY_displayable = 5; + private static final int PROPERTY_opaque = 6; + private static final int PROPERTY_requestFocusEnabled = 7; + private static final int PROPERTY_enabled = 8; + private static final int PROPERTY_autoscrolls = 9; + private static final int PROPERTY_y = 10; + private static final int PROPERTY_x = 11; + private static final int PROPERTY_accessibleContext = 12; + private static final int PROPERTY_componentOrientation = 13; + private static final int PROPERTY_components = 14; + private static final int PROPERTY_managingFocus = 15; + private static final int PROPERTY_inputMethodRequests = 16; + private static final int PROPERTY_border = 17; + private static final int PROPERTY_locale = 18; + private static final int PROPERTY_insets = 19; + private static final int PROPERTY_UIClassID = 20; + private static final int PROPERTY_graphics = 21; + private static final int PROPERTY_minimumSizeSet = 22; + private static final int PROPERTY_actionMap = 23; + private static final int PROPERTY_maximumSizeSet = 24; + private static final int PROPERTY_alignmentY = 25; + private static final int PROPERTY_alignmentX = 26; + private static final int PROPERTY_locationOnScreen = 27; + private static final int PROPERTY_cursor = 28; + private static final int PROPERTY_registeredKeyStrokes = 29; + private static final int PROPERTY_preferredSizeSet = 30; + private static final int PROPERTY_visibleRect = 31; + private static final int PROPERTY_bounds = 32; + private static final int PROPERTY_inputContext = 33; + private static final int PROPERTY_class = 34; + private static final int PROPERTY_focusTraversable = 35; + private static final int PROPERTY_font = 36; + private static final int PROPERTY_inputVerifier = 37; + private static final int PROPERTY_lightweight = 38; + private static final int PROPERTY_paintingTile = 39; + private static final int PROPERTY_maximumSize = 40; + private static final int PROPERTY_layout = 41; + private static final int PROPERTY_treeLock = 42; + private static final int PROPERTY_verifyInputWhenFocusTarget = 43; + private static final int PROPERTY_button = 44; + private static final int PROPERTY_foreground = 45; + private static final int PROPERTY_preferredSize = 46; + private static final int PROPERTY_debugGraphicsOptions = 47; + private static final int PROPERTY_doubleBuffered = 48; + private static final int PROPERTY_showing = 49; + private static final int PROPERTY_nextFocusableComponent = 50; + private static final int PROPERTY_parent = 51; + private static final int PROPERTY_peer = 52; + private static final int PROPERTY_componentCount = 53; + private static final int PROPERTY_graphicsConfiguration = 54; + private static final int PROPERTY_height = 55; + private static final int PROPERTY_valid = 56; + private static final int PROPERTY_focusCycleRoot = 57; + private static final int PROPERTY_width = 58; + private static final int PROPERTY_toolTipText = 59; + private static final int PROPERTY_background = 60; + private static final int PROPERTY_validateRoot = 61; + private static final int PROPERTY_topLevelAncestor = 62; + private static final int PROPERTY_dropTarget = 63; + private static final int PROPERTY_rootPane = 64; + private static final int PROPERTY_name = 65; + private static final int PROPERTY_component = 66; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[67]; + + static { + try { + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCCommandButtonPanel.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCCommandButtonPanel.class, "getColorModel", null ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCCommandButtonPanel.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCCommandButtonPanel.class, "isVisible", "setVisible" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCCommandButtonPanel.class, "getToolkit", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCCommandButtonPanel.class, "isDisplayable", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCCommandButtonPanel.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCCommandButtonPanel.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCCommandButtonPanel.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCCommandButtonPanel.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCCommandButtonPanel.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCCommandButtonPanel.class, "getX", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCCommandButtonPanel.class, "getAccessibleContext", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCCommandButtonPanel.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCCommandButtonPanel.class, "getComponents", null ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCCommandButtonPanel.class, "isManagingFocus", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCCommandButtonPanel.class, "getInputMethodRequests", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCCommandButtonPanel.class, "getBorder", "setBorder" ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCCommandButtonPanel.class, "getLocale", "setLocale" ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCCommandButtonPanel.class, "getInsets", null ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCCommandButtonPanel.class, "getUIClassID", null ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCCommandButtonPanel.class, "getGraphics", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCCommandButtonPanel.class, "isMinimumSizeSet", null ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCCommandButtonPanel.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCCommandButtonPanel.class, "isMaximumSizeSet", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCCommandButtonPanel.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCCommandButtonPanel.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCCommandButtonPanel.class, "getLocationOnScreen", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCCommandButtonPanel.class, "getCursor", "setCursor" ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCCommandButtonPanel.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCCommandButtonPanel.class, "isPreferredSizeSet", null ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCCommandButtonPanel.class, "getVisibleRect", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCCommandButtonPanel.class, "getBounds", "setBounds" ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCCommandButtonPanel.class, "getInputContext", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCCommandButtonPanel.class, "getClass", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCCommandButtonPanel.class, "isFocusTraversable", null ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCCommandButtonPanel.class, "getFont", "setFont" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCCommandButtonPanel.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCCommandButtonPanel.class, "isLightweight", null ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCCommandButtonPanel.class, "isPaintingTile", null ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCCommandButtonPanel.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCCommandButtonPanel.class, "getLayout", "setLayout" ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCCommandButtonPanel.class, "getTreeLock", null ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCCommandButtonPanel.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_button] = new PropertyDescriptor ( "button", QCCommandButtonPanel.class, "getButton", null ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCCommandButtonPanel.class, "getForeground", "setForeground" ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCCommandButtonPanel.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCCommandButtonPanel.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCCommandButtonPanel.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCCommandButtonPanel.class, "isShowing", null ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCCommandButtonPanel.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCCommandButtonPanel.class, "getParent", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCCommandButtonPanel.class, "getPeer", null ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCCommandButtonPanel.class, "getComponentCount", null ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCCommandButtonPanel.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCCommandButtonPanel.class, "getHeight", null ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCCommandButtonPanel.class, "isValid", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCCommandButtonPanel.class, "isFocusCycleRoot", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCCommandButtonPanel.class, "getWidth", null ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCCommandButtonPanel.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCCommandButtonPanel.class, "getBackground", "setBackground" ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCCommandButtonPanel.class, "isValidateRoot", null ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCCommandButtonPanel.class, "getTopLevelAncestor", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCCommandButtonPanel.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCCommandButtonPanel.class, "getRootPane", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCCommandButtonPanel.class, "getName", "setName" ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCCommandButtonPanel.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_ancestorListener = 1; + private static final int EVENT_inputMethodListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_propertyChangeListener = 7; + private static final int EVENT_keyListener = 8; + private static final int EVENT_hierarchyListener = 9; + private static final int EVENT_containerListener = 10; + private static final int EVENT_vetoableChangeListener = 11; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[12]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCCommandButtonPanel.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCCommandButtonPanel.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCCommandButtonPanel.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCCommandButtonPanel.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCCommandButtonPanel.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCCommandButtonPanel.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCCommandButtonPanel.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCCommandButtonPanel.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCCommandButtonPanel.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCCommandButtonPanel.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCCommandButtonPanel.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCCommandButtonPanel.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandPanel.form b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandPanel.form new file mode 100644 index 000000000..978cfd438 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandPanel.form @@ -0,0 +1,94 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandPanel.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandPanel.java new file mode 100644 index 000000000..07a5ac217 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandPanel.java @@ -0,0 +1,296 @@ +/* + * QCCommandPanel.java + * + * Created on July 12, 2000, 11:19 AM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** A panel to add to a notebook that has a CommandCallButton. + * @author jax + * @version 1.0 + */ +public class QCCommandPanel extends javax.swing.JPanel implements QCServiceClient { + + private QCMgr manager; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCServiceRecord serviceRecord; + + private com.ibm.as400.vaccess.ErrorDialogAdapter errorDialogAdapter; + /** Creates new form QCCommandPanel */ + public QCCommandPanel() { + initComponents (); + } + + /** Create a QCCommandPanel on an instance of an AS400. + * @param as400 An AS400 object + */ + public QCCommandPanel(com.ibm.as400.access.AS400 as400) { + this(); + setAS400(as400); + } + /** Create a command panel on a QCMgr.This method is not useful and is going away. + * @param mgr A QCMgr + */ + public QCCommandPanel(QCMgr mgr) { + this(); + setManager(mgr); + } + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the FormEditor. + */ + private void initComponents () {//GEN-BEGIN:initComponents + jTextArea1 = new javax.swing.JTextArea (); + jPanel1 = new javax.swing.JPanel (); + qCCommandButtonPanel1 = new com.SoftWoehr.JTOpenContrib.QCDemo.QCCommandButtonPanel (); + commandTextField = new javax.swing.JTextField (); + systemButton = new javax.swing.JButton (); + systemNameTextField = new javax.swing.JTextField (); + aS400DetailsPane1 = new com.ibm.as400.vaccess.AS400DetailsPane (); + setLayout (new java.awt.BorderLayout ()); + + jTextArea1.setEditable (false); + + + add (jTextArea1, java.awt.BorderLayout.NORTH); + + jPanel1.setLayout (new java.awt.GridLayout (2, 2)); + + + jPanel1.add (qCCommandButtonPanel1); + + commandTextField.setPreferredSize (new java.awt.Dimension(4, 40)); + commandTextField.setToolTipText ("Type the command you wish to execute, then hit Enter. This sets the CommandButton to the command."); + commandTextField.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + commandTextFieldActionPerformed (evt); + } + } + ); + + jPanel1.add (commandTextField); + + systemButton.setToolTipText ("Sets the system to the one you typed in."); + systemButton.setText ("Set System"); + systemButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + systemButtonActionPerformed (evt); + } + } + ); + + jPanel1.add (systemButton); + + systemNameTextField.setToolTipText ("Type in the system name on which you wish to execute a command."); + systemNameTextField.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + systemNameTextFieldActionPerformed (evt); + } + } + ); + + jPanel1.add (systemNameTextField); + + + add (jPanel1, java.awt.BorderLayout.SOUTH); + + + + add (aS400DetailsPane1, java.awt.BorderLayout.CENTER); + + }//GEN-END:initComponents + + // Hitting ENTER in the System textfield has the same effect as pressing the System button. + private void systemNameTextFieldActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_systemNameTextFieldActionPerformed + // Add your handling code here: + if (null != serviceRecord) { + try { // let go of the service from manager + manager.freeService(serviceRecord); + } + catch (Exception e) { + e.printStackTrace(); + } + serviceRecord = null; + } + try { + serviceRecord = manager.getService("qcmgr:" + systemNameTextField.getText() + "/COMMAND", this); + } + catch (Exception e) { + e.printStackTrace(); + } + setAS400(serviceRecord.as400); + }//GEN-LAST:event_systemNameTextFieldActionPerformed + + private void commandTextFieldActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_commandTextFieldActionPerformed + // Add your handling code here: + try { + getButton().setCommand(commandTextField.getText()); + } + catch (java.beans.PropertyVetoException e1) { + e1.printStackTrace (); + } + getButton().setText(commandTextField.getText()); + }//GEN-LAST:event_commandTextFieldActionPerformed + + // Hitting ENTER in the System textfield has the same effect as pressing the System button. + private void systemButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_systemButtonActionPerformed + // Add your handling code here: + if (null != serviceRecord) { + try { // let go of the service from manager + manager.freeService(serviceRecord); + } + catch (Exception e) { + e.printStackTrace(); + } + serviceRecord = null; + } + try { + serviceRecord = manager.getService("qcmgr:" + systemNameTextField.getText() + "/COMMAND", this); + } + catch (Exception e) { + e.printStackTrace(); + } + setAS400(serviceRecord.as400); + + }//GEN-LAST:event_systemButtonActionPerformed + + private void commandCallButtonActionCompleted (com.ibm.as400.access.ActionCompletedEvent evt) {//GEN-FIRST:event_commandCallButtonActionCompleted + // Add your handling code here: + jTextArea1.setText(jTextArea1.getText() + "Command completion notification received.\n"); + + // Cast the source of the event to a + // CommandCallButton. + com.ibm.as400.vaccess.CommandCallButton sourceButton = (com.ibm.as400.vaccess.CommandCallButton) evt.getSource (); + + // Get the list of AS/400 messages + // that the command generated. + com.ibm.as400.access.AS400Message[] messageList = sourceButton.getMessageList (); + com.ibm.as400.vaccess.VMessageList vMessageList = new com.ibm.as400.vaccess.VMessageList(messageList); + try { + aS400DetailsPane1.setRoot(vMessageList); + aS400DetailsPane1.load(); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + + // Handle message list manually. + /* + for (int i = 0; i < messageList.length; i++) { + jTextArea1.setText(jTextArea1.getText() + messageList[i].getText() + "\n"); + } + */ + }//GEN-LAST:event_commandCallButtonActionCompleted + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTextArea jTextArea1; + private javax.swing.JPanel jPanel1; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCCommandButtonPanel qCCommandButtonPanel1; + private javax.swing.JTextField commandTextField; + private javax.swing.JButton systemButton; + private javax.swing.JTextField systemNameTextField; + private com.ibm.as400.vaccess.AS400DetailsPane aS400DetailsPane1; + // End of variables declaration//GEN-END:variables + + /** Re-instances of the CommandCallButton in the QCButtonPanel. Button gets + * reinstanced a lot because you can't effectively call setServer() more + * than once on an instance. + * @param as400 The AS400 object for the re-instanced CommandCallButton. + */ + public void setAS400(com.ibm.as400.access.AS400 as400) { + qCCommandButtonPanel1.renew(commandTextField.getText()); + attachCommandCompletedListener(); + getButton().addErrorListener(errorDialogAdapter); + try { + qCCommandButtonPanel1.getButton().setSystem(as400); + } + catch (java.beans.PropertyVetoException e1) { + e1.printStackTrace (); + } + reinstanceCommandFromTextEntry(); // Set button label + } + + /** Gets the command button's AS400 instance. + * @return The AS400 object used by the command button. + */ + public com.ibm.as400.access.AS400 getAS400() { + return getButton().getSystem(); + } + /** Resets the command button's text and command string + * from user input. + */ + public void reinstanceCommandFromTextEntry() { + String text = commandTextField.getText(); + if (null != text) { + if (!text.equals("")) { + getButton().setText(commandTextField.getText()); + try { + getButton().setCommand(commandTextField.getText()); + } + catch (java.beans.PropertyVetoException e1) { + e1.printStackTrace (); + } + } + else { + getButton().setText("Run a Command"); + try { + getButton().setCommand(""); + } + catch (java.beans.PropertyVetoException e1) { + e1.printStackTrace (); + } + } + } + else { + getButton().setText("Run a Command"); + try { + getButton().setCommand(""); + } + catch (java.beans.PropertyVetoException e1) { + e1.printStackTrace (); + } + } + } + /** Sets the QCMgr object which will handle AS400 instances for this client. + * @param mgr A QCMgr object. + */ + public void setManager(QCMgr mgr) { + manager = mgr; + } + /** Connects the ErrorDialogAdapter with any as400.vaccess components present. + * @param eda An instance of an ErrorDialogAdapter already associated + * with a suitable Frame. + */ + public void propagateEDA(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + errorDialogAdapter=eda; + getButton().addErrorListener(eda); + aS400DetailsPane1.addErrorListener(eda); + } + /** Required implementantion of the QCServiceClient interface. Releases the + * AS400 object provided by the server. + * @param sr The service record which represents the AS400 to be + * relinquished. + */ + public void relinquish(QCServiceRecord sr) { + // setAS400(null); // Can't do this ... ah, well ... + serviceRecord = null; + } + private void attachCommandCompletedListener() { + getButton().addActionCompletedListener (new com.ibm.as400.access.ActionCompletedListener () { + public void actionCompleted (com.ibm.as400.access.ActionCompletedEvent evt) + { + commandCallButtonActionCompleted(evt); + } + }); + } + private com.ibm.as400.vaccess.CommandCallButton getButton() { + return qCCommandButtonPanel1.getButton(); + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandPanelBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandPanelBeanInfo.java new file mode 100644 index 000000000..e8a7d4a48 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCCommandPanelBeanInfo.java @@ -0,0 +1,315 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCCommandPanelBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_visible = 0; + private static final int PROPERTY_accessibleContext = 1; + private static final int PROPERTY_managingFocus = 2; + private static final int PROPERTY_componentCount = 3; + private static final int PROPERTY_width = 4; + private static final int PROPERTY_foreground = 5; + private static final int PROPERTY_y = 6; + private static final int PROPERTY_x = 7; + private static final int PROPERTY_focusTraversable = 8; + private static final int PROPERTY_registeredKeyStrokes = 9; + private static final int PROPERTY_class = 10; + private static final int PROPERTY_AS400 = 11; + private static final int PROPERTY_preferredSizeSet = 12; + private static final int PROPERTY_enabled = 13; + private static final int PROPERTY_rootPane = 14; + private static final int PROPERTY_debugGraphicsOptions = 15; + private static final int PROPERTY_height = 16; + private static final int PROPERTY_minimumSizeSet = 17; + private static final int PROPERTY_insets = 18; + private static final int PROPERTY_optimizedDrawingEnabled = 19; + private static final int PROPERTY_validateRoot = 20; + private static final int PROPERTY_border = 21; + private static final int PROPERTY_parent = 22; + private static final int PROPERTY_bounds = 23; + private static final int PROPERTY_cursor = 24; + private static final int PROPERTY_lightweight = 25; + private static final int PROPERTY_displayable = 26; + private static final int PROPERTY_verifyInputWhenFocusTarget = 27; + private static final int PROPERTY_toolkit = 28; + private static final int PROPERTY_visibleRect = 29; + private static final int PROPERTY_locale = 30; + private static final int PROPERTY_graphics = 31; + private static final int PROPERTY_valid = 32; + private static final int PROPERTY_components = 33; + private static final int PROPERTY_showing = 34; + private static final int PROPERTY_nextFocusableComponent = 35; + private static final int PROPERTY_colorModel = 36; + private static final int PROPERTY_inputMethodRequests = 37; + private static final int PROPERTY_dropTarget = 38; + private static final int PROPERTY_name = 39; + private static final int PROPERTY_treeLock = 40; + private static final int PROPERTY_autoscrolls = 41; + private static final int PROPERTY_inputVerifier = 42; + private static final int PROPERTY_preferredSize = 43; + private static final int PROPERTY_minimumSize = 44; + private static final int PROPERTY_peer = 45; + private static final int PROPERTY_inputContext = 46; + private static final int PROPERTY_focusCycleRoot = 47; + private static final int PROPERTY_background = 48; + private static final int PROPERTY_layout = 49; + private static final int PROPERTY_componentOrientation = 50; + private static final int PROPERTY_topLevelAncestor = 51; + private static final int PROPERTY_maximumSizeSet = 52; + private static final int PROPERTY_actionMap = 53; + private static final int PROPERTY_font = 54; + private static final int PROPERTY_maximumSize = 55; + private static final int PROPERTY_graphicsConfiguration = 56; + private static final int PROPERTY_alignmentY = 57; + private static final int PROPERTY_requestFocusEnabled = 58; + private static final int PROPERTY_locationOnScreen = 59; + private static final int PROPERTY_alignmentX = 60; + private static final int PROPERTY_toolTipText = 61; + private static final int PROPERTY_paintingTile = 62; + private static final int PROPERTY_doubleBuffered = 63; + private static final int PROPERTY_UIClassID = 64; + private static final int PROPERTY_opaque = 65; + private static final int PROPERTY_component = 66; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[67]; + + static { + try { + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCCommandPanel.class, "isVisible", "setVisible" ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCCommandPanel.class, "getAccessibleContext", null ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCCommandPanel.class, "isManagingFocus", null ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCCommandPanel.class, "getComponentCount", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCCommandPanel.class, "getWidth", null ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCCommandPanel.class, "getForeground", "setForeground" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCCommandPanel.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCCommandPanel.class, "getX", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCCommandPanel.class, "isFocusTraversable", null ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCCommandPanel.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCCommandPanel.class, "getClass", null ); + properties[PROPERTY_AS400] = new PropertyDescriptor ( "AS400", QCCommandPanel.class, "getAS400", "setAS400" ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCCommandPanel.class, "isPreferredSizeSet", null ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCCommandPanel.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCCommandPanel.class, "getRootPane", null ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCCommandPanel.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCCommandPanel.class, "getHeight", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCCommandPanel.class, "isMinimumSizeSet", null ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCCommandPanel.class, "getInsets", null ); + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCCommandPanel.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCCommandPanel.class, "isValidateRoot", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCCommandPanel.class, "getBorder", "setBorder" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCCommandPanel.class, "getParent", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCCommandPanel.class, "getBounds", "setBounds" ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCCommandPanel.class, "getCursor", "setCursor" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCCommandPanel.class, "isLightweight", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCCommandPanel.class, "isDisplayable", null ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCCommandPanel.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCCommandPanel.class, "getToolkit", null ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCCommandPanel.class, "getVisibleRect", null ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCCommandPanel.class, "getLocale", "setLocale" ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCCommandPanel.class, "getGraphics", null ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCCommandPanel.class, "isValid", null ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCCommandPanel.class, "getComponents", null ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCCommandPanel.class, "isShowing", null ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCCommandPanel.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCCommandPanel.class, "getColorModel", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCCommandPanel.class, "getInputMethodRequests", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCCommandPanel.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCCommandPanel.class, "getName", "setName" ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCCommandPanel.class, "getTreeLock", null ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCCommandPanel.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCCommandPanel.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCCommandPanel.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCCommandPanel.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCCommandPanel.class, "getPeer", null ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCCommandPanel.class, "getInputContext", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCCommandPanel.class, "isFocusCycleRoot", null ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCCommandPanel.class, "getBackground", "setBackground" ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCCommandPanel.class, "getLayout", "setLayout" ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCCommandPanel.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCCommandPanel.class, "getTopLevelAncestor", null ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCCommandPanel.class, "isMaximumSizeSet", null ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCCommandPanel.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCCommandPanel.class, "getFont", "setFont" ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCCommandPanel.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCCommandPanel.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCCommandPanel.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCCommandPanel.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCCommandPanel.class, "getLocationOnScreen", null ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCCommandPanel.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCCommandPanel.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCCommandPanel.class, "isPaintingTile", null ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCCommandPanel.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCCommandPanel.class, "getUIClassID", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCCommandPanel.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCCommandPanel.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_ancestorListener = 1; + private static final int EVENT_inputMethodListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_propertyChangeListener = 7; + private static final int EVENT_keyListener = 8; + private static final int EVENT_hierarchyListener = 9; + private static final int EVENT_containerListener = 10; + private static final int EVENT_vetoableChangeListener = 11; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[12]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCCommandPanel.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCCommandPanel.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCCommandPanel.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCCommandPanel.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCCommandPanel.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCCommandPanel.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCCommandPanel.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCCommandPanel.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCCommandPanel.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCCommandPanel.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCCommandPanel.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCCommandPanel.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCDemo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCDemo.java new file mode 100644 index 000000000..12cd4057d --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCDemo.java @@ -0,0 +1,31 @@ +/* + * QCDemo.java + * + * Created on July 18, 2000, 3:36 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** + * + * @author jax + * @version + */ +public class QCDemo extends Object { + + /** Creates new QCDemo */ + public QCDemo() { + } + + /** + * @param args the command line arguments + */ + public static void main (String args[]) { + new QCTopFrame ().show (); + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCDetailsPane.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCDetailsPane.java new file mode 100644 index 000000000..bb43dbf65 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCDetailsPane.java @@ -0,0 +1,51 @@ +/* + * QCDetailsPane.java + * + * A wrapper around com.ibm.as400.vaccess.AS400DetailsPane to + * allow us to polymorphically switch panes in a panel. + * + * Created on July 16, 2000, 2:06 AM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** A wrapper around a JTOpen pane type to allow polymorphism. + * @author jax + * @version 1.0 + */ +public class QCDetailsPane extends com.ibm.as400.vaccess.AS400DetailsPane implements QCVNodeDisplayer { + + /** Creates new QCExplorer */ + public QCDetailsPane() { + } + + /** Sets the node as root for the pane. + * @param v The VNode to be setRoot by the pane. + */ + public void setRoot(com.ibm.as400.vaccess.VNode v) { + try { + super.setRoot(v); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + } + + /** Add the pane to the Container. + * @param c The Container to be added to. + */ + public void addTo(java.awt.Container c) { + c.add(this); + } + + /** Add error dialog as listener. + * @param eda The ErrorDialogAdapter to add. + */ + public void addErrorListener(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCDetailsPaneBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCDetailsPaneBeanInfo.java new file mode 100644 index 000000000..e0109fddf --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCDetailsPaneBeanInfo.java @@ -0,0 +1,337 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCDetailsPaneBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_locale = 0; + private static final int PROPERTY_alignmentY = 1; + private static final int PROPERTY_alignmentX = 2; + private static final int PROPERTY_treeLock = 3; + private static final int PROPERTY_focusTraversable = 4; + private static final int PROPERTY_displayable = 5; + private static final int PROPERTY_topLevelAncestor = 6; + private static final int PROPERTY_showing = 7; + private static final int PROPERTY_allowActions = 8; + private static final int PROPERTY_paintingTile = 9; + private static final int PROPERTY_opaque = 10; + private static final int PROPERTY_y = 11; + private static final int PROPERTY_inputVerifier = 12; + private static final int PROPERTY_x = 13; + private static final int PROPERTY_verifyInputWhenFocusTarget = 14; + private static final int PROPERTY_graphics = 15; + private static final int PROPERTY_toolTipText = 16; + private static final int PROPERTY_UIClassID = 17; + private static final int PROPERTY_bounds = 18; + private static final int PROPERTY_selectionModel = 19; + private static final int PROPERTY_border = 20; + private static final int PROPERTY_background = 21; + private static final int PROPERTY_requestFocusEnabled = 22; + private static final int PROPERTY_width = 23; + private static final int PROPERTY_model = 24; + private static final int PROPERTY_class = 25; + private static final int PROPERTY_components = 26; + private static final int PROPERTY_selectedObject = 27; + private static final int PROPERTY_maximumSize = 28; + private static final int PROPERTY_validateRoot = 29; + private static final int PROPERTY_focusCycleRoot = 30; + private static final int PROPERTY_height = 31; + private static final int PROPERTY_toolkit = 32; + private static final int PROPERTY_inputContext = 33; + private static final int PROPERTY_name = 34; + private static final int PROPERTY_root = 35; + private static final int PROPERTY_visibleRect = 36; + private static final int PROPERTY_rowSelectionAllowed = 37; + private static final int PROPERTY_enabled = 38; + private static final int PROPERTY_actionContext = 39; + private static final int PROPERTY_debugGraphicsOptions = 40; + private static final int PROPERTY_inputMethodRequests = 41; + private static final int PROPERTY_colorModel = 42; + private static final int PROPERTY_foreground = 43; + private static final int PROPERTY_visible = 44; + private static final int PROPERTY_font = 45; + private static final int PROPERTY_optimizedDrawingEnabled = 46; + private static final int PROPERTY_actionMap = 47; + private static final int PROPERTY_parent = 48; + private static final int PROPERTY_preferredSize = 49; + private static final int PROPERTY_doubleBuffered = 50; + private static final int PROPERTY_lightweight = 51; + private static final int PROPERTY_valid = 52; + private static final int PROPERTY_minimumSizeSet = 53; + private static final int PROPERTY_columnModel = 54; + private static final int PROPERTY_peer = 55; + private static final int PROPERTY_autoscrolls = 56; + private static final int PROPERTY_minimumSize = 57; + private static final int PROPERTY_registeredKeyStrokes = 58; + private static final int PROPERTY_graphicsConfiguration = 59; + private static final int PROPERTY_layout = 60; + private static final int PROPERTY_nextFocusableComponent = 61; + private static final int PROPERTY_maximumSizeSet = 62; + private static final int PROPERTY_locationOnScreen = 63; + private static final int PROPERTY_preferredSizeSet = 64; + private static final int PROPERTY_cursor = 65; + private static final int PROPERTY_managingFocus = 66; + private static final int PROPERTY_insets = 67; + private static final int PROPERTY_componentOrientation = 68; + private static final int PROPERTY_componentCount = 69; + private static final int PROPERTY_rootPane = 70; + private static final int PROPERTY_accessibleContext = 71; + private static final int PROPERTY_selectedObjects = 72; + private static final int PROPERTY_dropTarget = 73; + private static final int PROPERTY_confirm = 74; + private static final int PROPERTY_component = 75; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[76]; + + static { + try { + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCDetailsPane.class, "getLocale", "setLocale" ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCDetailsPane.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCDetailsPane.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCDetailsPane.class, "getTreeLock", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCDetailsPane.class, "isFocusTraversable", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCDetailsPane.class, "isDisplayable", null ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCDetailsPane.class, "getTopLevelAncestor", null ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCDetailsPane.class, "isShowing", null ); + properties[PROPERTY_allowActions] = new PropertyDescriptor ( "allowActions", QCDetailsPane.class, "getAllowActions", "setAllowActions" ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCDetailsPane.class, "isPaintingTile", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCDetailsPane.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCDetailsPane.class, "getY", null ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCDetailsPane.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCDetailsPane.class, "getX", null ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCDetailsPane.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCDetailsPane.class, "getGraphics", null ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCDetailsPane.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCDetailsPane.class, "getUIClassID", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCDetailsPane.class, "getBounds", "setBounds" ); + properties[PROPERTY_selectionModel] = new PropertyDescriptor ( "selectionModel", QCDetailsPane.class, "getSelectionModel", "setSelectionModel" ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCDetailsPane.class, "getBorder", "setBorder" ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCDetailsPane.class, "getBackground", "setBackground" ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCDetailsPane.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCDetailsPane.class, "getWidth", null ); + properties[PROPERTY_model] = new PropertyDescriptor ( "model", QCDetailsPane.class, "getModel", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCDetailsPane.class, "getClass", null ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCDetailsPane.class, "getComponents", null ); + properties[PROPERTY_selectedObject] = new PropertyDescriptor ( "selectedObject", QCDetailsPane.class, "getSelectedObject", null ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCDetailsPane.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCDetailsPane.class, "isValidateRoot", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCDetailsPane.class, "isFocusCycleRoot", null ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCDetailsPane.class, "getHeight", null ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCDetailsPane.class, "getToolkit", null ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCDetailsPane.class, "getInputContext", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCDetailsPane.class, "getName", "setName" ); + properties[PROPERTY_root] = new PropertyDescriptor ( "root", QCDetailsPane.class, "getRoot", "setRoot" ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCDetailsPane.class, "getVisibleRect", null ); + properties[PROPERTY_rowSelectionAllowed] = new PropertyDescriptor ( "rowSelectionAllowed", QCDetailsPane.class, "getRowSelectionAllowed", "setRowSelectionAllowed" ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCDetailsPane.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_actionContext] = new PropertyDescriptor ( "actionContext", QCDetailsPane.class, "getActionContext", null ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCDetailsPane.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCDetailsPane.class, "getInputMethodRequests", null ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCDetailsPane.class, "getColorModel", null ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCDetailsPane.class, "getForeground", "setForeground" ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCDetailsPane.class, "isVisible", "setVisible" ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCDetailsPane.class, "getFont", "setFont" ); + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCDetailsPane.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCDetailsPane.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCDetailsPane.class, "getParent", null ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCDetailsPane.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCDetailsPane.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCDetailsPane.class, "isLightweight", null ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCDetailsPane.class, "isValid", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCDetailsPane.class, "isMinimumSizeSet", null ); + properties[PROPERTY_columnModel] = new PropertyDescriptor ( "columnModel", QCDetailsPane.class, "getColumnModel", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCDetailsPane.class, "getPeer", null ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCDetailsPane.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCDetailsPane.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCDetailsPane.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCDetailsPane.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCDetailsPane.class, "getLayout", "setLayout" ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCDetailsPane.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCDetailsPane.class, "isMaximumSizeSet", null ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCDetailsPane.class, "getLocationOnScreen", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCDetailsPane.class, "isPreferredSizeSet", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCDetailsPane.class, "getCursor", "setCursor" ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCDetailsPane.class, "isManagingFocus", null ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCDetailsPane.class, "getInsets", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCDetailsPane.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCDetailsPane.class, "getComponentCount", null ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCDetailsPane.class, "getRootPane", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCDetailsPane.class, "getAccessibleContext", null ); + properties[PROPERTY_selectedObjects] = new PropertyDescriptor ( "selectedObjects", QCDetailsPane.class, "getSelectedObjects", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCDetailsPane.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_confirm] = new PropertyDescriptor ( "confirm", QCDetailsPane.class, "getConfirm", "setConfirm" ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCDetailsPane.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_inputMethodListener = 1; + private static final int EVENT_ancestorListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_listSelectionListener = 7; + private static final int EVENT_propertyChangeListener = 8; + private static final int EVENT_keyListener = 9; + private static final int EVENT_hierarchyListener = 10; + private static final int EVENT_containerListener = 11; + private static final int EVENT_vetoableChangeListener = 12; + private static final int EVENT_errorListener = 13; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[14]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCDetailsPane.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCDetailsPane.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCDetailsPane.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCDetailsPane.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCDetailsPane.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCDetailsPane.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCDetailsPane.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_listSelectionListener] = new EventSetDescriptor ( QCDetailsPane.class, "listSelectionListener", javax.swing.event.ListSelectionListener.class, new String[0], "addListSelectionListener", "removeListSelectionListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCDetailsPane.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCDetailsPane.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCDetailsPane.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCDetailsPane.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCDetailsPane.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + eventSets[EVENT_errorListener] = new EventSetDescriptor ( QCDetailsPane.class, "errorListener", com.ibm.as400.vaccess.ErrorListener.class, new String[0], "addErrorListener", "removeErrorListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCExplorerPane.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCExplorerPane.java new file mode 100644 index 000000000..1598637f7 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCExplorerPane.java @@ -0,0 +1,51 @@ +/* + * QCExplorerPane.java + * + * A wrapper around com.ibm.as400.vaccess.AS400ExplorerPane to + * allow us to polymorphically switch panes in a panel. + * + * Created on July 16, 2000, 2:06 AM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** A wrapper around a JTOpen pane type to allow polymorphism. + * @author jax + * @version 1.0 + */ +public class QCExplorerPane extends com.ibm.as400.vaccess.AS400ExplorerPane implements QCVNodeDisplayer { + + /** Creates new QCExplorer */ + public QCExplorerPane() { + } + + /** Sets the node as root for the pane. + * @param v The VNode to be setRoot by the pane. + */ + public void setRoot(com.ibm.as400.vaccess.VNode v) { + try { + super.setRoot(v); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + } + + /** Add the pane to the Container. + * @param c The Container to be added to. + */ + public void addTo(java.awt.Container c) { + c.add(this); + } + + /** Add error dialog as listener. + * @param eda The ErrorDialogAdapter to add. + */ + public void addErrorListener(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCExplorerPaneBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCExplorerPaneBeanInfo.java new file mode 100644 index 000000000..c727b213e --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCExplorerPaneBeanInfo.java @@ -0,0 +1,343 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCExplorerPaneBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_parent = 0; + private static final int PROPERTY_focusCycleRoot = 1; + private static final int PROPERTY_class = 2; + private static final int PROPERTY_validateRoot = 3; + private static final int PROPERTY_visible = 4; + private static final int PROPERTY_actionMap = 5; + private static final int PROPERTY_toolTipText = 6; + private static final int PROPERTY_focusTraversable = 7; + private static final int PROPERTY_inputMethodRequests = 8; + private static final int PROPERTY_insets = 9; + private static final int PROPERTY_requestFocusEnabled = 10; + private static final int PROPERTY_actionContext = 11; + private static final int PROPERTY_visibleRect = 12; + private static final int PROPERTY_minimumSize = 13; + private static final int PROPERTY_locale = 14; + private static final int PROPERTY_paintingTile = 15; + private static final int PROPERTY_showing = 16; + private static final int PROPERTY_componentOrientation = 17; + private static final int PROPERTY_inputVerifier = 18; + private static final int PROPERTY_y = 19; + private static final int PROPERTY_root = 20; + private static final int PROPERTY_x = 21; + private static final int PROPERTY_treeModel = 22; + private static final int PROPERTY_selectedObject = 23; + private static final int PROPERTY_dropTarget = 24; + private static final int PROPERTY_layout = 25; + private static final int PROPERTY_toolkit = 26; + private static final int PROPERTY_components = 27; + private static final int PROPERTY_background = 28; + private static final int PROPERTY_foreground = 29; + private static final int PROPERTY_allowActions = 30; + private static final int PROPERTY_valid = 31; + private static final int PROPERTY_maximumSizeSet = 32; + private static final int PROPERTY_inputContext = 33; + private static final int PROPERTY_detailsColumnModel = 34; + private static final int PROPERTY_bounds = 35; + private static final int PROPERTY_rootPane = 36; + private static final int PROPERTY_accessibleContext = 37; + private static final int PROPERTY_name = 38; + private static final int PROPERTY_graphics = 39; + private static final int PROPERTY_treeSelectionModel = 40; + private static final int PROPERTY_font = 41; + private static final int PROPERTY_displayable = 42; + private static final int PROPERTY_preferredSize = 43; + private static final int PROPERTY_doubleBuffered = 44; + private static final int PROPERTY_lightweight = 45; + private static final int PROPERTY_enabled = 46; + private static final int PROPERTY_UIClassID = 47; + private static final int PROPERTY_border = 48; + private static final int PROPERTY_minimumSizeSet = 49; + private static final int PROPERTY_autoscrolls = 50; + private static final int PROPERTY_colorModel = 51; + private static final int PROPERTY_confirm = 52; + private static final int PROPERTY_locationOnScreen = 53; + private static final int PROPERTY_debugGraphicsOptions = 54; + private static final int PROPERTY_height = 55; + private static final int PROPERTY_detailsRoot = 56; + private static final int PROPERTY_cursor = 57; + private static final int PROPERTY_width = 58; + private static final int PROPERTY_graphicsConfiguration = 59; + private static final int PROPERTY_opaque = 60; + private static final int PROPERTY_detailsSelectionModel = 61; + private static final int PROPERTY_selectedObjects = 62; + private static final int PROPERTY_registeredKeyStrokes = 63; + private static final int PROPERTY_componentCount = 64; + private static final int PROPERTY_maximumSize = 65; + private static final int PROPERTY_treeLock = 66; + private static final int PROPERTY_nextFocusableComponent = 67; + private static final int PROPERTY_verifyInputWhenFocusTarget = 68; + private static final int PROPERTY_managingFocus = 69; + private static final int PROPERTY_peer = 70; + private static final int PROPERTY_optimizedDrawingEnabled = 71; + private static final int PROPERTY_topLevelAncestor = 72; + private static final int PROPERTY_preferredSizeSet = 73; + private static final int PROPERTY_alignmentY = 74; + private static final int PROPERTY_alignmentX = 75; + private static final int PROPERTY_detailsModel = 76; + private static final int PROPERTY_component = 77; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[78]; + + static { + try { + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCExplorerPane.class, "getParent", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCExplorerPane.class, "isFocusCycleRoot", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCExplorerPane.class, "getClass", null ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCExplorerPane.class, "isValidateRoot", null ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCExplorerPane.class, "isVisible", "setVisible" ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCExplorerPane.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCExplorerPane.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCExplorerPane.class, "isFocusTraversable", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCExplorerPane.class, "getInputMethodRequests", null ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCExplorerPane.class, "getInsets", null ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCExplorerPane.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_actionContext] = new PropertyDescriptor ( "actionContext", QCExplorerPane.class, "getActionContext", null ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCExplorerPane.class, "getVisibleRect", null ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCExplorerPane.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCExplorerPane.class, "getLocale", "setLocale" ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCExplorerPane.class, "isPaintingTile", null ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCExplorerPane.class, "isShowing", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCExplorerPane.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCExplorerPane.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCExplorerPane.class, "getY", null ); + properties[PROPERTY_root] = new PropertyDescriptor ( "root", QCExplorerPane.class, "getRoot", "setRoot" ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCExplorerPane.class, "getX", null ); + properties[PROPERTY_treeModel] = new PropertyDescriptor ( "treeModel", QCExplorerPane.class, "getTreeModel", null ); + properties[PROPERTY_selectedObject] = new PropertyDescriptor ( "selectedObject", QCExplorerPane.class, "getSelectedObject", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCExplorerPane.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCExplorerPane.class, "getLayout", "setLayout" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCExplorerPane.class, "getToolkit", null ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCExplorerPane.class, "getComponents", null ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCExplorerPane.class, "getBackground", "setBackground" ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCExplorerPane.class, "getForeground", "setForeground" ); + properties[PROPERTY_allowActions] = new PropertyDescriptor ( "allowActions", QCExplorerPane.class, "getAllowActions", "setAllowActions" ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCExplorerPane.class, "isValid", null ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCExplorerPane.class, "isMaximumSizeSet", null ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCExplorerPane.class, "getInputContext", null ); + properties[PROPERTY_detailsColumnModel] = new PropertyDescriptor ( "detailsColumnModel", QCExplorerPane.class, "getDetailsColumnModel", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCExplorerPane.class, "getBounds", "setBounds" ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCExplorerPane.class, "getRootPane", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCExplorerPane.class, "getAccessibleContext", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCExplorerPane.class, "getName", "setName" ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCExplorerPane.class, "getGraphics", null ); + properties[PROPERTY_treeSelectionModel] = new PropertyDescriptor ( "treeSelectionModel", QCExplorerPane.class, "getTreeSelectionModel", "setTreeSelectionModel" ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCExplorerPane.class, "getFont", "setFont" ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCExplorerPane.class, "isDisplayable", null ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCExplorerPane.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCExplorerPane.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCExplorerPane.class, "isLightweight", null ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCExplorerPane.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCExplorerPane.class, "getUIClassID", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCExplorerPane.class, "getBorder", "setBorder" ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCExplorerPane.class, "isMinimumSizeSet", null ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCExplorerPane.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCExplorerPane.class, "getColorModel", null ); + properties[PROPERTY_confirm] = new PropertyDescriptor ( "confirm", QCExplorerPane.class, "getConfirm", "setConfirm" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCExplorerPane.class, "getLocationOnScreen", null ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCExplorerPane.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCExplorerPane.class, "getHeight", null ); + properties[PROPERTY_detailsRoot] = new PropertyDescriptor ( "detailsRoot", QCExplorerPane.class, "getDetailsRoot", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCExplorerPane.class, "getCursor", "setCursor" ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCExplorerPane.class, "getWidth", null ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCExplorerPane.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCExplorerPane.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_detailsSelectionModel] = new PropertyDescriptor ( "detailsSelectionModel", QCExplorerPane.class, "getDetailsSelectionModel", "setDetailsSelectionModel" ); + properties[PROPERTY_selectedObjects] = new PropertyDescriptor ( "selectedObjects", QCExplorerPane.class, "getSelectedObjects", null ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCExplorerPane.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCExplorerPane.class, "getComponentCount", null ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCExplorerPane.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCExplorerPane.class, "getTreeLock", null ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCExplorerPane.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCExplorerPane.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCExplorerPane.class, "isManagingFocus", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCExplorerPane.class, "getPeer", null ); + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCExplorerPane.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCExplorerPane.class, "getTopLevelAncestor", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCExplorerPane.class, "isPreferredSizeSet", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCExplorerPane.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCExplorerPane.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_detailsModel] = new PropertyDescriptor ( "detailsModel", QCExplorerPane.class, "getDetailsModel", null ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCExplorerPane.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_ancestorListener = 1; + private static final int EVENT_inputMethodListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_focusListener = 5; + private static final int EVENT_mouseListener = 6; + private static final int EVENT_listSelectionListener = 7; + private static final int EVENT_treeSelectionListener = 8; + private static final int EVENT_propertyChangeListener = 9; + private static final int EVENT_keyListener = 10; + private static final int EVENT_hierarchyListener = 11; + private static final int EVENT_containerListener = 12; + private static final int EVENT_vetoableChangeListener = 13; + private static final int EVENT_errorListener = 14; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[15]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCExplorerPane.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCExplorerPane.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCExplorerPane.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCExplorerPane.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCExplorerPane.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCExplorerPane.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCExplorerPane.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_listSelectionListener] = new EventSetDescriptor ( QCExplorerPane.class, "listSelectionListener", javax.swing.event.ListSelectionListener.class, new String[0], "addListSelectionListener", "removeListSelectionListener" ); + eventSets[EVENT_treeSelectionListener] = new EventSetDescriptor ( QCExplorerPane.class, "treeSelectionListener", javax.swing.event.TreeSelectionListener.class, new String[0], "addTreeSelectionListener", "removeTreeSelectionListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCExplorerPane.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCExplorerPane.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCExplorerPane.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCExplorerPane.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCExplorerPane.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + eventSets[EVENT_errorListener] = new EventSetDescriptor ( QCExplorerPane.class, "errorListener", com.ibm.as400.vaccess.ErrorListener.class, new String[0], "addErrorListener", "removeErrorListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCHash.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCHash.java new file mode 100644 index 000000000..65b56d0c0 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCHash.java @@ -0,0 +1,172 @@ +/* QCHash.java -- contain AS400 instances + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.util.*; +import com.ibm.as400.access.*; + +public class QCHash extends Object +{ + private Hashtable serverInstances = new Hashtable(); + +public QCHash () {} + + /** Returns a string representation of the Hash and its members. + * @return A String representation. + */ + public String toString() { + StringBuffer result = new StringBuffer(); + for (Enumeration e = serverInstances.elements() ; e.hasMoreElements() ;) + { + result.append(e.nextElement().toString()); + } /* End for*/ + result.append(super.toString()); + return new String(result); + } + + protected void finalize () throws Throwable + { /* Called by garbage collector in case no longer referenced*/ + super.finalize(); + } + + /** Clear all keys */ + public void clear () throws UnsupportedOperationException +{ serverInstances.clear(); } + + /** Map in an object */ + public AS400 put(String key, AS400 object) { + return (AS400) serverInstances.put(key, object); + } + + /** Get a server by name */ + public AS400 get(String key) { + return (AS400) serverInstances.get(key); + } + + /** Remove a server by name */ + public AS400 remove(String key) { + return (AS400) serverInstances.remove(key); + } + + /** Contains the server named? */ + public boolean containsServerNamed (String key) { + return serverInstances.containsKey(key); + } + + /** Contains reference to the identical unique AS400 object */ + public boolean containsServer(AS400 as400) { + return serverInstances.containsValue(as400); + } + + /** Number of elements */ +public int size () { return serverInstances.size();} + + /** Enumeration of keys */ +public Enumeration keys () { return serverInstances.keys();} + + /** Enumeration of elements elements */ +public Enumeration elements () { return serverInstances.elements();} + + /** Is empty? */ +public boolean isEmpty () { return serverInstances.isEmpty();} + + /** Test QCHash */ + public static void main (String argv[]) { + AS400 moe = new AS400("MOE"); + AS400 joe = new AS400("JOE"); + + QCHash qchash = new QCHash(); + + System.out.println("Adding MOE"); + qchash.put("Moe", moe); + + System.out.println("Adding JOE"); + qchash.put("Joe", joe); + + System.out.println("Does the QCHash contain Moe?"); + if (qchash.containsServerNamed("Moe")) + { + System.out.println("Yes."); + } + else + { + System.out.println("No."); + } /* End if*/ + + System.out.println("Does the QCHash contain Joe?"); + if (qchash.containsServerNamed("Joe")) + { + System.out.println("Yes."); + } + else + { + System.out.println("No."); + } /* End if*/ + + System.out.println("Joe as string:"); + System.out.println(qchash.get("Joe").toString()); + + System.out.println("Moe as string:"); + System.out.println(qchash.get("Moe").toString()); + + System.out.println("QCHash to string."); + System.out.println(qchash.toString()); + + System.out.println("Removing Moe"); + qchash.remove("Moe"); + + System.out.println("Does the QCHash contain Moe?"); + if (qchash.containsServerNamed("Moe")) + { + System.out.println("Yes."); + } + else + { + System.out.println("No."); + } /* End if*/ + + System.out.println("Does the QCHash contain Joe?"); + if (qchash.containsServerNamed("Joe")) + { + System.out.println("Yes."); + } + else + { + System.out.println("No."); + } /* End if*/ + + System.out.println("Removing Joe"); + qchash.remove("Joe"); + + System.out.println("Does the QCHash contain Moe?"); + if (qchash.containsServerNamed("Moe")) + { + System.out.println("Yes."); + } + else + { + System.out.println("No."); + } /* End if*/ + + System.out.println("Does the QCHash contain Joe?"); + if (qchash.containsServerNamed("Joe")) + { + System.out.println("Yes."); + } + else + { + System.out.println("No."); + } /* End if*/ + + System.out.println(""); + System.out.println(""); + System.out.println(""); + System.out.println(""); + + } +} /* End of QCHash class*/ diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCIFSPanel.form b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCIFSPanel.form new file mode 100644 index 000000000..19a368c16 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCIFSPanel.form @@ -0,0 +1,165 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCIFSPanel.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCIFSPanel.java new file mode 100644 index 000000000..5fb799930 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCIFSPanel.java @@ -0,0 +1,392 @@ +/* + * IFSPanel.java + * + * Created on July 15, 2000, 3:30 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** Panel to hold AS400IFSDirectory. Has extra interior panel to change the display + * pane. + * @author jax + * @version 1.0 + */ +public class QCIFSPanel extends javax.swing.JPanel implements com.SoftWoehr.JTOpenContrib.QCDemo.QCServiceClient { + + private QCMgr manager; + private java.lang.String serverName; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCServiceRecord serviceRecord; + private com.ibm.as400.vaccess.ErrorDialogAdapter errorDialogAdapter; + + /** Holds the transient pane since we allow users to switch pane types. + * The member as400ExplorerPane is an artifact of the IDE. + * NOT CURRENTLY USED. + */ + private QCVNodeDisplayer browsingPane; + + /** Creates new form IFSPanel */ + public QCIFSPanel() { + initComponents (); + QCExplorerPane ep = new QCExplorerPane(); + aS400ExplorerPane1 = ep; // Chuck the pane the IDE adds to the code. + browsingPane = ep; // From now on, "browsingPane" is the view. + jPanel1.removeAll(); + ep.addTo(jPanel1); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the FormEditor. + */ + private void initComponents () {//GEN-BEGIN:initComponents + vIFSDirectory = new com.ibm.as400.vaccess.VIFSDirectory (); + jPanel1 = new javax.swing.JPanel (); + aS400ExplorerPane1 = new com.ibm.as400.vaccess.AS400ExplorerPane (); + jPanel2 = new javax.swing.JPanel (); + pathButton = new javax.swing.JButton (); + pathTextField = new javax.swing.JTextField (); + systemButton = new javax.swing.JButton (); + systemTextField = new javax.swing.JTextField (); + jPanel3 = new javax.swing.JPanel (); + explorerButton = new javax.swing.JButton (); + detailsButton = new javax.swing.JButton (); + listButton = new javax.swing.JButton (); + treeButton = new javax.swing.JButton (); + + setLayout (new java.awt.BorderLayout ()); + + jPanel1.setToolTipText ("Offers different views of the Integrated File System."); + + + jPanel1.add (aS400ExplorerPane1); + + + add (jPanel1, java.awt.BorderLayout.CENTER); + + jPanel2.setLayout (new java.awt.GridLayout (2, 2)); + + pathButton.setToolTipText ("Click to set the path to the IFS path you entered."); + pathButton.setText ("Set IFS Path"); + pathButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + pathButtonActionPerformed (evt); + } + } + ); + + jPanel2.add (pathButton); + + pathTextField.setToolTipText ("Enter the IFS path you wish to browse."); + pathTextField.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + pathTextFieldActionPerformed (evt); + } + } + ); + + jPanel2.add (pathTextField); + + systemButton.setToolTipText ("Click to set the system to the name you entered."); + systemButton.setText ("Set System"); + systemButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + systemButtonActionPerformed (evt); + } + } + ); + + jPanel2.add (systemButton); + + systemTextField.setToolTipText ("Enter the name of the system you wish to browse."); + systemTextField.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + systemTextFieldActionPerformed (evt); + } + } + ); + + jPanel2.add (systemTextField); + + + add (jPanel2, java.awt.BorderLayout.SOUTH); + + jPanel3.setLayout (new java.awt.GridLayout (1, 4)); + + explorerButton.setToolTipText ("Set the view to an explorer view."); + explorerButton.setText ("Explorer"); + explorerButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + explorerButtonActionPerformed (evt); + } + } + ); + + jPanel3.add (explorerButton); + + detailsButton.setToolTipText ("Set the view to a details view."); + detailsButton.setText ("Details"); + detailsButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + detailsButtonActionPerformed (evt); + } + } + ); + + jPanel3.add (detailsButton); + + listButton.setToolTipText ("Set the view to a list view."); + listButton.setText ("List"); + listButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + listButtonActionPerformed (evt); + } + } + ); + + jPanel3.add (listButton); + + treeButton.setToolTipText ("Set the view to a tree view."); + treeButton.setText ("Tree"); + treeButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + treeButtonActionPerformed (evt); + } + } + ); + + jPanel3.add (treeButton); + + + add (jPanel3, java.awt.BorderLayout.NORTH); + + }//GEN-END:initComponents + + // Pushing the button and hitting ENTER in the corresponding field produces the same result. + private void pathTextFieldActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pathTextFieldActionPerformed + // Add your handling code here: + pathButtonActionPerformed(evt); + }//GEN-LAST:event_pathTextFieldActionPerformed + // Pushing the button and hitting ENTER in the corresponding field produces the same result. + private void systemTextFieldActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_systemTextFieldActionPerformed + // Add your handling code here: + systemButtonActionPerformed (evt); + }//GEN-LAST:event_systemTextFieldActionPerformed + // Change view style. + private void treeButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_treeButtonActionPerformed + // Add your handling code here: + // Changing the view can take some time. + java.awt.Cursor currentCursor = getCursor(); + setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR)); + reinstanceBrowsingPane(new QCTreePane()); + // The wait is over. + setCursor(currentCursor); + repaint(1000); + }//GEN-LAST:event_treeButtonActionPerformed + // Change view style. + private void listButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_listButtonActionPerformed + // Add your handling code here: + // Changing the view can take some time. + java.awt.Cursor currentCursor = getCursor(); + setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR)); + reinstanceBrowsingPane(new QCListPane()); + // The wait is over. + setCursor(currentCursor); + repaint(1000); + }//GEN-LAST:event_listButtonActionPerformed + // Change view style. + private void detailsButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_detailsButtonActionPerformed + // Add your handling code here: + // Changing the view can take some time. + java.awt.Cursor currentCursor = getCursor(); + setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR)); + reinstanceBrowsingPane(new QCDetailsPane()); + // The wait is over. + setCursor(currentCursor); + repaint(1000); + }//GEN-LAST:event_detailsButtonActionPerformed + // Change view style. + private void explorerButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_explorerButtonActionPerformed + // Add your handling code here: + // Changing the view can take some time. + java.awt.Cursor currentCursor = getCursor(); + setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR)); + reinstanceBrowsingPane(new QCExplorerPane()); + // The wait is over. + setCursor(currentCursor); + repaint(1000); + }//GEN-LAST:event_explorerButtonActionPerformed + // Pushing the button and hitting ENTER in the corresponding field produces the same result. + private void systemButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_systemButtonActionPerformed + // Add your handling code here: + reinstanceServerFromTextEntry(); + }//GEN-LAST:event_systemButtonActionPerformed + // Pushing the button and hitting ENTER in the corresponding field produces the same result. + private void pathButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pathButtonActionPerformed + // Add your handling code here: + + // Make sure we have a system. + reinstanceServerFromTextEntry(); + + // Loading the directory can take some time! + java.awt.Cursor currentCursor = getCursor(); + setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR)); + + // Can't change path of a loaded VIFSDirectory. + // Might as well each time re-instance the VIFSDirectory + // since pushing the button requests a reload anyway. + reinstanceIFSDirectory(); + + try + { + loadPath(); + }/* End try*/ + + catch (Exception e) + { + e.printStackTrace(System.err); + }/* End catch*/ + + // setExplorerPaneRoot() + setBrowserPaneRoot(); + + // The wait is over. + setCursor(currentCursor); + + }//GEN-LAST:event_pathButtonActionPerformed + + private synchronized void reinstanceBrowsingPane(QCVNodeDisplayer vnd) { + jPanel1.removeAll(); // Discard current display pane. + + browsingPane = vnd; // Instance our variable of record. + + setBrowserPaneRoot(); // Apply the vnode. + + if (null != errorDialogAdapter) { // Add the error listener. + browsingPane.addErrorListener(errorDialogAdapter); + } + + browsingPane.addTo(jPanel1); // Add pane to visible display. + } + + private synchronized void reinstanceServerFromTextEntry() { + String newName = systemTextField.getText(); + if (null == serverName) { + serverName = ""; + } + if (null != newName) { + if (!newName.equals("")) { + if (!newName.equals(serverName)) { + serverName = newName; + if (null != serviceRecord) { + + try { // let go of the service from manager + manager.freeService(serviceRecord); + } + catch (Exception e) { + e.printStackTrace(); + } + serviceRecord = null; + } + try { + serviceRecord = manager.getService("qcmgr:" + serverName + "/FILE", this); + } + catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } + + private synchronized void reinstanceIFSDirectory () { + vIFSDirectory = new com.ibm.as400.vaccess.VIFSDirectory(); + if (null != serviceRecord) { + try { + vIFSDirectory.setSystem(serviceRecord.as400); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + } + setPath(); + if (null != errorDialogAdapter) { + vIFSDirectory.addErrorListener(errorDialogAdapter); + } + } + + private void setExplorerPaneRoot() { + if (null != vIFSDirectory) { + try { + aS400ExplorerPane1.setRoot(vIFSDirectory); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + } + } + private void setBrowserPaneRoot() { + if (null != vIFSDirectory) { + browsingPane.setRoot(vIFSDirectory); + } + } + + private void loadPath() { + vIFSDirectory.load(); + } + + private void setPath() { + try { + vIFSDirectory.setPath(pathTextField.getText()); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private com.ibm.as400.vaccess.VIFSDirectory vIFSDirectory; + private javax.swing.JPanel jPanel1; + private com.ibm.as400.vaccess.AS400ExplorerPane aS400ExplorerPane1; + private javax.swing.JPanel jPanel2; + private javax.swing.JButton pathButton; + private javax.swing.JTextField pathTextField; + private javax.swing.JButton systemButton; + private javax.swing.JTextField systemTextField; + private javax.swing.JPanel jPanel3; + private javax.swing.JButton explorerButton; + private javax.swing.JButton detailsButton; + private javax.swing.JButton listButton; + private javax.swing.JButton treeButton; + // End of variables declaration//GEN-END:variables + + /** Sets the QCMgr object which will handle AS400 instances for this client. + * @param mgr A QCMgr object. + */ + public void setManager(QCMgr mgr) { + manager = mgr; + } + + /** Connects the ErrorDialogAdapter with any as400.vaccess components present. + * @param eda An instance of an ErrorDialogAdapter already associated + * with a suitable Frame. + */ + public void propagateEDA(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + errorDialogAdapter=eda; + browsingPane.addErrorListener(eda); + vIFSDirectory.addErrorListener(eda); + } + /** Required implementantion of the QCServiceClient interface. Releases the + * AS400 object provided by the server. + * @param sr The service record which represents the AS400 to be + * relinquished. + */ + public void relinquish(QCServiceRecord sr) { + serviceRecord = null; + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCIFSPanelBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCIFSPanelBeanInfo.java new file mode 100644 index 000000000..0d0fb7243 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCIFSPanelBeanInfo.java @@ -0,0 +1,315 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCIFSPanelBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_optimizedDrawingEnabled = 0; + private static final int PROPERTY_colorModel = 1; + private static final int PROPERTY_minimumSize = 2; + private static final int PROPERTY_visible = 3; + private static final int PROPERTY_toolkit = 4; + private static final int PROPERTY_displayable = 5; + private static final int PROPERTY_opaque = 6; + private static final int PROPERTY_requestFocusEnabled = 7; + private static final int PROPERTY_enabled = 8; + private static final int PROPERTY_autoscrolls = 9; + private static final int PROPERTY_y = 10; + private static final int PROPERTY_x = 11; + private static final int PROPERTY_accessibleContext = 12; + private static final int PROPERTY_componentOrientation = 13; + private static final int PROPERTY_components = 14; + private static final int PROPERTY_managingFocus = 15; + private static final int PROPERTY_inputMethodRequests = 16; + private static final int PROPERTY_border = 17; + private static final int PROPERTY_locale = 18; + private static final int PROPERTY_insets = 19; + private static final int PROPERTY_UIClassID = 20; + private static final int PROPERTY_graphics = 21; + private static final int PROPERTY_minimumSizeSet = 22; + private static final int PROPERTY_actionMap = 23; + private static final int PROPERTY_maximumSizeSet = 24; + private static final int PROPERTY_alignmentY = 25; + private static final int PROPERTY_alignmentX = 26; + private static final int PROPERTY_locationOnScreen = 27; + private static final int PROPERTY_cursor = 28; + private static final int PROPERTY_registeredKeyStrokes = 29; + private static final int PROPERTY_preferredSizeSet = 30; + private static final int PROPERTY_visibleRect = 31; + private static final int PROPERTY_bounds = 32; + private static final int PROPERTY_inputContext = 33; + private static final int PROPERTY_class = 34; + private static final int PROPERTY_focusTraversable = 35; + private static final int PROPERTY_font = 36; + private static final int PROPERTY_inputVerifier = 37; + private static final int PROPERTY_lightweight = 38; + private static final int PROPERTY_paintingTile = 39; + private static final int PROPERTY_maximumSize = 40; + private static final int PROPERTY_layout = 41; + private static final int PROPERTY_treeLock = 42; + private static final int PROPERTY_verifyInputWhenFocusTarget = 43; + private static final int PROPERTY_foreground = 44; + private static final int PROPERTY_preferredSize = 45; + private static final int PROPERTY_debugGraphicsOptions = 46; + private static final int PROPERTY_doubleBuffered = 47; + private static final int PROPERTY_showing = 48; + private static final int PROPERTY_nextFocusableComponent = 49; + private static final int PROPERTY_parent = 50; + private static final int PROPERTY_peer = 51; + private static final int PROPERTY_componentCount = 52; + private static final int PROPERTY_manager = 53; + private static final int PROPERTY_graphicsConfiguration = 54; + private static final int PROPERTY_height = 55; + private static final int PROPERTY_valid = 56; + private static final int PROPERTY_focusCycleRoot = 57; + private static final int PROPERTY_width = 58; + private static final int PROPERTY_toolTipText = 59; + private static final int PROPERTY_background = 60; + private static final int PROPERTY_validateRoot = 61; + private static final int PROPERTY_topLevelAncestor = 62; + private static final int PROPERTY_dropTarget = 63; + private static final int PROPERTY_rootPane = 64; + private static final int PROPERTY_name = 65; + private static final int PROPERTY_component = 66; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[67]; + + static { + try { + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCIFSPanel.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCIFSPanel.class, "getColorModel", null ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCIFSPanel.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCIFSPanel.class, "isVisible", "setVisible" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCIFSPanel.class, "getToolkit", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCIFSPanel.class, "isDisplayable", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCIFSPanel.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCIFSPanel.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCIFSPanel.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCIFSPanel.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCIFSPanel.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCIFSPanel.class, "getX", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCIFSPanel.class, "getAccessibleContext", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCIFSPanel.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCIFSPanel.class, "getComponents", null ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCIFSPanel.class, "isManagingFocus", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCIFSPanel.class, "getInputMethodRequests", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCIFSPanel.class, "getBorder", "setBorder" ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCIFSPanel.class, "getLocale", "setLocale" ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCIFSPanel.class, "getInsets", null ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCIFSPanel.class, "getUIClassID", null ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCIFSPanel.class, "getGraphics", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCIFSPanel.class, "isMinimumSizeSet", null ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCIFSPanel.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCIFSPanel.class, "isMaximumSizeSet", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCIFSPanel.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCIFSPanel.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCIFSPanel.class, "getLocationOnScreen", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCIFSPanel.class, "getCursor", "setCursor" ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCIFSPanel.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCIFSPanel.class, "isPreferredSizeSet", null ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCIFSPanel.class, "getVisibleRect", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCIFSPanel.class, "getBounds", "setBounds" ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCIFSPanel.class, "getInputContext", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCIFSPanel.class, "getClass", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCIFSPanel.class, "isFocusTraversable", null ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCIFSPanel.class, "getFont", "setFont" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCIFSPanel.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCIFSPanel.class, "isLightweight", null ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCIFSPanel.class, "isPaintingTile", null ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCIFSPanel.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCIFSPanel.class, "getLayout", "setLayout" ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCIFSPanel.class, "getTreeLock", null ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCIFSPanel.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCIFSPanel.class, "getForeground", "setForeground" ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCIFSPanel.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCIFSPanel.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCIFSPanel.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCIFSPanel.class, "isShowing", null ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCIFSPanel.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCIFSPanel.class, "getParent", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCIFSPanel.class, "getPeer", null ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCIFSPanel.class, "getComponentCount", null ); + properties[PROPERTY_manager] = new PropertyDescriptor ( "manager", QCIFSPanel.class, null, "setManager" ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCIFSPanel.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCIFSPanel.class, "getHeight", null ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCIFSPanel.class, "isValid", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCIFSPanel.class, "isFocusCycleRoot", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCIFSPanel.class, "getWidth", null ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCIFSPanel.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCIFSPanel.class, "getBackground", "setBackground" ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCIFSPanel.class, "isValidateRoot", null ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCIFSPanel.class, "getTopLevelAncestor", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCIFSPanel.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCIFSPanel.class, "getRootPane", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCIFSPanel.class, "getName", "setName" ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCIFSPanel.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_ancestorListener = 1; + private static final int EVENT_inputMethodListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_propertyChangeListener = 7; + private static final int EVENT_keyListener = 8; + private static final int EVENT_hierarchyListener = 9; + private static final int EVENT_containerListener = 10; + private static final int EVENT_vetoableChangeListener = 11; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[12]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCIFSPanel.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCIFSPanel.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCIFSPanel.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCIFSPanel.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCIFSPanel.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCIFSPanel.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCIFSPanel.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCIFSPanel.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCIFSPanel.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCIFSPanel.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCIFSPanel.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCIFSPanel.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJdbcURL.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJdbcURL.java new file mode 100644 index 000000000..da5e31694 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJdbcURL.java @@ -0,0 +1,181 @@ +/* + * QCJdbcURL.java + * + * Created on July 19, 2000, 9:44 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** A class to canonicalize JDBC URL's. + * @author jax + * @version 1.0 + */ +public class QCJdbcURL extends Object { + + /** Protocol portion of JDBC URL. + */ + public String protocol; + /** Driver portion of JDBC URL. + */ + public String driver; + /** Server portion of JDBC URL. + */ + public String server; + /** Optional arguments portion of JDBC URL, e.g., "?user=fred&password=blue" + */ + public java.util.Vector arguments; + + /** Creates new QCJdbcURL */ + public QCJdbcURL() { + } + + /** Create a URL representation from a URL string. + * @param url The URL string of the form jdbc:driver:server<options> + */ + public QCJdbcURL(java.lang.String url) { + parseURL(url); + } + + /** Parse a string URL into the fields of this object. + * @param url The URL string. + */ + public void parseURL(java.lang.String url) { + java.util.StringTokenizer st; + StringBuffer urlInProcess = new StringBuffer(url); + protocol = null; driver = null; server = null; arguments = null; + st = new java.util.StringTokenizer(urlInProcess.toString(), ":", false); + + // Get the protocol if we have any string. + if (st.hasMoreTokens()) { + protocol = st.nextToken(); + + // Lose the head of the url as passed in. + try { + // Delete the protocol header. + urlInProcess.delete(0, protocol.length()); + } + catch (StringIndexOutOfBoundsException e) { + e.printStackTrace(); + } + } + + // Get the driver if we have anything left. + if (st.hasMoreElements()) { + driver = st.nextToken(); + + // Lose that bit of the url as passed in. + try { + // Delete the colon that must have been there along with the driver name. + urlInProcess.delete(0, 1 + driver.length()); + } + catch (StringIndexOutOfBoundsException e) { + e.printStackTrace(); + } + } + // Now delete the trailing colon and any server-leading "//". + while (urlInProcess.length() >0) { + if ((urlInProcess.charAt(0) == ':') | (urlInProcess.charAt(0) == '/')) { + try { + urlInProcess.deleteCharAt(0); + } + catch (StringIndexOutOfBoundsException e) { + e.printStackTrace(); + } + } + else { // Else we are done with this step. + break; + } + } + + // Create a new tokenizer to process server and remaining arguments. + st = new java.util.StringTokenizer(urlInProcess.toString(), "&?;", true); + + // Get server name + if (st.hasMoreTokens()) { + server = st.nextToken(); + + try { + urlInProcess.delete(0, server.length()); + } + catch (StringIndexOutOfBoundsException e) { + e.printStackTrace(); + } + } + + // See if we need a Vector to hold arguments. + if (st.hasMoreTokens()) { + arguments = new java.util.Vector(10,10); + } + while (st.hasMoreTokens()) { + StringBuffer s = new StringBuffer(st.nextToken()); + if (((s.charAt(0) == '&') + | (s.charAt(0) == '?') + | (s.charAt(0) == ';')) + & st.hasMoreTokens()) + { + s.append(st.nextToken()); + } + arguments.add(s.toString()); + } + } + + /** Returns a string representation of the URL. + * @return The string for the URL. + */ + public String getURL() { + StringBuffer result = new StringBuffer(); + if (null != protocol) { + result.append(protocol + ":"); + if (null != driver) { + result.append(driver + ":"); + if (driver.equals("as400") + | driver.equals("postgresql")) + { + result.append("//"); + } + if (null != server) { + result.append(server); + if (null != arguments) { + for (java.util.Enumeration e = arguments.elements() ; e.hasMoreElements() ;) { + result.append(e.nextElement().toString()); + } + } + } + } + } + return result.toString(); + } + + /** Just testing. Pass this main() a string URL to parse and it will + * parse it and display the parts and its string reconstruction of same. + * @param argv argv[0] == A URL to parse. + */ + public static void main(String[] argv) { + QCJdbcURL url = new QCJdbcURL(argv[0]); + + if (url.protocol != null) { + System.out.println("Protocol: " + url.protocol); + } + + if (url.driver != null) { + System.out.println("Driver: " + url.driver); + } + + if (url.server != null) { + System.out.println("Server: " + url.server); + } + + if (url.arguments != null) { + for (java.util.Enumeration e = url.arguments.elements() ; e.hasMoreElements() ;) { + System.out.println("Argument: " + e.nextElement()); + } + } + System.out.println(url.getURL()); + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJobListPanel.form b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJobListPanel.form new file mode 100644 index 000000000..4411117bb --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJobListPanel.form @@ -0,0 +1,140 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJobListPanel.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJobListPanel.java new file mode 100644 index 000000000..98e708c79 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJobListPanel.java @@ -0,0 +1,250 @@ +/* + * QCJobListPanel.java + * + * Created on July 14, 2000, 9:07 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** Holds Job List display. + * @author jax + * @version 1.0 + */ +public class QCJobListPanel extends javax.swing.JPanel implements com.SoftWoehr.JTOpenContrib.QCDemo.QCServiceClient { + + private QCMgr manager; + private java.lang.String serverName; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCServiceRecord serviceRecord; + private com.ibm.as400.vaccess.ErrorDialogAdapter errorDialogAdapter; + + /** Creates new form QCJobListPanel */ + public QCJobListPanel() { + initComponents (); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the FormEditor. + */ + private void initComponents () {//GEN-BEGIN:initComponents + vJobList1 = new com.ibm.as400.vaccess.VJobList (); + aS400DetailsPane1 = new com.ibm.as400.vaccess.AS400DetailsPane (); + jPanel1 = new javax.swing.JPanel (); + systemLabel = new javax.swing.JLabel (); + systemTextField = new javax.swing.JTextField (); + listButton = new javax.swing.JButton (); + jobNameTextField = new javax.swing.JTextField (); + jobNumberTextField = new javax.swing.JTextField (); + jobUserTextField = new javax.swing.JTextField (); + jobNameLabel = new javax.swing.JLabel (); + jobNumberLabel = new javax.swing.JLabel (); + jobUserLabel = new javax.swing.JLabel (); + jobListLabel = new javax.swing.JLabel (); + + setLayout (new java.awt.BorderLayout ()); + + + + add (aS400DetailsPane1, java.awt.BorderLayout.CENTER); + + jPanel1.setLayout (new java.awt.GridLayout (3, 3)); + jPanel1.setToolTipText ("Shows a job list from the system you choose."); + + systemLabel.setText ("System"); + systemLabel.setToolTipText ("Enter the system name at the right."); + systemLabel.setHorizontalAlignment (javax.swing.SwingConstants.RIGHT); + + jPanel1.add (systemLabel); + + systemTextField.setToolTipText ("Enter the name of the system for which you want a job list."); + + jPanel1.add (systemTextField); + + listButton.setToolTipText ("Click here to get the list of jobs you selected."); + listButton.setText ("Get Job LIst"); + listButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + listButtonActionPerformed (evt); + } + } + ); + + jPanel1.add (listButton); + + jobNameTextField.setToolTipText ("Enter the job name or *ALL."); + jobNameTextField.setText ("*ALL"); + + jPanel1.add (jobNameTextField); + + jobNumberTextField.setToolTipText ("Enter the job number or *ALL."); + jobNumberTextField.setText ("*ALL"); + + jPanel1.add (jobNumberTextField); + + jobUserTextField.setToolTipText ("Enter the user name or *ALL."); + jobUserTextField.setText ("*ALL"); + + jPanel1.add (jobUserTextField); + + jobNameLabel.setText ("Job Name"); + jobNameLabel.setToolTipText ("Above, enter the job name or *ALL."); + jobNameLabel.setHorizontalAlignment (javax.swing.SwingConstants.CENTER); + + jPanel1.add (jobNameLabel); + + jobNumberLabel.setText ("Job Number"); + jobNumberLabel.setToolTipText ("Above, enter the job number or *ALL."); + jobNumberLabel.setHorizontalAlignment (javax.swing.SwingConstants.CENTER); + + jPanel1.add (jobNumberLabel); + + jobUserLabel.setText ("User"); + jobUserLabel.setToolTipText ("Above, enter the user name or *ALL."); + jobUserLabel.setHorizontalAlignment (javax.swing.SwingConstants.CENTER); + + jPanel1.add (jobUserLabel); + + + add (jPanel1, java.awt.BorderLayout.SOUTH); + + jobListLabel.setText ("A list of jobs on the server."); + jobListLabel.setToolTipText ("Fill in the fields at the bottom and press the button to get a list of jobs."); + jobListLabel.setHorizontalAlignment (javax.swing.SwingConstants.CENTER); + + + add (jobListLabel, java.awt.BorderLayout.NORTH); + + }//GEN-END:initComponents + + private void listButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_listButtonActionPerformed + // Add your handling code here: + + // Could take a while. + java.awt.Cursor cursor = getCursor(); + setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR)); + + // Be sure we have a server and job list. + reinstanceServerFromTextEntry(); + reinstanceJobList(); + + // If all is well, go get it. + if (null != vJobList1 && null != serviceRecord) { + setJobConstraints(); + loadJobs(); + setDetailsPaneRoot(); + } + + // The wait is over. + setCursor(cursor); + repaint(500); + }//GEN-LAST:event_listButtonActionPerformed + + private synchronized void reinstanceServerFromTextEntry() { + String newName = systemTextField.getText(); + if (null == serverName) { + serverName = ""; + } + if (null != newName) { + if (!newName.equals("")) { + if (!newName.equals(serverName)) { + serverName = newName; + if (null != serviceRecord) { + + try { // let go of the service from manager + manager.freeService(serviceRecord); + } + catch (Exception e) { + e.printStackTrace(); + } + serviceRecord = null; + } + try { + serviceRecord = manager.getService("qcmgr:" + serverName + "/COMMAND", this); + } + catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } + private synchronized void reinstanceJobList () { + vJobList1 = new com.ibm.as400.vaccess.VJobList(serviceRecord.as400); + if (null != errorDialogAdapter) { + vJobList1.addErrorListener(errorDialogAdapter); + } + } + + private void setDetailsPaneRoot() { + if (null != vJobList1) { + try { + aS400DetailsPane1.setRoot(vJobList1); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + } + } + + private void loadJobs() { + vJobList1.load(); + } + + private void setJobConstraints() { + try { + vJobList1.setName(jobNameTextField.getText()); + vJobList1.setNumber(jobNumberTextField.getText()); + vJobList1.setUser(jobUserTextField.getText()); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private com.ibm.as400.vaccess.VJobList vJobList1; + private com.ibm.as400.vaccess.AS400DetailsPane aS400DetailsPane1; + private javax.swing.JPanel jPanel1; + private javax.swing.JLabel systemLabel; + private javax.swing.JTextField systemTextField; + private javax.swing.JButton listButton; + private javax.swing.JTextField jobNameTextField; + private javax.swing.JTextField jobNumberTextField; + private javax.swing.JTextField jobUserTextField; + private javax.swing.JLabel jobNameLabel; + private javax.swing.JLabel jobNumberLabel; + private javax.swing.JLabel jobUserLabel; + private javax.swing.JLabel jobListLabel; + // End of variables declaration//GEN-END:variables + + /** Sets the QCMgr object which will handle AS400 instances for this client. + * @param mgr A QCMgr object. + */ + public void setManager(QCMgr mgr) { + manager = mgr; + } + + /** Connects the ErrorDialogAdapter with any as400.vaccess components present. + * @param eda An instance of an ErrorDialogAdapter already associated + * with a suitable Frame. + */ + public void propagateEDA(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + errorDialogAdapter=eda; + aS400DetailsPane1.addErrorListener(eda); + vJobList1.addErrorListener(eda); + } + /** Required implementantion of the QCServiceClient interface. Releases the + * AS400 object provided by the server. + * @param sr The service record which represents the AS400 to be + * relinquished. + */ + public void relinquish(QCServiceRecord sr) { + serviceRecord = null; + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJobListPanelBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJobListPanelBeanInfo.java new file mode 100644 index 000000000..202e635c6 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCJobListPanelBeanInfo.java @@ -0,0 +1,315 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCJobListPanelBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_optimizedDrawingEnabled = 0; + private static final int PROPERTY_colorModel = 1; + private static final int PROPERTY_minimumSize = 2; + private static final int PROPERTY_visible = 3; + private static final int PROPERTY_toolkit = 4; + private static final int PROPERTY_displayable = 5; + private static final int PROPERTY_opaque = 6; + private static final int PROPERTY_requestFocusEnabled = 7; + private static final int PROPERTY_enabled = 8; + private static final int PROPERTY_autoscrolls = 9; + private static final int PROPERTY_y = 10; + private static final int PROPERTY_x = 11; + private static final int PROPERTY_accessibleContext = 12; + private static final int PROPERTY_componentOrientation = 13; + private static final int PROPERTY_components = 14; + private static final int PROPERTY_managingFocus = 15; + private static final int PROPERTY_inputMethodRequests = 16; + private static final int PROPERTY_border = 17; + private static final int PROPERTY_locale = 18; + private static final int PROPERTY_insets = 19; + private static final int PROPERTY_UIClassID = 20; + private static final int PROPERTY_graphics = 21; + private static final int PROPERTY_minimumSizeSet = 22; + private static final int PROPERTY_actionMap = 23; + private static final int PROPERTY_maximumSizeSet = 24; + private static final int PROPERTY_alignmentY = 25; + private static final int PROPERTY_alignmentX = 26; + private static final int PROPERTY_locationOnScreen = 27; + private static final int PROPERTY_cursor = 28; + private static final int PROPERTY_registeredKeyStrokes = 29; + private static final int PROPERTY_preferredSizeSet = 30; + private static final int PROPERTY_visibleRect = 31; + private static final int PROPERTY_bounds = 32; + private static final int PROPERTY_inputContext = 33; + private static final int PROPERTY_class = 34; + private static final int PROPERTY_focusTraversable = 35; + private static final int PROPERTY_font = 36; + private static final int PROPERTY_inputVerifier = 37; + private static final int PROPERTY_lightweight = 38; + private static final int PROPERTY_paintingTile = 39; + private static final int PROPERTY_maximumSize = 40; + private static final int PROPERTY_layout = 41; + private static final int PROPERTY_treeLock = 42; + private static final int PROPERTY_verifyInputWhenFocusTarget = 43; + private static final int PROPERTY_foreground = 44; + private static final int PROPERTY_preferredSize = 45; + private static final int PROPERTY_debugGraphicsOptions = 46; + private static final int PROPERTY_doubleBuffered = 47; + private static final int PROPERTY_showing = 48; + private static final int PROPERTY_nextFocusableComponent = 49; + private static final int PROPERTY_parent = 50; + private static final int PROPERTY_peer = 51; + private static final int PROPERTY_componentCount = 52; + private static final int PROPERTY_manager = 53; + private static final int PROPERTY_graphicsConfiguration = 54; + private static final int PROPERTY_height = 55; + private static final int PROPERTY_valid = 56; + private static final int PROPERTY_focusCycleRoot = 57; + private static final int PROPERTY_width = 58; + private static final int PROPERTY_toolTipText = 59; + private static final int PROPERTY_background = 60; + private static final int PROPERTY_validateRoot = 61; + private static final int PROPERTY_topLevelAncestor = 62; + private static final int PROPERTY_dropTarget = 63; + private static final int PROPERTY_rootPane = 64; + private static final int PROPERTY_name = 65; + private static final int PROPERTY_component = 66; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[67]; + + static { + try { + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCJobListPanel.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCJobListPanel.class, "getColorModel", null ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCJobListPanel.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCJobListPanel.class, "isVisible", "setVisible" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCJobListPanel.class, "getToolkit", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCJobListPanel.class, "isDisplayable", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCJobListPanel.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCJobListPanel.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCJobListPanel.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCJobListPanel.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCJobListPanel.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCJobListPanel.class, "getX", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCJobListPanel.class, "getAccessibleContext", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCJobListPanel.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCJobListPanel.class, "getComponents", null ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCJobListPanel.class, "isManagingFocus", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCJobListPanel.class, "getInputMethodRequests", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCJobListPanel.class, "getBorder", "setBorder" ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCJobListPanel.class, "getLocale", "setLocale" ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCJobListPanel.class, "getInsets", null ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCJobListPanel.class, "getUIClassID", null ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCJobListPanel.class, "getGraphics", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCJobListPanel.class, "isMinimumSizeSet", null ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCJobListPanel.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCJobListPanel.class, "isMaximumSizeSet", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCJobListPanel.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCJobListPanel.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCJobListPanel.class, "getLocationOnScreen", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCJobListPanel.class, "getCursor", "setCursor" ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCJobListPanel.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCJobListPanel.class, "isPreferredSizeSet", null ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCJobListPanel.class, "getVisibleRect", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCJobListPanel.class, "getBounds", "setBounds" ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCJobListPanel.class, "getInputContext", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCJobListPanel.class, "getClass", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCJobListPanel.class, "isFocusTraversable", null ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCJobListPanel.class, "getFont", "setFont" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCJobListPanel.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCJobListPanel.class, "isLightweight", null ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCJobListPanel.class, "isPaintingTile", null ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCJobListPanel.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCJobListPanel.class, "getLayout", "setLayout" ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCJobListPanel.class, "getTreeLock", null ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCJobListPanel.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCJobListPanel.class, "getForeground", "setForeground" ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCJobListPanel.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCJobListPanel.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCJobListPanel.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCJobListPanel.class, "isShowing", null ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCJobListPanel.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCJobListPanel.class, "getParent", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCJobListPanel.class, "getPeer", null ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCJobListPanel.class, "getComponentCount", null ); + properties[PROPERTY_manager] = new PropertyDescriptor ( "manager", QCJobListPanel.class, null, "setManager" ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCJobListPanel.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCJobListPanel.class, "getHeight", null ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCJobListPanel.class, "isValid", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCJobListPanel.class, "isFocusCycleRoot", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCJobListPanel.class, "getWidth", null ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCJobListPanel.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCJobListPanel.class, "getBackground", "setBackground" ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCJobListPanel.class, "isValidateRoot", null ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCJobListPanel.class, "getTopLevelAncestor", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCJobListPanel.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCJobListPanel.class, "getRootPane", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCJobListPanel.class, "getName", "setName" ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCJobListPanel.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_ancestorListener = 1; + private static final int EVENT_inputMethodListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_propertyChangeListener = 7; + private static final int EVENT_keyListener = 8; + private static final int EVENT_hierarchyListener = 9; + private static final int EVENT_containerListener = 10; + private static final int EVENT_vetoableChangeListener = 11; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[12]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCJobListPanel.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCJobListPanel.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCJobListPanel.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCJobListPanel.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCJobListPanel.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCJobListPanel.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCJobListPanel.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCJobListPanel.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCJobListPanel.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCJobListPanel.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCJobListPanel.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCJobListPanel.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCListPane.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCListPane.java new file mode 100644 index 000000000..50d9e4181 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCListPane.java @@ -0,0 +1,51 @@ +/* + * QCListPane.java + * + * A wrapper around com.ibm.as400.vaccess.AS400ListPane to + * allow us to polymorphically switch panes in a panel. + * + * Created on July 16, 2000, 2:06 AM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** A wrapper around a JTOpen pane type to allow polymorphism. + * @author jax + * @version 1.0 + */ +public class QCListPane extends com.ibm.as400.vaccess.AS400ListPane implements QCVNodeDisplayer { + + /** Creates new QCExplorer */ + public QCListPane() { + } + + /** Sets the node as root for the pane. + * @param v The VNode to be setRoot by the pane. + */ + public void setRoot(com.ibm.as400.vaccess.VNode v) { + try { + super.setRoot(v); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + } + + /** Add the pane to the Container. + * @param c The Container to be added to. + */ + public void addTo(java.awt.Container c) { + c.add(this); + } + + /** Add error dialog as listener. + * @param eda The ErrorDialogAdapter to add. + */ + public void addErrorListener(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCListPaneBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCListPaneBeanInfo.java new file mode 100644 index 000000000..a9e86fbe8 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCListPaneBeanInfo.java @@ -0,0 +1,335 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCListPaneBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_toolkit = 0; + private static final int PROPERTY_rootPane = 1; + private static final int PROPERTY_visible = 2; + private static final int PROPERTY_topLevelAncestor = 3; + private static final int PROPERTY_treeLock = 4; + private static final int PROPERTY_maximumSize = 5; + private static final int PROPERTY_peer = 6; + private static final int PROPERTY_nextFocusableComponent = 7; + private static final int PROPERTY_componentOrientation = 8; + private static final int PROPERTY_focusCycleRoot = 9; + private static final int PROPERTY_validateRoot = 10; + private static final int PROPERTY_selectionModel = 11; + private static final int PROPERTY_colorModel = 12; + private static final int PROPERTY_model = 13; + private static final int PROPERTY_components = 14; + private static final int PROPERTY_y = 15; + private static final int PROPERTY_x = 16; + private static final int PROPERTY_enabled = 17; + private static final int PROPERTY_opaque = 18; + private static final int PROPERTY_valid = 19; + private static final int PROPERTY_verifyInputWhenFocusTarget = 20; + private static final int PROPERTY_bounds = 21; + private static final int PROPERTY_inputVerifier = 22; + private static final int PROPERTY_autoscrolls = 23; + private static final int PROPERTY_optimizedDrawingEnabled = 24; + private static final int PROPERTY_displayable = 25; + private static final int PROPERTY_allowActions = 26; + private static final int PROPERTY_toolTipText = 27; + private static final int PROPERTY_locale = 28; + private static final int PROPERTY_locationOnScreen = 29; + private static final int PROPERTY_layout = 30; + private static final int PROPERTY_requestFocusEnabled = 31; + private static final int PROPERTY_parent = 32; + private static final int PROPERTY_minimumSizeSet = 33; + private static final int PROPERTY_foreground = 34; + private static final int PROPERTY_font = 35; + private static final int PROPERTY_graphics = 36; + private static final int PROPERTY_UIClassID = 37; + private static final int PROPERTY_width = 38; + private static final int PROPERTY_class = 39; + private static final int PROPERTY_lightweight = 40; + private static final int PROPERTY_accessibleContext = 41; + private static final int PROPERTY_name = 42; + private static final int PROPERTY_showing = 43; + private static final int PROPERTY_confirm = 44; + private static final int PROPERTY_componentCount = 45; + private static final int PROPERTY_border = 46; + private static final int PROPERTY_minimumSize = 47; + private static final int PROPERTY_registeredKeyStrokes = 48; + private static final int PROPERTY_doubleBuffered = 49; + private static final int PROPERTY_debugGraphicsOptions = 50; + private static final int PROPERTY_height = 51; + private static final int PROPERTY_insets = 52; + private static final int PROPERTY_paintingTile = 53; + private static final int PROPERTY_focusTraversable = 54; + private static final int PROPERTY_alignmentY = 55; + private static final int PROPERTY_alignmentX = 56; + private static final int PROPERTY_root = 57; + private static final int PROPERTY_selectedObjects = 58; + private static final int PROPERTY_dropTarget = 59; + private static final int PROPERTY_managingFocus = 60; + private static final int PROPERTY_preferredSize = 61; + private static final int PROPERTY_selectedObject = 62; + private static final int PROPERTY_background = 63; + private static final int PROPERTY_inputContext = 64; + private static final int PROPERTY_preferredSizeSet = 65; + private static final int PROPERTY_cursor = 66; + private static final int PROPERTY_visibleRowCount = 67; + private static final int PROPERTY_maximumSizeSet = 68; + private static final int PROPERTY_actionMap = 69; + private static final int PROPERTY_actionContext = 70; + private static final int PROPERTY_inputMethodRequests = 71; + private static final int PROPERTY_graphicsConfiguration = 72; + private static final int PROPERTY_visibleRect = 73; + private static final int PROPERTY_component = 74; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[75]; + + static { + try { + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCListPane.class, "getToolkit", null ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCListPane.class, "getRootPane", null ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCListPane.class, "isVisible", "setVisible" ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCListPane.class, "getTopLevelAncestor", null ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCListPane.class, "getTreeLock", null ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCListPane.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCListPane.class, "getPeer", null ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCListPane.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCListPane.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCListPane.class, "isFocusCycleRoot", null ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCListPane.class, "isValidateRoot", null ); + properties[PROPERTY_selectionModel] = new PropertyDescriptor ( "selectionModel", QCListPane.class, "getSelectionModel", "setSelectionModel" ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCListPane.class, "getColorModel", null ); + properties[PROPERTY_model] = new PropertyDescriptor ( "model", QCListPane.class, "getModel", null ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCListPane.class, "getComponents", null ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCListPane.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCListPane.class, "getX", null ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCListPane.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCListPane.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCListPane.class, "isValid", null ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCListPane.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCListPane.class, "getBounds", "setBounds" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCListPane.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCListPane.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCListPane.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCListPane.class, "isDisplayable", null ); + properties[PROPERTY_allowActions] = new PropertyDescriptor ( "allowActions", QCListPane.class, "getAllowActions", "setAllowActions" ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCListPane.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCListPane.class, "getLocale", "setLocale" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCListPane.class, "getLocationOnScreen", null ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCListPane.class, "getLayout", "setLayout" ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCListPane.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCListPane.class, "getParent", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCListPane.class, "isMinimumSizeSet", null ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCListPane.class, "getForeground", "setForeground" ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCListPane.class, "getFont", "setFont" ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCListPane.class, "getGraphics", null ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCListPane.class, "getUIClassID", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCListPane.class, "getWidth", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCListPane.class, "getClass", null ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCListPane.class, "isLightweight", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCListPane.class, "getAccessibleContext", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCListPane.class, "getName", "setName" ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCListPane.class, "isShowing", null ); + properties[PROPERTY_confirm] = new PropertyDescriptor ( "confirm", QCListPane.class, "getConfirm", "setConfirm" ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCListPane.class, "getComponentCount", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCListPane.class, "getBorder", "setBorder" ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCListPane.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCListPane.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCListPane.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCListPane.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCListPane.class, "getHeight", null ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCListPane.class, "getInsets", null ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCListPane.class, "isPaintingTile", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCListPane.class, "isFocusTraversable", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCListPane.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCListPane.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_root] = new PropertyDescriptor ( "root", QCListPane.class, "getRoot", "setRoot" ); + properties[PROPERTY_selectedObjects] = new PropertyDescriptor ( "selectedObjects", QCListPane.class, "getSelectedObjects", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCListPane.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCListPane.class, "isManagingFocus", null ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCListPane.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_selectedObject] = new PropertyDescriptor ( "selectedObject", QCListPane.class, "getSelectedObject", null ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCListPane.class, "getBackground", "setBackground" ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCListPane.class, "getInputContext", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCListPane.class, "isPreferredSizeSet", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCListPane.class, "getCursor", "setCursor" ); + properties[PROPERTY_visibleRowCount] = new PropertyDescriptor ( "visibleRowCount", QCListPane.class, "getVisibleRowCount", "setVisibleRowCount" ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCListPane.class, "isMaximumSizeSet", null ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCListPane.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_actionContext] = new PropertyDescriptor ( "actionContext", QCListPane.class, "getActionContext", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCListPane.class, "getInputMethodRequests", null ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCListPane.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCListPane.class, "getVisibleRect", null ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCListPane.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_inputMethodListener = 1; + private static final int EVENT_ancestorListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_listSelectionListener = 7; + private static final int EVENT_propertyChangeListener = 8; + private static final int EVENT_keyListener = 9; + private static final int EVENT_hierarchyListener = 10; + private static final int EVENT_containerListener = 11; + private static final int EVENT_vetoableChangeListener = 12; + private static final int EVENT_errorListener = 13; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[14]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCListPane.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCListPane.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCListPane.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCListPane.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCListPane.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCListPane.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCListPane.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_listSelectionListener] = new EventSetDescriptor ( QCListPane.class, "listSelectionListener", javax.swing.event.ListSelectionListener.class, new String[0], "addListSelectionListener", "removeListSelectionListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCListPane.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCListPane.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCListPane.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCListPane.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCListPane.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + eventSets[EVENT_errorListener] = new EventSetDescriptor ( QCListPane.class, "errorListener", com.ibm.as400.vaccess.ErrorListener.class, new String[0], "addErrorListener", "removeErrorListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgr.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgr.java new file mode 100644 index 000000000..dd78f18ce --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgr.java @@ -0,0 +1,400 @@ +/* + * QCMgr.java + * + * Created on July 12, 2000, 2:37 AM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.util.*; +import com.ibm.as400.access.AS400; + +/** Simple manager for multiple shared AS400 connections. Clients of class + * QCServiceClient make a request for a server and service. The server is + * an AS400. The service is one of the services AS400.FILE etc. A service + * record is returned, which is resubmitted by the client to relinquish + * the service. The AS400 connection is a public data member of that + * service record. The QCMgr instance can also indicate to the QCServiceClient + * that its connection is about to become invalid by calling the client's + * interface function {@link QCServiceClient.relinquish()} + * + * The URL for the service request is of the form: + * + *

 qcmgr:serverName/SERVICE 
+ * + * e.g., qcmgr:ANAS400/FILE + * + * A QCMgr maintains one com.ibm.as400.access.AS400 object for each server. + * If you wish to have multiple instances of server objects, instance multiple + * QCMgr's. + * + * @author jax + * @version 1.0 + */ +public class QCMgr extends Object { + + private QCHash serverHash = new QCHash(); + private QCServiceHash serviceHash = new QCServiceHash(); + + /** This exception is thrown if the "url" submitted for a service + * request is unrecognized. + */ + public class QCUnknownProtocolException extends java.lang.Exception { + QCUnknownProtocolException(String s) { super(s); } + } + + /** This is thrown if a request is made for an unknown or unsupported service. + */ + public class QCUnknownServiceException extends java.lang.Exception { + QCUnknownServiceException(String s) { super(s); } + } + + /** Thrown if an invalid service record is returned by a client to the + * call {@link freeService()}. + */ + public class QCInvalidServiceRecordException extends java.lang.Exception { + QCInvalidServiceRecordException(String s) { super(s); } + } + + /** Class used to parse the requests made for service. + */ + public class Locator { + + String locator; + + Locator (String representation) { locator = representation; } + + public String toHashName () + throws QCUnknownProtocolException + { + String hashName =""; + StringTokenizer tokenizer = new StringTokenizer(locator); + try + { + String protocol= tokenizer.nextToken(":"); + if (!protocol.equals("qcmgr")) + { + throw new QCUnknownProtocolException("QC Unknown protocol: " + protocol); + } /* End if*/ + } /* End try*/ + + catch (NoSuchElementException e) + { + e.printStackTrace(System.err); + } /* End catch*/ + + try + { + hashName = tokenizer.nextToken(":/"); + } /* End try*/ + + catch (NoSuchElementException e) + { + e.printStackTrace(System.err); + } /* End catch*/ + + return hashName; + } + + public String toServerName () + throws QCUnknownProtocolException + { + return toHashName(); + } + + + public String toServiceName () + throws QCUnknownProtocolException + { + String serviceName = ""; + StringTokenizer tokenizer = new StringTokenizer(locator); + try + { + String protocol= tokenizer.nextToken(":"); + if (!protocol.equals("qcmgr")) + { + throw new QCUnknownProtocolException("QC Unknown protocol: " + protocol); + } /* End if*/ + } /* End try*/ + + catch (NoSuchElementException e) + { + e.printStackTrace(System.err); + } /* End catch*/ + + try + { + tokenizer.nextToken("/"); + } /* End try*/ + + catch (NoSuchElementException e) + { + e.printStackTrace(System.err); + } /* End catch*/ + try + { + serviceName = tokenizer.nextToken("/"); + } /* End try*/ + + catch (NoSuchElementException e) + { + e.printStackTrace(System.err); + } /* End catch*/ + return serviceName; + } + + public int toService () + throws QCUnknownProtocolException + { + return convertServiceName(toServiceName()); + } + + + public int convertServiceName(String serviceName) { + int service = -1; + if (serviceName.equals ("COMMAND")) + { + service = AS400.COMMAND; + } + else if (serviceName.equals ("DATAQUEUE")) + { + service = AS400.DATAQUEUE; + } + else if (serviceName.equals ("FILE")) + { + service = AS400.FILE; + } /* End if*/ + else if (serviceName.equals ("PRINT")) + { + service = AS400.PRINT; + } /* End if*/ + else if (serviceName.equals ("RECORDACCESS")) + { + service = AS400.RECORDACCESS; + } /* End if*/ + return service; + } + + public String toProtocol () + { + String protocol = ":NONE:"; + StringTokenizer tokenizer = new StringTokenizer(locator); + try + { + protocol= tokenizer.nextToken(":"); + } /* End try*/ + catch (NoSuchElementException e) + { + e.printStackTrace(System.err); + } /* End catch*/ + return protocol; + } + } + + /** Creates new QCMgr */ + public QCMgr() { + + } + + /** Find a server if we have already created it. + * Create it if not already present. + */ + public AS400 getServer(String serverName,String hashName) { + AS400 a = serverHash.get(hashName); + if (null == a) { + a = new AS400 (serverName); + serverHash.put(serverName, a); + } + return a; + } + + /** Create a new service record */ + public QCServiceRecord createServiceRecord(String serverName,int service,AS400 as400,QCServiceClient client) throws QCUnknownServiceException { + switch (service) + { + case AS400.COMMAND: // Constant indicating the Command AS/400 service. + case AS400.DATAQUEUE: // Constant indicating the Dataqueue AS/400 service. + case AS400.FILE: // Constant indicating the File AS/400 service. + case AS400.PRINT: // Constant indicating the Print AS/400 service. + case AS400.RECORDACCESS: // Constant indicating the Record Access AS/400 service. + break; + default: + throw new QCUnknownServiceException("Unknown service: " + service); + } /* End switch*/ + + QCServiceRecord sr = new QCServiceRecord (serverName, service, as400, client); + return sr; + } + + /** This function accepts a URL-like request from a {@link QCServiceClient} for a + * com.ibm.as400.access.AS400 service on a server. A service record is + * returned which contains the reference to the server. The service record + * is passed back to QCMgr when the QCServiceClient is done with the service. + * @param representation A string of the form qcmgr:server/service + * + * where server is the name of the desired server and + * service is one of the service names for the AS400 + * object, e.g., FILE PRINT etc. + * @param client The client must implement the interface {@link QCServiceClient}. + * @throws QCUnknownServiceException If the name of the service is not recoqnized. + * @throws QCUnknownProtocolException If the "protocol" portion of the URL is not qcmgr. + * @return A QCServiceRecord which can be examined to obtain reference to the AS400 instance being represented. This record is passed back to the QCMgr in the functi{@link on freeServ}ice when the client is done with the service + */ + public QCServiceRecord getService(String representation,QCServiceClient client) throws QCUnknownServiceException, QCUnknownProtocolException { + Locator locator = new Locator(representation); + + final String serverName = locator.toServerName(); + final String hashName = locator.toHashName(); + final int service = locator.toService(); + + AS400 as400 = getServer(serverName,hashName); + + QCServiceRecord sr = + createServiceRecord(serverName, + service, + as400, + client); + + serviceHash.put(sr, as400); + return sr; + } + + /** A QCServiceClient uses this function to inform the QCMgr that the + * service which was obtained is no longer needed by the client. + * @param sr The QCServiceRecord obtained by a call to {@link QCMgr.getService()} + * @throws QCInvalidServiceRecordException If the service record isn't valid. + */ + public void freeService(QCServiceRecord sr) throws QCInvalidServiceRecordException { + if (!serviceHash.containsServiceRecord(sr)) + { + throw new QCInvalidServiceRecordException("Invalid service record: " + sr.toString()); + } + serviceHash.remove(sr); + if (!serviceHash.containsServer(sr.as400)) + { + AS400 as400 = serverHash.remove(sr.serverName); + if (as400.isConnected()) + { + as400.disconnectAllServices(); + } /* End if*/ + } /* End if*/ + else if (!serviceHash.anyServiceClients(sr.as400, sr.service)) { + if (sr.as400.isConnected(sr.service)) + { + sr.as400.disconnectService(sr.service); + } /* End if*/ + } /* End if*/ + } + + /** + * Extract protocol portion of the representation of a service request. + * @param representation + * @return + */ + public String toProtocol(String representation) { + return new Locator(representation).toProtocol(); + } + + /** + * Extract server portion of the representation of a service request. + * @param representation + * @throws QCUnknownProtocolException + * @return + */ + public String toServerName(String representation) throws QCUnknownProtocolException { + return new Locator(representation).toServerName(); + } + + /** + * Extract service portion of the representation of a service request. + * @param representation + * @throws QCUnknownProtocolException + * @return + */ + public String toServiceName(String representation) throws QCUnknownProtocolException { + return new Locator(representation).toServiceName(); + } + + /** + * Extract service portion of the representation of a service request + * and convert it to an AS400 service number. + * @param representation + * @throws QCUnknownProtocolException + * @return + */ + public int toService(String representation) throws QCUnknownProtocolException { + return new Locator(representation).toService(); + } + + /** Return a string representing an AS400 service from its integer value. + * @param service Integer representing an AS400 service constant. + * @return The string name of the service represented by the int. + */ + public String intToServiceName (int service) { + String result = "Unknown"; + switch (service) + { + case AS400.COMMAND: // Constant indicating the Command AS/400 service. + result = "COMMAND"; + break; + case AS400.DATAQUEUE: // Constant indicating the Dataqueue AS/400 service. + result = "DATAQUEUE"; + break; + case AS400.FILE: // Constant indicating the File AS/400 service. + result = "FILE"; + break; + case AS400.PRINT: // Constant indicating the Print AS/400 service. + result = "PRINT"; + break; + case AS400.RECORDACCESS: // Constant indicating the Record Access AS/400 service. + result = "RECORDACCESS"; + break; + } + return result; + } + + /** Return a string illustrating all current service records. + * @return A string of the form server,service\n ... repeated + * for as many service records as exist. + */ + public String serviceRecordsToString () { + StringBuffer result = new StringBuffer(); + for (Enumeration e = serviceHash.keys(); e.hasMoreElements();) { + QCServiceRecord sr = (QCServiceRecord) e.nextElement(); + result.append(sr.serverName + "," + intToServiceName(sr.service) + "\n"); + } + return result.toString(); + } + + /** Return a string listing the servers active */ + public String serversToString () { + StringBuffer result = new StringBuffer(); + for (Enumeration e = serverHash.keys(); e.hasMoreElements();) { + result.append((String) e.nextElement() + ","); + } + return result.toString(); + } + + /** Test QCMgr. + * @param argv Not used. + */ + public static void main(String[] argv) { + QCMgr q = new QCMgr(); + try + { + System.out.println("Protocol == " + q.toProtocol(argv[0])); + System.out.println("System == " + q.toServerName(argv[0])); + System.out.println("Service == " + q.toServiceName(argv[0])); + System.out.println("Service# == " + q.toService(argv[0])); + } /* End try*/ + catch (Exception e) + { + e.printStackTrace(System.err); + } /* End catch*/ + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgrViewer.form b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgrViewer.form new file mode 100644 index 000000000..e32e00292 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgrViewer.form @@ -0,0 +1,53 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgrViewer.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgrViewer.java new file mode 100644 index 000000000..361099637 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgrViewer.java @@ -0,0 +1,126 @@ +/* + * QCMgrViewer.java + * + * Created on July 22, 2000, 5:52 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** + * + * @author jax + * @version + */ +public class QCMgrViewer extends javax.swing.JPanel { + + private QCMgr manager; + + /** Creates new form QCMgrViewer */ + public QCMgrViewer() { + initComponents (); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the FormEditor. + */ + private void initComponents () {//GEN-BEGIN:initComponents + refreshButton = new javax.swing.JButton (); + connectionViewerTextArea = new javax.swing.JTextArea (); + connectionViewerLabel = new javax.swing.JLabel (); + setLayout (new java.awt.BorderLayout ()); + addFocusListener (new java.awt.event.FocusAdapter () { + public void focusGained (java.awt.event.FocusEvent evt) { + formFocusGained (evt); + } + } + ); + + refreshButton.setToolTipText ("Refreshes view of connection manager service sessions."); + refreshButton.setText ("Refresh"); + refreshButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + refreshButtonActionPerformed (evt); + } + } + ); + + + add (refreshButton, java.awt.BorderLayout.SOUTH); + + connectionViewerTextArea.setToolTipText ("Shows the managed connections currently active when you press the Refresh button."); + connectionViewerTextArea.setEnabled (false); + + + add (connectionViewerTextArea, java.awt.BorderLayout.CENTER); + + connectionViewerLabel.setText ("Connection manager service session active in this notebook."); + connectionViewerLabel.setToolTipText ("Connections in this notebook are pooled by a simple connection manager."); + connectionViewerLabel.setHorizontalAlignment (javax.swing.SwingConstants.CENTER); + + + add (connectionViewerLabel, java.awt.BorderLayout.NORTH); + + }//GEN-END:initComponents + + private void formFocusGained (java.awt.event.FocusEvent evt) {//GEN-FIRST:event_formFocusGained + // Add your handling code here: + refresh(); + }//GEN-LAST:event_formFocusGained + + private void refreshButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed + // Add your handling code here: + refresh(); + }//GEN-LAST:event_refreshButtonActionPerformed + + private void refresh() { + if (null != manager) { + // Set the header for servers. + connectionViewerTextArea.setText("Server instances currently active:\n\n"); + java.util.StringTokenizer servers = new java.util.StringTokenizer(manager.serversToString(),","); + + // Get the servers. + while (servers.hasMoreTokens()) { + connectionViewerTextArea.append(servers.nextToken() + " "); + } + + // Make some space. + connectionViewerTextArea.append("\n\n"); + + // Set the header for the service connections + connectionViewerTextArea.append("Service connections currently active:\n\n"); + + // Get the service connections. + java.util.StringTokenizer records = new java.util.StringTokenizer(manager.serviceRecordsToString(),"\n"); + while (records.hasMoreTokens()) { + java.util.StringTokenizer record = new java.util.StringTokenizer(records.nextToken(), ","); + if (record.hasMoreTokens()) { + connectionViewerTextArea.append("Server: " + record.nextToken() + "\n"); + } + if (record.hasMoreTokens()) { + connectionViewerTextArea.append("Service: " + record.nextToken() + "\n\n"); + } + } + + // Done. + repaint(500); + } + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton refreshButton; + private javax.swing.JTextArea connectionViewerTextArea; + private javax.swing.JLabel connectionViewerLabel; + // End of variables declaration//GEN-END:variables + + /** Sets the manager for this component to poll for service connections. */ + public void setManager (QCMgr mgr) { + manager = mgr; + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgrViewerBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgrViewerBeanInfo.java new file mode 100644 index 000000000..d92681a4f --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCMgrViewerBeanInfo.java @@ -0,0 +1,315 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCMgrViewerBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_font = 0; + private static final int PROPERTY_componentCount = 1; + private static final int PROPERTY_height = 2; + private static final int PROPERTY_width = 3; + private static final int PROPERTY_insets = 4; + private static final int PROPERTY_opaque = 5; + private static final int PROPERTY_displayable = 6; + private static final int PROPERTY_optimizedDrawingEnabled = 7; + private static final int PROPERTY_name = 8; + private static final int PROPERTY_managingFocus = 9; + private static final int PROPERTY_dropTarget = 10; + private static final int PROPERTY_parent = 11; + private static final int PROPERTY_layout = 12; + private static final int PROPERTY_y = 13; + private static final int PROPERTY_x = 14; + private static final int PROPERTY_graphicsConfiguration = 15; + private static final int PROPERTY_treeLock = 16; + private static final int PROPERTY_bounds = 17; + private static final int PROPERTY_minimumSize = 18; + private static final int PROPERTY_registeredKeyStrokes = 19; + private static final int PROPERTY_minimumSizeSet = 20; + private static final int PROPERTY_inputContext = 21; + private static final int PROPERTY_UIClassID = 22; + private static final int PROPERTY_showing = 23; + private static final int PROPERTY_paintingTile = 24; + private static final int PROPERTY_cursor = 25; + private static final int PROPERTY_enabled = 26; + private static final int PROPERTY_colorModel = 27; + private static final int PROPERTY_rootPane = 28; + private static final int PROPERTY_accessibleContext = 29; + private static final int PROPERTY_focusCycleRoot = 30; + private static final int PROPERTY_visible = 31; + private static final int PROPERTY_valid = 32; + private static final int PROPERTY_componentOrientation = 33; + private static final int PROPERTY_autoscrolls = 34; + private static final int PROPERTY_nextFocusableComponent = 35; + private static final int PROPERTY_background = 36; + private static final int PROPERTY_debugGraphicsOptions = 37; + private static final int PROPERTY_lightweight = 38; + private static final int PROPERTY_doubleBuffered = 39; + private static final int PROPERTY_graphics = 40; + private static final int PROPERTY_topLevelAncestor = 41; + private static final int PROPERTY_validateRoot = 42; + private static final int PROPERTY_locale = 43; + private static final int PROPERTY_toolkit = 44; + private static final int PROPERTY_preferredSize = 45; + private static final int PROPERTY_visibleRect = 46; + private static final int PROPERTY_peer = 47; + private static final int PROPERTY_components = 48; + private static final int PROPERTY_toolTipText = 49; + private static final int PROPERTY_verifyInputWhenFocusTarget = 50; + private static final int PROPERTY_maximumSizeSet = 51; + private static final int PROPERTY_manager = 52; + private static final int PROPERTY_requestFocusEnabled = 53; + private static final int PROPERTY_actionMap = 54; + private static final int PROPERTY_inputVerifier = 55; + private static final int PROPERTY_focusTraversable = 56; + private static final int PROPERTY_preferredSizeSet = 57; + private static final int PROPERTY_foreground = 58; + private static final int PROPERTY_maximumSize = 59; + private static final int PROPERTY_class = 60; + private static final int PROPERTY_inputMethodRequests = 61; + private static final int PROPERTY_alignmentY = 62; + private static final int PROPERTY_alignmentX = 63; + private static final int PROPERTY_locationOnScreen = 64; + private static final int PROPERTY_border = 65; + private static final int PROPERTY_component = 66; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[67]; + + static { + try { + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCMgrViewer.class, "getFont", "setFont" ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCMgrViewer.class, "getComponentCount", null ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCMgrViewer.class, "getHeight", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCMgrViewer.class, "getWidth", null ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCMgrViewer.class, "getInsets", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCMgrViewer.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCMgrViewer.class, "isDisplayable", null ); + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCMgrViewer.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCMgrViewer.class, "getName", "setName" ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCMgrViewer.class, "isManagingFocus", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCMgrViewer.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCMgrViewer.class, "getParent", null ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCMgrViewer.class, "getLayout", "setLayout" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCMgrViewer.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCMgrViewer.class, "getX", null ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCMgrViewer.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCMgrViewer.class, "getTreeLock", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCMgrViewer.class, "getBounds", "setBounds" ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCMgrViewer.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCMgrViewer.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCMgrViewer.class, "isMinimumSizeSet", null ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCMgrViewer.class, "getInputContext", null ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCMgrViewer.class, "getUIClassID", null ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCMgrViewer.class, "isShowing", null ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCMgrViewer.class, "isPaintingTile", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCMgrViewer.class, "getCursor", "setCursor" ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCMgrViewer.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCMgrViewer.class, "getColorModel", null ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCMgrViewer.class, "getRootPane", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCMgrViewer.class, "getAccessibleContext", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCMgrViewer.class, "isFocusCycleRoot", null ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCMgrViewer.class, "isVisible", "setVisible" ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCMgrViewer.class, "isValid", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCMgrViewer.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCMgrViewer.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCMgrViewer.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCMgrViewer.class, "getBackground", "setBackground" ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCMgrViewer.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCMgrViewer.class, "isLightweight", null ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCMgrViewer.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCMgrViewer.class, "getGraphics", null ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCMgrViewer.class, "getTopLevelAncestor", null ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCMgrViewer.class, "isValidateRoot", null ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCMgrViewer.class, "getLocale", "setLocale" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCMgrViewer.class, "getToolkit", null ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCMgrViewer.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCMgrViewer.class, "getVisibleRect", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCMgrViewer.class, "getPeer", null ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCMgrViewer.class, "getComponents", null ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCMgrViewer.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCMgrViewer.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCMgrViewer.class, "isMaximumSizeSet", null ); + properties[PROPERTY_manager] = new PropertyDescriptor ( "manager", QCMgrViewer.class, null, "setManager" ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCMgrViewer.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCMgrViewer.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCMgrViewer.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCMgrViewer.class, "isFocusTraversable", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCMgrViewer.class, "isPreferredSizeSet", null ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCMgrViewer.class, "getForeground", "setForeground" ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCMgrViewer.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCMgrViewer.class, "getClass", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCMgrViewer.class, "getInputMethodRequests", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCMgrViewer.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCMgrViewer.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCMgrViewer.class, "getLocationOnScreen", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCMgrViewer.class, "getBorder", "setBorder" ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCMgrViewer.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_ancestorListener = 1; + private static final int EVENT_inputMethodListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_propertyChangeListener = 7; + private static final int EVENT_keyListener = 8; + private static final int EVENT_hierarchyListener = 9; + private static final int EVENT_containerListener = 10; + private static final int EVENT_vetoableChangeListener = 11; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[12]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCMgrViewer.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCMgrViewer.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCMgrViewer.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCMgrViewer.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCMgrViewer.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCMgrViewer.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCMgrViewer.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCMgrViewer.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCMgrViewer.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCMgrViewer.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCMgrViewer.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCMgrViewer.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCNotebookPanel.form b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCNotebookPanel.form new file mode 100644 index 000000000..033909cb8 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCNotebookPanel.form @@ -0,0 +1,133 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCNotebookPanel.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCNotebookPanel.java new file mode 100644 index 000000000..2035f9601 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCNotebookPanel.java @@ -0,0 +1,131 @@ +/* + * QCNotebookPanel.java + * + * Created on July 12, 2000, 1:54 AM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** A notebook to hold useful panels of as400.vaccess components. + * @author jax + * @version 1.0 + */ +public class QCNotebookPanel extends javax.swing.JPanel { + + private com.SoftWoehr.JTOpenContrib.QCDemo.QCMgr manager; + /** Creates new form QCNotebookPanel */ + public QCNotebookPanel() { + initComponents (); + manager = new com.SoftWoehr.JTOpenContrib.QCDemo.QCMgr (); + setManagers(); + qCSQLQueryBuilderPanel1.setResultTable(qCSQLResultSetTablePanel1); + qCSQLQueryBuilderPanel1.setResultForm(qCSQLResultSetFormPanel1); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the FormEditor. + */ + private void initComponents () {//GEN-BEGIN:initComponents + jTabbedPane1 = new javax.swing.JTabbedPane (); + qCCommandPanel1 = new com.SoftWoehr.JTOpenContrib.QCDemo.QCCommandPanel (); + qCIFSPanel1 = new com.SoftWoehr.JTOpenContrib.QCDemo.QCIFSPanel (); + qCUserListPanel1 = new com.SoftWoehr.JTOpenContrib.QCDemo.QCUserListPanel (); + qCJobListPanel1 = new com.SoftWoehr.JTOpenContrib.QCDemo.QCJobListPanel (); + qCPrinterListPanel1 = new com.SoftWoehr.JTOpenContrib.QCDemo.QCPrinterListPanel (); + qCSpooledFileViewerPanel1 = new com.SoftWoehr.JTOpenContrib.QCDemo.QCSpooledFileViewerPanel (); + qCSQLQueryBuilderPanel1 = new com.SoftWoehr.JTOpenContrib.QCDemo.QCSQLQueryBuilderPanel (); + qCSQLResultSetTablePanel1 = new com.SoftWoehr.JTOpenContrib.QCDemo.QCSQLResultSetTablePanel (); + qCSQLResultSetFormPanel1 = new com.SoftWoehr.JTOpenContrib.QCDemo.QCSQLResultSetFormPanel (); + qCMgrViewer1 = new com.SoftWoehr.JTOpenContrib.QCDemo.QCMgrViewer (); + setLayout (new java.awt.BorderLayout ()); + + jTabbedPane1.setPreferredSize (new java.awt.Dimension(450, 350)); + + qCCommandPanel1.setPreferredSize (new java.awt.Dimension(450, 380)); + qCCommandPanel1.setName (""); + qCCommandPanel1.setToolTipText ("Uses an AS400 Command Button to execute a command on a server."); + + jTabbedPane1.addTab ("Command", null, qCCommandPanel1, "Click here for Command page."); + + + jTabbedPane1.addTab ("IFS Viewer", qCIFSPanel1); + + + jTabbedPane1.addTab ("User List", null, qCUserListPanel1, "Click here to get a list of users."); + + qCJobListPanel1.setPreferredSize (new java.awt.Dimension(450, 380)); + qCJobListPanel1.setToolTipText ("Shows Job List on system of your choice."); + + jTabbedPane1.addTab ("JobList", null, qCJobListPanel1, "Click here for Job List page."); + + + jTabbedPane1.addTab ("Printer List", qCPrinterListPanel1); + + + jTabbedPane1.addTab ("Spooled File Viewer", qCSpooledFileViewerPanel1); + + + jTabbedPane1.addTab ("SQL Query Builder", qCSQLQueryBuilderPanel1); + + qCSQLResultSetTablePanel1.setToolTipText ("Shows the results of queries issued by the SQL Query Builder."); + + jTabbedPane1.addTab ("SQL Result Table", qCSQLResultSetTablePanel1); + + + jTabbedPane1.addTab ("SQL Result Form", qCSQLResultSetFormPanel1); + + + jTabbedPane1.addTab ("Connection Manager Viewer", qCMgrViewer1); + + + add (jTabbedPane1, java.awt.BorderLayout.CENTER); + + }//GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTabbedPane jTabbedPane1; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCCommandPanel qCCommandPanel1; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCIFSPanel qCIFSPanel1; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCUserListPanel qCUserListPanel1; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCJobListPanel qCJobListPanel1; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCPrinterListPanel qCPrinterListPanel1; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCSpooledFileViewerPanel qCSpooledFileViewerPanel1; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCSQLQueryBuilderPanel qCSQLQueryBuilderPanel1; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCSQLResultSetTablePanel qCSQLResultSetTablePanel1; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCSQLResultSetFormPanel qCSQLResultSetFormPanel1; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCMgrViewer qCMgrViewer1; + // End of variables declaration//GEN-END:variables + + /** Propagates an ErrorDialogAdapter to those as400.vaccess components which need it. + * @param eda An instance of ErrorDialogAdapter already associated + * with a suitable frame. + */ + public void propagateEDA(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + qCCommandPanel1.propagateEDA(eda); + qCJobListPanel1.propagateEDA(eda); + qCUserListPanel1.propagateEDA(eda); + qCIFSPanel1.propagateEDA(eda); + qCPrinterListPanel1.propagateEDA(eda); + qCSpooledFileViewerPanel1.propagateEDA(eda); + qCSQLQueryBuilderPanel1.propagateEDA(eda); + qCSQLResultSetTablePanel1.propagateEDA(eda); + } + + private void setManagers() { + qCCommandPanel1.setManager(manager); + qCJobListPanel1.setManager(manager); + qCUserListPanel1.setManager(manager); + qCIFSPanel1.setManager(manager); + qCPrinterListPanel1.setManager(manager); + qCSpooledFileViewerPanel1.setManager(manager); + qCMgrViewer1.setManager(manager); + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCNotebookPanelBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCNotebookPanelBeanInfo.java new file mode 100644 index 000000000..906a03009 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCNotebookPanelBeanInfo.java @@ -0,0 +1,313 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCNotebookPanelBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_font = 0; + private static final int PROPERTY_componentCount = 1; + private static final int PROPERTY_height = 2; + private static final int PROPERTY_width = 3; + private static final int PROPERTY_insets = 4; + private static final int PROPERTY_opaque = 5; + private static final int PROPERTY_displayable = 6; + private static final int PROPERTY_optimizedDrawingEnabled = 7; + private static final int PROPERTY_name = 8; + private static final int PROPERTY_managingFocus = 9; + private static final int PROPERTY_dropTarget = 10; + private static final int PROPERTY_parent = 11; + private static final int PROPERTY_layout = 12; + private static final int PROPERTY_y = 13; + private static final int PROPERTY_x = 14; + private static final int PROPERTY_graphicsConfiguration = 15; + private static final int PROPERTY_treeLock = 16; + private static final int PROPERTY_bounds = 17; + private static final int PROPERTY_minimumSize = 18; + private static final int PROPERTY_registeredKeyStrokes = 19; + private static final int PROPERTY_minimumSizeSet = 20; + private static final int PROPERTY_inputContext = 21; + private static final int PROPERTY_UIClassID = 22; + private static final int PROPERTY_showing = 23; + private static final int PROPERTY_paintingTile = 24; + private static final int PROPERTY_cursor = 25; + private static final int PROPERTY_enabled = 26; + private static final int PROPERTY_colorModel = 27; + private static final int PROPERTY_rootPane = 28; + private static final int PROPERTY_accessibleContext = 29; + private static final int PROPERTY_focusCycleRoot = 30; + private static final int PROPERTY_visible = 31; + private static final int PROPERTY_valid = 32; + private static final int PROPERTY_componentOrientation = 33; + private static final int PROPERTY_autoscrolls = 34; + private static final int PROPERTY_nextFocusableComponent = 35; + private static final int PROPERTY_background = 36; + private static final int PROPERTY_debugGraphicsOptions = 37; + private static final int PROPERTY_lightweight = 38; + private static final int PROPERTY_doubleBuffered = 39; + private static final int PROPERTY_graphics = 40; + private static final int PROPERTY_topLevelAncestor = 41; + private static final int PROPERTY_validateRoot = 42; + private static final int PROPERTY_locale = 43; + private static final int PROPERTY_toolkit = 44; + private static final int PROPERTY_preferredSize = 45; + private static final int PROPERTY_visibleRect = 46; + private static final int PROPERTY_peer = 47; + private static final int PROPERTY_components = 48; + private static final int PROPERTY_toolTipText = 49; + private static final int PROPERTY_verifyInputWhenFocusTarget = 50; + private static final int PROPERTY_maximumSizeSet = 51; + private static final int PROPERTY_requestFocusEnabled = 52; + private static final int PROPERTY_actionMap = 53; + private static final int PROPERTY_inputVerifier = 54; + private static final int PROPERTY_focusTraversable = 55; + private static final int PROPERTY_preferredSizeSet = 56; + private static final int PROPERTY_foreground = 57; + private static final int PROPERTY_maximumSize = 58; + private static final int PROPERTY_class = 59; + private static final int PROPERTY_inputMethodRequests = 60; + private static final int PROPERTY_alignmentY = 61; + private static final int PROPERTY_alignmentX = 62; + private static final int PROPERTY_locationOnScreen = 63; + private static final int PROPERTY_border = 64; + private static final int PROPERTY_component = 65; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[66]; + + static { + try { + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCNotebookPanel.class, "getFont", "setFont" ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCNotebookPanel.class, "getComponentCount", null ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCNotebookPanel.class, "getHeight", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCNotebookPanel.class, "getWidth", null ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCNotebookPanel.class, "getInsets", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCNotebookPanel.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCNotebookPanel.class, "isDisplayable", null ); + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCNotebookPanel.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCNotebookPanel.class, "getName", "setName" ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCNotebookPanel.class, "isManagingFocus", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCNotebookPanel.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCNotebookPanel.class, "getParent", null ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCNotebookPanel.class, "getLayout", "setLayout" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCNotebookPanel.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCNotebookPanel.class, "getX", null ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCNotebookPanel.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCNotebookPanel.class, "getTreeLock", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCNotebookPanel.class, "getBounds", "setBounds" ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCNotebookPanel.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCNotebookPanel.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCNotebookPanel.class, "isMinimumSizeSet", null ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCNotebookPanel.class, "getInputContext", null ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCNotebookPanel.class, "getUIClassID", null ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCNotebookPanel.class, "isShowing", null ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCNotebookPanel.class, "isPaintingTile", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCNotebookPanel.class, "getCursor", "setCursor" ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCNotebookPanel.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCNotebookPanel.class, "getColorModel", null ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCNotebookPanel.class, "getRootPane", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCNotebookPanel.class, "getAccessibleContext", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCNotebookPanel.class, "isFocusCycleRoot", null ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCNotebookPanel.class, "isVisible", "setVisible" ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCNotebookPanel.class, "isValid", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCNotebookPanel.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCNotebookPanel.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCNotebookPanel.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCNotebookPanel.class, "getBackground", "setBackground" ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCNotebookPanel.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCNotebookPanel.class, "isLightweight", null ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCNotebookPanel.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCNotebookPanel.class, "getGraphics", null ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCNotebookPanel.class, "getTopLevelAncestor", null ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCNotebookPanel.class, "isValidateRoot", null ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCNotebookPanel.class, "getLocale", "setLocale" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCNotebookPanel.class, "getToolkit", null ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCNotebookPanel.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCNotebookPanel.class, "getVisibleRect", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCNotebookPanel.class, "getPeer", null ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCNotebookPanel.class, "getComponents", null ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCNotebookPanel.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCNotebookPanel.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCNotebookPanel.class, "isMaximumSizeSet", null ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCNotebookPanel.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCNotebookPanel.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCNotebookPanel.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCNotebookPanel.class, "isFocusTraversable", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCNotebookPanel.class, "isPreferredSizeSet", null ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCNotebookPanel.class, "getForeground", "setForeground" ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCNotebookPanel.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCNotebookPanel.class, "getClass", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCNotebookPanel.class, "getInputMethodRequests", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCNotebookPanel.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCNotebookPanel.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCNotebookPanel.class, "getLocationOnScreen", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCNotebookPanel.class, "getBorder", "setBorder" ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCNotebookPanel.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_ancestorListener = 1; + private static final int EVENT_inputMethodListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_propertyChangeListener = 7; + private static final int EVENT_keyListener = 8; + private static final int EVENT_hierarchyListener = 9; + private static final int EVENT_containerListener = 10; + private static final int EVENT_vetoableChangeListener = 11; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[12]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCNotebookPanel.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCNotebookPanel.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCNotebookPanel.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCNotebookPanel.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCNotebookPanel.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCNotebookPanel.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCNotebookPanel.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCNotebookPanel.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCNotebookPanel.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCNotebookPanel.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCNotebookPanel.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCNotebookPanel.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCPrinterListPanel.form b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCPrinterListPanel.form new file mode 100644 index 000000000..958196ead --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCPrinterListPanel.form @@ -0,0 +1,89 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCPrinterListPanel.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCPrinterListPanel.java new file mode 100644 index 000000000..5878d9624 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCPrinterListPanel.java @@ -0,0 +1,228 @@ +/* + * QCPrinterListPanel.java + * + * Created on July 18, 2000, 6:41 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** Panel to list printers in an explorer view. + * @author jax + * @version 1.0 + */ +public class QCPrinterListPanel extends javax.swing.JPanel implements QCServiceClient { + + private QCMgr manager; + private java.lang.String serverName; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCServiceRecord serviceRecord; + private com.ibm.as400.vaccess.ErrorDialogAdapter errorDialogAdapter; + + /** Creates new form QCPrinterListPanel */ + public QCPrinterListPanel() { + initComponents (); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the FormEditor. + */ + private void initComponents () {//GEN-BEGIN:initComponents + vPrinters1 = new com.ibm.as400.vaccess.VPrinters (); + aS400ExplorerPane = new com.ibm.as400.vaccess.AS400ExplorerPane (); + jPanel1 = new javax.swing.JPanel (); + filterButton = new javax.swing.JButton (); + filterTextField = new javax.swing.JTextField (); + systemLabel = new javax.swing.JLabel (); + systemTextField = new javax.swing.JTextField (); + + setLayout (new java.awt.BorderLayout ()); + setPreferredSize (new java.awt.Dimension(300, 250)); + + + + add (aS400ExplorerPane, java.awt.BorderLayout.CENTER); + + jPanel1.setLayout (new java.awt.GridLayout (2, 2)); + jPanel1.setToolTipText ("Displays a list of printers."); + + filterButton.setToolTipText ("Gets printer list per your specification."); + filterButton.setText ("Get Printer List"); + filterButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + filterButtonActionPerformed (evt); + } + } + ); + + jPanel1.add (filterButton); + + filterTextField.setToolTipText ("Enter printer name or printer name* or *ALL."); + filterTextField.setText ("*ALL"); + filterTextField.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + filterTextFieldActionPerformed (evt); + } + } + ); + + jPanel1.add (filterTextField); + + systemLabel.setText ("System"); + systemLabel.setToolTipText ("Enter the system name at right."); + systemLabel.setHorizontalAlignment (javax.swing.SwingConstants.RIGHT); + + jPanel1.add (systemLabel); + + systemTextField.setToolTipText ("Name of AS/400 to connect with."); + + jPanel1.add (systemTextField); + + + add (jPanel1, java.awt.BorderLayout.SOUTH); + + }//GEN-END:initComponents + + // Pressing the button and pressing ENTER do the same. + private void filterTextFieldActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_filterTextFieldActionPerformed + // Add your handling code here: + filterButtonActionPerformed(evt); + }//GEN-LAST:event_filterTextFieldActionPerformed + + // Pressing the button and pressing ENTER do the same. + private void filterButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_filterButtonActionPerformed + // Add your handling code here: + + // Loading the printers can take some time! + java.awt.Cursor currentCursor = jPanel1.getCursor(); + setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR)); + + // Make sure we have a server. + reinstanceServerFromTextEntry(); + + // Can't change path of a loaded VIFSDirectory. + // Might as well each time re-instance the VIFSDirectory + // since pushing the button requests a reload anyway. + reinstancePrinterList(); + + // Set the path from the string gadget. + try { + vPrinters1.setPrinterFilter(filterTextField.getText()); + } + + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + + // Load the data. + try + { + vPrinters1.load(); + }/* End try*/ + + catch (Exception e) + { + e.printStackTrace(); + }/* End catch*/ + + // Set the pane's root (model) to the current VPrinters object. + setPaneRoot(); + + // The wait is over. + setCursor(currentCursor); + + }//GEN-LAST:event_filterButtonActionPerformed + + private synchronized void reinstanceServerFromTextEntry() { + String newName = systemTextField.getText(); + if (null == serverName) { + serverName = ""; + } + if (null != newName) { + if (!newName.equals("")) { + if (!newName.equals(serverName)) { + serverName = newName; + if (null != serviceRecord) { + + try { // let go of the service from manager + manager.freeService(serviceRecord); + } + catch (Exception e) { + e.printStackTrace(); + } + serviceRecord = null; + } + try { + serviceRecord = manager.getService("qcmgr:" + serverName + "/PRINT", this); + } + catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } + + private synchronized void reinstancePrinterList () { + if (null != serviceRecord) { + vPrinters1 = new com.ibm.as400.vaccess.VPrinters(serviceRecord.as400); + if (null != errorDialogAdapter) { + vPrinters1.addErrorListener(errorDialogAdapter); + } + } + } + + private void setPaneRoot() { + if (null != vPrinters1) { + try { + aS400ExplorerPane.setRoot(vPrinters1); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + } + } + + private void loadPrinters () { + vPrinters1.load(); + } + // Variables declaration - do not modify//GEN-BEGIN:variables + private com.ibm.as400.vaccess.VPrinters vPrinters1; + private com.ibm.as400.vaccess.AS400ExplorerPane aS400ExplorerPane; + private javax.swing.JPanel jPanel1; + private javax.swing.JButton filterButton; + private javax.swing.JTextField filterTextField; + private javax.swing.JLabel systemLabel; + private javax.swing.JTextField systemTextField; + // End of variables declaration//GEN-END:variables + + /** Sets the QCMgr object which will handle AS400 instances for this client. + * @param mgr A QCMgr object. + */ + public void setManager(QCMgr mgr) { + manager = mgr; + } + + /** Connects the ErrorDialogAdapter with any as400.vaccess components present. + * @param eda An instance of an ErrorDialogAdapter already associated + * with a suitable Frame. + */ + public void propagateEDA(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + errorDialogAdapter=eda; + aS400ExplorerPane.addErrorListener(eda); + vPrinters1.addErrorListener(eda); + } + /** Required implementantion of the QCServiceClient interface. Releases the + * AS400 object provided by the server. + * @param sr The service record which represents the AS400 to be + * relinquished. + */ + public void relinquish(QCServiceRecord sr) { + serviceRecord = null; + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCPrinterListPanelBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCPrinterListPanelBeanInfo.java new file mode 100644 index 000000000..b7c456052 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCPrinterListPanelBeanInfo.java @@ -0,0 +1,315 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCPrinterListPanelBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_optimizedDrawingEnabled = 0; + private static final int PROPERTY_colorModel = 1; + private static final int PROPERTY_minimumSize = 2; + private static final int PROPERTY_visible = 3; + private static final int PROPERTY_toolkit = 4; + private static final int PROPERTY_displayable = 5; + private static final int PROPERTY_opaque = 6; + private static final int PROPERTY_requestFocusEnabled = 7; + private static final int PROPERTY_enabled = 8; + private static final int PROPERTY_autoscrolls = 9; + private static final int PROPERTY_y = 10; + private static final int PROPERTY_x = 11; + private static final int PROPERTY_accessibleContext = 12; + private static final int PROPERTY_componentOrientation = 13; + private static final int PROPERTY_components = 14; + private static final int PROPERTY_managingFocus = 15; + private static final int PROPERTY_inputMethodRequests = 16; + private static final int PROPERTY_border = 17; + private static final int PROPERTY_locale = 18; + private static final int PROPERTY_insets = 19; + private static final int PROPERTY_UIClassID = 20; + private static final int PROPERTY_graphics = 21; + private static final int PROPERTY_minimumSizeSet = 22; + private static final int PROPERTY_actionMap = 23; + private static final int PROPERTY_maximumSizeSet = 24; + private static final int PROPERTY_alignmentY = 25; + private static final int PROPERTY_alignmentX = 26; + private static final int PROPERTY_locationOnScreen = 27; + private static final int PROPERTY_cursor = 28; + private static final int PROPERTY_registeredKeyStrokes = 29; + private static final int PROPERTY_preferredSizeSet = 30; + private static final int PROPERTY_visibleRect = 31; + private static final int PROPERTY_bounds = 32; + private static final int PROPERTY_inputContext = 33; + private static final int PROPERTY_class = 34; + private static final int PROPERTY_focusTraversable = 35; + private static final int PROPERTY_font = 36; + private static final int PROPERTY_inputVerifier = 37; + private static final int PROPERTY_lightweight = 38; + private static final int PROPERTY_paintingTile = 39; + private static final int PROPERTY_maximumSize = 40; + private static final int PROPERTY_layout = 41; + private static final int PROPERTY_treeLock = 42; + private static final int PROPERTY_verifyInputWhenFocusTarget = 43; + private static final int PROPERTY_foreground = 44; + private static final int PROPERTY_preferredSize = 45; + private static final int PROPERTY_debugGraphicsOptions = 46; + private static final int PROPERTY_doubleBuffered = 47; + private static final int PROPERTY_showing = 48; + private static final int PROPERTY_nextFocusableComponent = 49; + private static final int PROPERTY_parent = 50; + private static final int PROPERTY_peer = 51; + private static final int PROPERTY_componentCount = 52; + private static final int PROPERTY_manager = 53; + private static final int PROPERTY_graphicsConfiguration = 54; + private static final int PROPERTY_height = 55; + private static final int PROPERTY_valid = 56; + private static final int PROPERTY_focusCycleRoot = 57; + private static final int PROPERTY_width = 58; + private static final int PROPERTY_toolTipText = 59; + private static final int PROPERTY_background = 60; + private static final int PROPERTY_validateRoot = 61; + private static final int PROPERTY_topLevelAncestor = 62; + private static final int PROPERTY_dropTarget = 63; + private static final int PROPERTY_rootPane = 64; + private static final int PROPERTY_name = 65; + private static final int PROPERTY_component = 66; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[67]; + + static { + try { + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCPrinterListPanel.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCPrinterListPanel.class, "getColorModel", null ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCPrinterListPanel.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCPrinterListPanel.class, "isVisible", "setVisible" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCPrinterListPanel.class, "getToolkit", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCPrinterListPanel.class, "isDisplayable", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCPrinterListPanel.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCPrinterListPanel.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCPrinterListPanel.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCPrinterListPanel.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCPrinterListPanel.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCPrinterListPanel.class, "getX", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCPrinterListPanel.class, "getAccessibleContext", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCPrinterListPanel.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCPrinterListPanel.class, "getComponents", null ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCPrinterListPanel.class, "isManagingFocus", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCPrinterListPanel.class, "getInputMethodRequests", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCPrinterListPanel.class, "getBorder", "setBorder" ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCPrinterListPanel.class, "getLocale", "setLocale" ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCPrinterListPanel.class, "getInsets", null ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCPrinterListPanel.class, "getUIClassID", null ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCPrinterListPanel.class, "getGraphics", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCPrinterListPanel.class, "isMinimumSizeSet", null ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCPrinterListPanel.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCPrinterListPanel.class, "isMaximumSizeSet", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCPrinterListPanel.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCPrinterListPanel.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCPrinterListPanel.class, "getLocationOnScreen", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCPrinterListPanel.class, "getCursor", "setCursor" ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCPrinterListPanel.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCPrinterListPanel.class, "isPreferredSizeSet", null ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCPrinterListPanel.class, "getVisibleRect", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCPrinterListPanel.class, "getBounds", "setBounds" ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCPrinterListPanel.class, "getInputContext", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCPrinterListPanel.class, "getClass", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCPrinterListPanel.class, "isFocusTraversable", null ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCPrinterListPanel.class, "getFont", "setFont" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCPrinterListPanel.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCPrinterListPanel.class, "isLightweight", null ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCPrinterListPanel.class, "isPaintingTile", null ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCPrinterListPanel.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCPrinterListPanel.class, "getLayout", "setLayout" ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCPrinterListPanel.class, "getTreeLock", null ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCPrinterListPanel.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCPrinterListPanel.class, "getForeground", "setForeground" ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCPrinterListPanel.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCPrinterListPanel.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCPrinterListPanel.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCPrinterListPanel.class, "isShowing", null ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCPrinterListPanel.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCPrinterListPanel.class, "getParent", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCPrinterListPanel.class, "getPeer", null ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCPrinterListPanel.class, "getComponentCount", null ); + properties[PROPERTY_manager] = new PropertyDescriptor ( "manager", QCPrinterListPanel.class, null, "setManager" ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCPrinterListPanel.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCPrinterListPanel.class, "getHeight", null ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCPrinterListPanel.class, "isValid", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCPrinterListPanel.class, "isFocusCycleRoot", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCPrinterListPanel.class, "getWidth", null ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCPrinterListPanel.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCPrinterListPanel.class, "getBackground", "setBackground" ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCPrinterListPanel.class, "isValidateRoot", null ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCPrinterListPanel.class, "getTopLevelAncestor", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCPrinterListPanel.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCPrinterListPanel.class, "getRootPane", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCPrinterListPanel.class, "getName", "setName" ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCPrinterListPanel.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_ancestorListener = 1; + private static final int EVENT_inputMethodListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_propertyChangeListener = 7; + private static final int EVENT_keyListener = 8; + private static final int EVENT_hierarchyListener = 9; + private static final int EVENT_containerListener = 10; + private static final int EVENT_vetoableChangeListener = 11; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[12]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCPrinterListPanel.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCPrinterListPanel.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCPrinterListPanel.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCPrinterListPanel.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCPrinterListPanel.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCPrinterListPanel.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCPrinterListPanel.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCPrinterListPanel.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCPrinterListPanel.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCPrinterListPanel.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCPrinterListPanel.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCPrinterListPanel.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLQueryBuilderPanel.form b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLQueryBuilderPanel.form new file mode 100644 index 000000000..d1e2c3e9f --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLQueryBuilderPanel.form @@ -0,0 +1,187 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLQueryBuilderPanel.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLQueryBuilderPanel.java new file mode 100644 index 000000000..0337ba84c --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLQueryBuilderPanel.java @@ -0,0 +1,344 @@ +/* + * QCSQLQueryBuilderPanel.java + * + * Created on July 19, 2000, 6:46 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** A panel to display an SQLQueryBuilder. + * @author jax + * @version 1.0 + */ +public class QCSQLQueryBuilderPanel extends javax.swing.JPanel { + + private com.ibm.as400.vaccess.SQLConnection sqlConnection; + private com.ibm.as400.vaccess.ErrorDialogAdapter errorDialogAdapter; + private boolean useCustomDriver = false; + private QCSQLResultSetTablePanel resultTable; + private QCSQLResultSetFormPanel resultForm; + private java.util.Vector classesInstanced = new java.util.Vector(4,4); + + private javax.swing.ButtonGroup buttonGroup; + + /** Creates new form QCSQLQueryBuilderPanel */ + public QCSQLQueryBuilderPanel() { + initComponents (); + establishButtonGroup(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the FormEditor. + */ + private void initComponents () {//GEN-BEGIN:initComponents + sessionPanel = new javax.swing.JPanel (); + urlPanel = new javax.swing.JPanel (); + urlTextField = new javax.swing.JTextField (); + connectButton = new javax.swing.JButton (); + driverTypePanel = new javax.swing.JPanel (); + as400RadioButton = new javax.swing.JRadioButton (); + sunJDBCRadioButton4 = new javax.swing.JRadioButton (); + postgresqlRadioButton = new javax.swing.JRadioButton (); + customRadioButton = new javax.swing.JRadioButton (); + driverClassNameTextField = new javax.swing.JTextField (); + sQLQueryBuilderPane1 = new com.ibm.as400.vaccess.SQLQueryBuilderPane (); + queryButtonPanel = new javax.swing.JPanel (); + queryToTableButton = new javax.swing.JButton (); + queryToFormButton = new javax.swing.JButton (); + setLayout (new java.awt.BorderLayout ()); + + sessionPanel.setLayout (new java.awt.GridLayout (2, 1)); + + urlPanel.setLayout (new java.awt.GridLayout (2, 1)); + + urlTextField.setToolTipText ("Enter a valid SQLConnection URL of the form jdbc:://"); + urlTextField.setText ("jdbc:"); + + urlPanel.add (urlTextField); + + connectButton.setToolTipText ("Connects to the JDBC URL you entered above."); + connectButton.setText ("Connect Now"); + connectButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + connectButtonActionPerformed (evt); + } + } + ); + + urlPanel.add (connectButton); + + sessionPanel.add (urlPanel); + + driverTypePanel.setLayout (new java.awt.GridLayout (1, 5)); + driverTypePanel.setBorder (new javax.swing.border.TitledBorder("Set driver type in URL")); + + as400RadioButton.setToolTipText ("Edits the URL above to reflect your driver choice. Feel free to customize the URL afterwards."); + as400RadioButton.setBorder (new javax.swing.border.TitledBorder("")); + as400RadioButton.setText ("JTOpen"); + as400RadioButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + as400RadioButtonActionPerformed (evt); + } + } + ); + + driverTypePanel.add (as400RadioButton); + + sunJDBCRadioButton4.setToolTipText ("Edits the URL above to reflect your driver choice. Feel free to customize the URL afterwards."); + sunJDBCRadioButton4.setText ("Sun JDBC"); + sunJDBCRadioButton4.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + sunJDBCRadioButton4ActionPerformed (evt); + } + } + ); + + driverTypePanel.add (sunJDBCRadioButton4); + + postgresqlRadioButton.setToolTipText ("Edits the URL above to reflect your driver choice. Feel free to customize the URL afterwards."); + postgresqlRadioButton.setText ("PostgreSQL"); + postgresqlRadioButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + postgresqlRadioButtonActionPerformed (evt); + } + } + ); + + driverTypePanel.add (postgresqlRadioButton); + + customRadioButton.setToolTipText ("Please enter driver name in the entry field next to the button."); + customRadioButton.setText ("Custom"); + customRadioButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + customRadioButtonActionPerformed (evt); + } + } + ); + + driverTypePanel.add (customRadioButton); + + + driverTypePanel.add (driverClassNameTextField); + + sessionPanel.add (driverTypePanel); + + + add (sessionPanel, java.awt.BorderLayout.NORTH); + + + + add (sQLQueryBuilderPane1, java.awt.BorderLayout.CENTER); + + queryButtonPanel.setLayout (new java.awt.GridLayout (1, 2)); + + queryToTableButton.setToolTipText ("Shows the results of the query in table form on the SQL Result Table tab."); + queryToTableButton.setText ("Do Query with Results to Table"); + queryToTableButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + queryToTableButtonActionPerformed (evt); + } + } + ); + + queryButtonPanel.add (queryToTableButton); + + queryToFormButton.setToolTipText ("Shows the results of the query in table form on the SQL Result Form tab."); + queryToFormButton.setText ("Do Query with Results to Form"); + queryToFormButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + queryToFormButtonActionPerformed (evt); + } + } + ); + + queryButtonPanel.add (queryToFormButton); + + + add (queryButtonPanel, java.awt.BorderLayout.SOUTH); + + }//GEN-END:initComponents + + private void queryToFormButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_queryToFormButtonActionPerformed + // Add your handling code here: + if (null != sQLQueryBuilderPane1.getConnection() & null != sQLQueryBuilderPane1.getQuery()) { + resultForm.doQuery(sQLQueryBuilderPane1.getConnection(), sQLQueryBuilderPane1.getQuery()); + } + }//GEN-LAST:event_queryToFormButtonActionPerformed + + private void queryToTableButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_queryToTableButtonActionPerformed + // Add your handling code here: + if (null != sQLQueryBuilderPane1.getConnection() & null != sQLQueryBuilderPane1.getQuery()) { + resultTable.doQuery(sQLQueryBuilderPane1.getConnection(), sQLQueryBuilderPane1.getQuery()); + } + }//GEN-LAST:event_queryToTableButtonActionPerformed + + private void connectButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_connectButtonActionPerformed + // Add your handling code here: + + // Free resources by closing previous connection. + if (null != sQLQueryBuilderPane1.getConnection()) { + try { + sQLQueryBuilderPane1.getConnection().close(); + } + catch (java.sql.SQLException e) { + e.printStackTrace(System.err); + } + } + + // Process the URL. + QCJdbcURL url = new QCJdbcURL(urlTextField.getText()); + urlTextField.setText(url.getURL()); + + // Load the driver if necessary. + try { + instanceDriver(url.driver); + } + catch (java.lang.ClassNotFoundException e) { + e.printStackTrace(System.err); + } + catch (java.sql.SQLException e) { + e.printStackTrace(System.err); + } + + // Attempt the connection. + sqlConnection = new com.ibm.as400.vaccess.SQLConnection(urlTextField.getText()); + try { + sQLQueryBuilderPane1.setConnection(sqlConnection); + sQLQueryBuilderPane1.load(); + } + + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(System.err); + } + }//GEN-LAST:event_connectButtonActionPerformed + + private void sunJDBCRadioButton4ActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sunJDBCRadioButton4ActionPerformed + // Add your handling code here: + useCustomDriver = false; + QCJdbcURL url = new QCJdbcURL(urlTextField.getText()); + url.protocol = "jdbc"; + url.driver = "odbc"; + urlTextField.setText(url.getURL()); + }//GEN-LAST:event_sunJDBCRadioButton4ActionPerformed + + private void postgresqlRadioButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_postgresqlRadioButtonActionPerformed + // Add your handling code here: + useCustomDriver = false; + QCJdbcURL url = new QCJdbcURL(urlTextField.getText()); + url.protocol = "jdbc"; + url.driver = "postgresql"; + urlTextField.setText(url.getURL()); + }//GEN-LAST:event_postgresqlRadioButtonActionPerformed + + private void as400RadioButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_as400RadioButtonActionPerformed + // Add your handling code here: + useCustomDriver = false; + QCJdbcURL url = new QCJdbcURL(urlTextField.getText()); + url.protocol = "jdbc"; + url.driver = "as400"; + urlTextField.setText(url.getURL()); + }//GEN-LAST:event_as400RadioButtonActionPerformed + + private void customRadioButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_customRadioButtonActionPerformed + // Add your handling code here: + useCustomDriver = true; + QCJdbcURL url = new QCJdbcURL(urlTextField.getText()); + url.protocol = "jdbc"; + url.driver = "PLEASE_EDIT_THIS_DRIVER_URL"; + urlTextField.setText(url.getURL()); + }//GEN-LAST:event_customRadioButtonActionPerformed + + // Make sure that drivers get loaded. + private void instanceDriver(String urlDriver) + throws java.sql.SQLException, java.lang.ClassNotFoundException { + + java.lang.Class driverClass; + + if (useCustomDriver) { // Assumes static ctor, + // modify if you have to explicitly registerDriver() + driverClass = Class.forName(driverClassNameTextField.getText()); + if (!classesInstanced.contains(driverClass)) { + classesInstanced.add(driverClass); + } + } + + else if (urlDriver.equals("as400")) { + driverClass = Class.forName("com.ibm.as400.access.AS400JDBCDriver"); + if (!classesInstanced.contains(driverClass)) { + java.sql.DriverManager.registerDriver (new com.ibm.as400.access.AS400JDBCDriver()); + classesInstanced.add(driverClass); + } + } + + else if (urlDriver.equals("jdbc")) { + driverClass = Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); + if (!classesInstanced.contains(driverClass)) { + classesInstanced.add(driverClass); + } + } + + else if (urlDriver.equals("postgresql")) { + driverClass = Class.forName("postgresql.Driver"); + if (!classesInstanced.contains(driverClass)) { + classesInstanced.add(driverClass); + } + } + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JPanel sessionPanel; + private javax.swing.JPanel urlPanel; + private javax.swing.JTextField urlTextField; + private javax.swing.JButton connectButton; + private javax.swing.JPanel driverTypePanel; + private javax.swing.JRadioButton as400RadioButton; + private javax.swing.JRadioButton sunJDBCRadioButton4; + private javax.swing.JRadioButton postgresqlRadioButton; + private javax.swing.JRadioButton customRadioButton; + private javax.swing.JTextField driverClassNameTextField; + private com.ibm.as400.vaccess.SQLQueryBuilderPane sQLQueryBuilderPane1; + private javax.swing.JPanel queryButtonPanel; + private javax.swing.JButton queryToTableButton; + private javax.swing.JButton queryToFormButton; + // End of variables declaration//GEN-END:variables + + private void establishButtonGroup() { + buttonGroup = new javax.swing.ButtonGroup(); + buttonGroup.add(as400RadioButton); + buttonGroup.add(sunJDBCRadioButton4); + buttonGroup.add(postgresqlRadioButton); + buttonGroup.add(customRadioButton); + } + + /** Set the SQLResultSetTable in which the query will be executed + * and results displayed when user presses the appropriate button. + * @param tp A QCSQLResultsSetTablePane. + */ + public void setResultTable(QCSQLResultSetTablePanel tp) { + resultTable = tp; + } + + /** Set the SQLResultSetForm in which the query will be executed + * and results displayed when user presses the appropriate button. + * @param fp A QCSQLResultSetForm + */ + public void setResultForm(QCSQLResultSetFormPanel fp) { + resultForm = fp; + } + + /** Connects the ErrorDialogAdapter with any as400.vaccess components present. + * @param eda An instance of an ErrorDialogAdapter already associated + * with a suitable Frame. + */ + public void propagateEDA(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + errorDialogAdapter=eda; + sQLQueryBuilderPane1.addErrorListener(eda); + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLQueryBuilderPanelBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLQueryBuilderPanelBeanInfo.java new file mode 100644 index 000000000..4db1aa6b5 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLQueryBuilderPanelBeanInfo.java @@ -0,0 +1,313 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCSQLQueryBuilderPanelBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_optimizedDrawingEnabled = 0; + private static final int PROPERTY_colorModel = 1; + private static final int PROPERTY_minimumSize = 2; + private static final int PROPERTY_visible = 3; + private static final int PROPERTY_toolkit = 4; + private static final int PROPERTY_displayable = 5; + private static final int PROPERTY_opaque = 6; + private static final int PROPERTY_requestFocusEnabled = 7; + private static final int PROPERTY_enabled = 8; + private static final int PROPERTY_autoscrolls = 9; + private static final int PROPERTY_y = 10; + private static final int PROPERTY_x = 11; + private static final int PROPERTY_accessibleContext = 12; + private static final int PROPERTY_componentOrientation = 13; + private static final int PROPERTY_components = 14; + private static final int PROPERTY_managingFocus = 15; + private static final int PROPERTY_inputMethodRequests = 16; + private static final int PROPERTY_border = 17; + private static final int PROPERTY_locale = 18; + private static final int PROPERTY_insets = 19; + private static final int PROPERTY_UIClassID = 20; + private static final int PROPERTY_graphics = 21; + private static final int PROPERTY_minimumSizeSet = 22; + private static final int PROPERTY_actionMap = 23; + private static final int PROPERTY_maximumSizeSet = 24; + private static final int PROPERTY_alignmentY = 25; + private static final int PROPERTY_alignmentX = 26; + private static final int PROPERTY_locationOnScreen = 27; + private static final int PROPERTY_cursor = 28; + private static final int PROPERTY_registeredKeyStrokes = 29; + private static final int PROPERTY_preferredSizeSet = 30; + private static final int PROPERTY_visibleRect = 31; + private static final int PROPERTY_bounds = 32; + private static final int PROPERTY_inputContext = 33; + private static final int PROPERTY_class = 34; + private static final int PROPERTY_focusTraversable = 35; + private static final int PROPERTY_font = 36; + private static final int PROPERTY_inputVerifier = 37; + private static final int PROPERTY_lightweight = 38; + private static final int PROPERTY_paintingTile = 39; + private static final int PROPERTY_maximumSize = 40; + private static final int PROPERTY_layout = 41; + private static final int PROPERTY_treeLock = 42; + private static final int PROPERTY_verifyInputWhenFocusTarget = 43; + private static final int PROPERTY_foreground = 44; + private static final int PROPERTY_preferredSize = 45; + private static final int PROPERTY_debugGraphicsOptions = 46; + private static final int PROPERTY_doubleBuffered = 47; + private static final int PROPERTY_showing = 48; + private static final int PROPERTY_nextFocusableComponent = 49; + private static final int PROPERTY_parent = 50; + private static final int PROPERTY_peer = 51; + private static final int PROPERTY_componentCount = 52; + private static final int PROPERTY_graphicsConfiguration = 53; + private static final int PROPERTY_height = 54; + private static final int PROPERTY_valid = 55; + private static final int PROPERTY_focusCycleRoot = 56; + private static final int PROPERTY_width = 57; + private static final int PROPERTY_toolTipText = 58; + private static final int PROPERTY_background = 59; + private static final int PROPERTY_validateRoot = 60; + private static final int PROPERTY_topLevelAncestor = 61; + private static final int PROPERTY_dropTarget = 62; + private static final int PROPERTY_rootPane = 63; + private static final int PROPERTY_name = 64; + private static final int PROPERTY_component = 65; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[66]; + + static { + try { + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCSQLQueryBuilderPanel.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCSQLQueryBuilderPanel.class, "getColorModel", null ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCSQLQueryBuilderPanel.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCSQLQueryBuilderPanel.class, "isVisible", "setVisible" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCSQLQueryBuilderPanel.class, "getToolkit", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCSQLQueryBuilderPanel.class, "isDisplayable", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCSQLQueryBuilderPanel.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCSQLQueryBuilderPanel.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCSQLQueryBuilderPanel.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCSQLQueryBuilderPanel.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCSQLQueryBuilderPanel.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCSQLQueryBuilderPanel.class, "getX", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCSQLQueryBuilderPanel.class, "getAccessibleContext", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCSQLQueryBuilderPanel.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCSQLQueryBuilderPanel.class, "getComponents", null ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCSQLQueryBuilderPanel.class, "isManagingFocus", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCSQLQueryBuilderPanel.class, "getInputMethodRequests", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCSQLQueryBuilderPanel.class, "getBorder", "setBorder" ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCSQLQueryBuilderPanel.class, "getLocale", "setLocale" ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCSQLQueryBuilderPanel.class, "getInsets", null ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCSQLQueryBuilderPanel.class, "getUIClassID", null ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCSQLQueryBuilderPanel.class, "getGraphics", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCSQLQueryBuilderPanel.class, "isMinimumSizeSet", null ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCSQLQueryBuilderPanel.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCSQLQueryBuilderPanel.class, "isMaximumSizeSet", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCSQLQueryBuilderPanel.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCSQLQueryBuilderPanel.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCSQLQueryBuilderPanel.class, "getLocationOnScreen", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCSQLQueryBuilderPanel.class, "getCursor", "setCursor" ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCSQLQueryBuilderPanel.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCSQLQueryBuilderPanel.class, "isPreferredSizeSet", null ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCSQLQueryBuilderPanel.class, "getVisibleRect", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCSQLQueryBuilderPanel.class, "getBounds", "setBounds" ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCSQLQueryBuilderPanel.class, "getInputContext", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCSQLQueryBuilderPanel.class, "getClass", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCSQLQueryBuilderPanel.class, "isFocusTraversable", null ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCSQLQueryBuilderPanel.class, "getFont", "setFont" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCSQLQueryBuilderPanel.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCSQLQueryBuilderPanel.class, "isLightweight", null ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCSQLQueryBuilderPanel.class, "isPaintingTile", null ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCSQLQueryBuilderPanel.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCSQLQueryBuilderPanel.class, "getLayout", "setLayout" ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCSQLQueryBuilderPanel.class, "getTreeLock", null ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCSQLQueryBuilderPanel.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCSQLQueryBuilderPanel.class, "getForeground", "setForeground" ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCSQLQueryBuilderPanel.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCSQLQueryBuilderPanel.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCSQLQueryBuilderPanel.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCSQLQueryBuilderPanel.class, "isShowing", null ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCSQLQueryBuilderPanel.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCSQLQueryBuilderPanel.class, "getParent", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCSQLQueryBuilderPanel.class, "getPeer", null ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCSQLQueryBuilderPanel.class, "getComponentCount", null ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCSQLQueryBuilderPanel.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCSQLQueryBuilderPanel.class, "getHeight", null ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCSQLQueryBuilderPanel.class, "isValid", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCSQLQueryBuilderPanel.class, "isFocusCycleRoot", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCSQLQueryBuilderPanel.class, "getWidth", null ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCSQLQueryBuilderPanel.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCSQLQueryBuilderPanel.class, "getBackground", "setBackground" ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCSQLQueryBuilderPanel.class, "isValidateRoot", null ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCSQLQueryBuilderPanel.class, "getTopLevelAncestor", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCSQLQueryBuilderPanel.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCSQLQueryBuilderPanel.class, "getRootPane", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCSQLQueryBuilderPanel.class, "getName", "setName" ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCSQLQueryBuilderPanel.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_ancestorListener = 1; + private static final int EVENT_inputMethodListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_propertyChangeListener = 7; + private static final int EVENT_keyListener = 8; + private static final int EVENT_hierarchyListener = 9; + private static final int EVENT_containerListener = 10; + private static final int EVENT_vetoableChangeListener = 11; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[12]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCSQLQueryBuilderPanel.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCSQLQueryBuilderPanel.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCSQLQueryBuilderPanel.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCSQLQueryBuilderPanel.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCSQLQueryBuilderPanel.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCSQLQueryBuilderPanel.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCSQLQueryBuilderPanel.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCSQLQueryBuilderPanel.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCSQLQueryBuilderPanel.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCSQLQueryBuilderPanel.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCSQLQueryBuilderPanel.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCSQLQueryBuilderPanel.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetFormPanel.form b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetFormPanel.form new file mode 100644 index 000000000..adb2b2509 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetFormPanel.form @@ -0,0 +1,31 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetFormPanel.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetFormPanel.java new file mode 100644 index 000000000..62a05881e --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetFormPanel.java @@ -0,0 +1,78 @@ +/* + * QCSQLResultSetFormPanel.java + * + * Created on July 21, 2000, 2:33 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** Shows result sets from the QCSQLQueryBuilderPanel + * @author jax + * @version 1.0 + */ +public class QCSQLResultSetFormPanel extends javax.swing.JPanel { + + private com.ibm.as400.vaccess.ErrorDialogAdapter errorDialogAdapter; + + /** Creates new form QCSQLResultSetFormPanel */ + public QCSQLResultSetFormPanel() { + initComponents (); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the FormEditor. + */ + private void initComponents () {//GEN-BEGIN:initComponents + sQLResultSetFormPane1 = new com.ibm.as400.vaccess.SQLResultSetFormPane (); + jLabel1 = new javax.swing.JLabel (); + setLayout (new java.awt.BorderLayout ()); + + + + add (sQLResultSetFormPane1, java.awt.BorderLayout.CENTER); + + jLabel1.setText ("Results of a query in the SQL Query Builder which are only valid if that connection is still active."); + jLabel1.setHorizontalAlignment (javax.swing.SwingConstants.CENTER); + + + add (jLabel1, java.awt.BorderLayout.NORTH); + + }//GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private com.ibm.as400.vaccess.SQLResultSetFormPane sQLResultSetFormPane1; + private javax.swing.JLabel jLabel1; + // End of variables declaration//GEN-END:variables + + /** Runs the query passed to this instance by the QCSQLQueryBuilder. + * @param connection A valid SQLConnection + * @param query A valid SQLQuery + */ + public void doQuery(com.ibm.as400.vaccess.SQLConnection connection,String query) { + try { + sQLResultSetFormPane1.setConnection(connection); + sQLResultSetFormPane1.setQuery(query); + sQLResultSetFormPane1.load(); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(System.err); + } + } + + /** Connects the ErrorDialogAdapter with any as400.vaccess components present. + * @param eda An instance of an ErrorDialogAdapter already associated + * with a suitable Frame. + */ + public void propagateEDA(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + errorDialogAdapter=eda; + sQLResultSetFormPane1.addErrorListener(eda); + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetFormPanelBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetFormPanelBeanInfo.java new file mode 100644 index 000000000..42fd92a3e --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetFormPanelBeanInfo.java @@ -0,0 +1,313 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCSQLResultSetFormPanelBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_optimizedDrawingEnabled = 0; + private static final int PROPERTY_colorModel = 1; + private static final int PROPERTY_minimumSize = 2; + private static final int PROPERTY_visible = 3; + private static final int PROPERTY_toolkit = 4; + private static final int PROPERTY_displayable = 5; + private static final int PROPERTY_opaque = 6; + private static final int PROPERTY_requestFocusEnabled = 7; + private static final int PROPERTY_enabled = 8; + private static final int PROPERTY_autoscrolls = 9; + private static final int PROPERTY_y = 10; + private static final int PROPERTY_x = 11; + private static final int PROPERTY_accessibleContext = 12; + private static final int PROPERTY_componentOrientation = 13; + private static final int PROPERTY_components = 14; + private static final int PROPERTY_managingFocus = 15; + private static final int PROPERTY_inputMethodRequests = 16; + private static final int PROPERTY_border = 17; + private static final int PROPERTY_locale = 18; + private static final int PROPERTY_insets = 19; + private static final int PROPERTY_UIClassID = 20; + private static final int PROPERTY_graphics = 21; + private static final int PROPERTY_minimumSizeSet = 22; + private static final int PROPERTY_actionMap = 23; + private static final int PROPERTY_maximumSizeSet = 24; + private static final int PROPERTY_alignmentY = 25; + private static final int PROPERTY_alignmentX = 26; + private static final int PROPERTY_locationOnScreen = 27; + private static final int PROPERTY_cursor = 28; + private static final int PROPERTY_registeredKeyStrokes = 29; + private static final int PROPERTY_preferredSizeSet = 30; + private static final int PROPERTY_visibleRect = 31; + private static final int PROPERTY_bounds = 32; + private static final int PROPERTY_inputContext = 33; + private static final int PROPERTY_class = 34; + private static final int PROPERTY_focusTraversable = 35; + private static final int PROPERTY_font = 36; + private static final int PROPERTY_inputVerifier = 37; + private static final int PROPERTY_lightweight = 38; + private static final int PROPERTY_paintingTile = 39; + private static final int PROPERTY_maximumSize = 40; + private static final int PROPERTY_layout = 41; + private static final int PROPERTY_treeLock = 42; + private static final int PROPERTY_verifyInputWhenFocusTarget = 43; + private static final int PROPERTY_foreground = 44; + private static final int PROPERTY_preferredSize = 45; + private static final int PROPERTY_debugGraphicsOptions = 46; + private static final int PROPERTY_doubleBuffered = 47; + private static final int PROPERTY_showing = 48; + private static final int PROPERTY_nextFocusableComponent = 49; + private static final int PROPERTY_parent = 50; + private static final int PROPERTY_peer = 51; + private static final int PROPERTY_componentCount = 52; + private static final int PROPERTY_graphicsConfiguration = 53; + private static final int PROPERTY_height = 54; + private static final int PROPERTY_valid = 55; + private static final int PROPERTY_focusCycleRoot = 56; + private static final int PROPERTY_width = 57; + private static final int PROPERTY_toolTipText = 58; + private static final int PROPERTY_background = 59; + private static final int PROPERTY_validateRoot = 60; + private static final int PROPERTY_topLevelAncestor = 61; + private static final int PROPERTY_dropTarget = 62; + private static final int PROPERTY_rootPane = 63; + private static final int PROPERTY_name = 64; + private static final int PROPERTY_component = 65; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[66]; + + static { + try { + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCSQLResultSetFormPanel.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCSQLResultSetFormPanel.class, "getColorModel", null ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCSQLResultSetFormPanel.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCSQLResultSetFormPanel.class, "isVisible", "setVisible" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCSQLResultSetFormPanel.class, "getToolkit", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCSQLResultSetFormPanel.class, "isDisplayable", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCSQLResultSetFormPanel.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCSQLResultSetFormPanel.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCSQLResultSetFormPanel.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCSQLResultSetFormPanel.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCSQLResultSetFormPanel.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCSQLResultSetFormPanel.class, "getX", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCSQLResultSetFormPanel.class, "getAccessibleContext", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCSQLResultSetFormPanel.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCSQLResultSetFormPanel.class, "getComponents", null ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCSQLResultSetFormPanel.class, "isManagingFocus", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCSQLResultSetFormPanel.class, "getInputMethodRequests", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCSQLResultSetFormPanel.class, "getBorder", "setBorder" ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCSQLResultSetFormPanel.class, "getLocale", "setLocale" ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCSQLResultSetFormPanel.class, "getInsets", null ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCSQLResultSetFormPanel.class, "getUIClassID", null ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCSQLResultSetFormPanel.class, "getGraphics", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCSQLResultSetFormPanel.class, "isMinimumSizeSet", null ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCSQLResultSetFormPanel.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCSQLResultSetFormPanel.class, "isMaximumSizeSet", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCSQLResultSetFormPanel.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCSQLResultSetFormPanel.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCSQLResultSetFormPanel.class, "getLocationOnScreen", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCSQLResultSetFormPanel.class, "getCursor", "setCursor" ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCSQLResultSetFormPanel.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCSQLResultSetFormPanel.class, "isPreferredSizeSet", null ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCSQLResultSetFormPanel.class, "getVisibleRect", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCSQLResultSetFormPanel.class, "getBounds", "setBounds" ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCSQLResultSetFormPanel.class, "getInputContext", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCSQLResultSetFormPanel.class, "getClass", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCSQLResultSetFormPanel.class, "isFocusTraversable", null ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCSQLResultSetFormPanel.class, "getFont", "setFont" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCSQLResultSetFormPanel.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCSQLResultSetFormPanel.class, "isLightweight", null ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCSQLResultSetFormPanel.class, "isPaintingTile", null ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCSQLResultSetFormPanel.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCSQLResultSetFormPanel.class, "getLayout", "setLayout" ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCSQLResultSetFormPanel.class, "getTreeLock", null ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCSQLResultSetFormPanel.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCSQLResultSetFormPanel.class, "getForeground", "setForeground" ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCSQLResultSetFormPanel.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCSQLResultSetFormPanel.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCSQLResultSetFormPanel.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCSQLResultSetFormPanel.class, "isShowing", null ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCSQLResultSetFormPanel.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCSQLResultSetFormPanel.class, "getParent", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCSQLResultSetFormPanel.class, "getPeer", null ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCSQLResultSetFormPanel.class, "getComponentCount", null ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCSQLResultSetFormPanel.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCSQLResultSetFormPanel.class, "getHeight", null ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCSQLResultSetFormPanel.class, "isValid", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCSQLResultSetFormPanel.class, "isFocusCycleRoot", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCSQLResultSetFormPanel.class, "getWidth", null ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCSQLResultSetFormPanel.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCSQLResultSetFormPanel.class, "getBackground", "setBackground" ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCSQLResultSetFormPanel.class, "isValidateRoot", null ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCSQLResultSetFormPanel.class, "getTopLevelAncestor", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCSQLResultSetFormPanel.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCSQLResultSetFormPanel.class, "getRootPane", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCSQLResultSetFormPanel.class, "getName", "setName" ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCSQLResultSetFormPanel.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_ancestorListener = 1; + private static final int EVENT_inputMethodListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_propertyChangeListener = 7; + private static final int EVENT_keyListener = 8; + private static final int EVENT_hierarchyListener = 9; + private static final int EVENT_containerListener = 10; + private static final int EVENT_vetoableChangeListener = 11; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[12]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCSQLResultSetFormPanel.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCSQLResultSetFormPanel.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCSQLResultSetFormPanel.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCSQLResultSetFormPanel.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCSQLResultSetFormPanel.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCSQLResultSetFormPanel.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCSQLResultSetFormPanel.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCSQLResultSetFormPanel.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCSQLResultSetFormPanel.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCSQLResultSetFormPanel.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCSQLResultSetFormPanel.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCSQLResultSetFormPanel.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetTablePanel.form b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetTablePanel.form new file mode 100644 index 000000000..c5ec300f4 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetTablePanel.form @@ -0,0 +1,31 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetTablePanel.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetTablePanel.java new file mode 100644 index 000000000..37d85f714 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetTablePanel.java @@ -0,0 +1,78 @@ +/* + * QCSQLResultSetTablePanel.java + * + * Created on July 21, 2000, 2:33 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** Shows result sets from the QCSQLQueryBuilderPanel + * @author jax + * @version 1.0 + */ +public class QCSQLResultSetTablePanel extends javax.swing.JPanel { + + private com.ibm.as400.vaccess.ErrorDialogAdapter errorDialogAdapter; + + /** Creates new form QCSQLResultSetTablePanel */ + public QCSQLResultSetTablePanel() { + initComponents (); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the FormEditor. + */ + private void initComponents () {//GEN-BEGIN:initComponents + sQLResultSetTablePane1 = new com.ibm.as400.vaccess.SQLResultSetTablePane (); + jLabel1 = new javax.swing.JLabel (); + setLayout (new java.awt.BorderLayout ()); + + + + add (sQLResultSetTablePane1, java.awt.BorderLayout.CENTER); + + jLabel1.setText ("Results of a query in the SQL Query Builder which are only valid if that connection is still active."); + jLabel1.setHorizontalAlignment (javax.swing.SwingConstants.CENTER); + + + add (jLabel1, java.awt.BorderLayout.NORTH); + + }//GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private com.ibm.as400.vaccess.SQLResultSetTablePane sQLResultSetTablePane1; + private javax.swing.JLabel jLabel1; + // End of variables declaration//GEN-END:variables + + /** Runs the query passed to this instance by the QCSQLQueryBuilder. + * @param connection A valid SQLConnection + * @param query A valid SQLQuery + */ + public void doQuery (com.ibm.as400.vaccess.SQLConnection connection, String query) { + try { + sQLResultSetTablePane1.setConnection(connection); + sQLResultSetTablePane1.setQuery(query); + sQLResultSetTablePane1.load(); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(System.err); + } + } + + /** Connects the ErrorDialogAdapter with any as400.vaccess components present. + * @param eda An instance of an ErrorDialogAdapter already associated + * with a suitable Frame. + */ + public void propagateEDA(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + errorDialogAdapter=eda; + sQLResultSetTablePane1.addErrorListener(eda); + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetTablePanelBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetTablePanelBeanInfo.java new file mode 100644 index 000000000..36c8cbe6c --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSQLResultSetTablePanelBeanInfo.java @@ -0,0 +1,313 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCSQLResultSetTablePanelBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_optimizedDrawingEnabled = 0; + private static final int PROPERTY_colorModel = 1; + private static final int PROPERTY_minimumSize = 2; + private static final int PROPERTY_visible = 3; + private static final int PROPERTY_toolkit = 4; + private static final int PROPERTY_displayable = 5; + private static final int PROPERTY_opaque = 6; + private static final int PROPERTY_requestFocusEnabled = 7; + private static final int PROPERTY_enabled = 8; + private static final int PROPERTY_autoscrolls = 9; + private static final int PROPERTY_y = 10; + private static final int PROPERTY_x = 11; + private static final int PROPERTY_accessibleContext = 12; + private static final int PROPERTY_componentOrientation = 13; + private static final int PROPERTY_components = 14; + private static final int PROPERTY_managingFocus = 15; + private static final int PROPERTY_inputMethodRequests = 16; + private static final int PROPERTY_border = 17; + private static final int PROPERTY_locale = 18; + private static final int PROPERTY_insets = 19; + private static final int PROPERTY_UIClassID = 20; + private static final int PROPERTY_graphics = 21; + private static final int PROPERTY_minimumSizeSet = 22; + private static final int PROPERTY_actionMap = 23; + private static final int PROPERTY_maximumSizeSet = 24; + private static final int PROPERTY_alignmentY = 25; + private static final int PROPERTY_alignmentX = 26; + private static final int PROPERTY_locationOnScreen = 27; + private static final int PROPERTY_cursor = 28; + private static final int PROPERTY_registeredKeyStrokes = 29; + private static final int PROPERTY_preferredSizeSet = 30; + private static final int PROPERTY_visibleRect = 31; + private static final int PROPERTY_bounds = 32; + private static final int PROPERTY_inputContext = 33; + private static final int PROPERTY_class = 34; + private static final int PROPERTY_focusTraversable = 35; + private static final int PROPERTY_font = 36; + private static final int PROPERTY_inputVerifier = 37; + private static final int PROPERTY_lightweight = 38; + private static final int PROPERTY_paintingTile = 39; + private static final int PROPERTY_maximumSize = 40; + private static final int PROPERTY_layout = 41; + private static final int PROPERTY_treeLock = 42; + private static final int PROPERTY_verifyInputWhenFocusTarget = 43; + private static final int PROPERTY_foreground = 44; + private static final int PROPERTY_preferredSize = 45; + private static final int PROPERTY_debugGraphicsOptions = 46; + private static final int PROPERTY_doubleBuffered = 47; + private static final int PROPERTY_showing = 48; + private static final int PROPERTY_nextFocusableComponent = 49; + private static final int PROPERTY_parent = 50; + private static final int PROPERTY_peer = 51; + private static final int PROPERTY_componentCount = 52; + private static final int PROPERTY_graphicsConfiguration = 53; + private static final int PROPERTY_height = 54; + private static final int PROPERTY_valid = 55; + private static final int PROPERTY_focusCycleRoot = 56; + private static final int PROPERTY_width = 57; + private static final int PROPERTY_toolTipText = 58; + private static final int PROPERTY_background = 59; + private static final int PROPERTY_validateRoot = 60; + private static final int PROPERTY_topLevelAncestor = 61; + private static final int PROPERTY_dropTarget = 62; + private static final int PROPERTY_rootPane = 63; + private static final int PROPERTY_name = 64; + private static final int PROPERTY_component = 65; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[66]; + + static { + try { + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCSQLResultSetTablePanel.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCSQLResultSetTablePanel.class, "getColorModel", null ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCSQLResultSetTablePanel.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCSQLResultSetTablePanel.class, "isVisible", "setVisible" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCSQLResultSetTablePanel.class, "getToolkit", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCSQLResultSetTablePanel.class, "isDisplayable", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCSQLResultSetTablePanel.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCSQLResultSetTablePanel.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCSQLResultSetTablePanel.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCSQLResultSetTablePanel.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCSQLResultSetTablePanel.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCSQLResultSetTablePanel.class, "getX", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCSQLResultSetTablePanel.class, "getAccessibleContext", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCSQLResultSetTablePanel.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCSQLResultSetTablePanel.class, "getComponents", null ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCSQLResultSetTablePanel.class, "isManagingFocus", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCSQLResultSetTablePanel.class, "getInputMethodRequests", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCSQLResultSetTablePanel.class, "getBorder", "setBorder" ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCSQLResultSetTablePanel.class, "getLocale", "setLocale" ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCSQLResultSetTablePanel.class, "getInsets", null ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCSQLResultSetTablePanel.class, "getUIClassID", null ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCSQLResultSetTablePanel.class, "getGraphics", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCSQLResultSetTablePanel.class, "isMinimumSizeSet", null ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCSQLResultSetTablePanel.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCSQLResultSetTablePanel.class, "isMaximumSizeSet", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCSQLResultSetTablePanel.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCSQLResultSetTablePanel.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCSQLResultSetTablePanel.class, "getLocationOnScreen", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCSQLResultSetTablePanel.class, "getCursor", "setCursor" ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCSQLResultSetTablePanel.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCSQLResultSetTablePanel.class, "isPreferredSizeSet", null ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCSQLResultSetTablePanel.class, "getVisibleRect", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCSQLResultSetTablePanel.class, "getBounds", "setBounds" ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCSQLResultSetTablePanel.class, "getInputContext", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCSQLResultSetTablePanel.class, "getClass", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCSQLResultSetTablePanel.class, "isFocusTraversable", null ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCSQLResultSetTablePanel.class, "getFont", "setFont" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCSQLResultSetTablePanel.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCSQLResultSetTablePanel.class, "isLightweight", null ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCSQLResultSetTablePanel.class, "isPaintingTile", null ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCSQLResultSetTablePanel.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCSQLResultSetTablePanel.class, "getLayout", "setLayout" ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCSQLResultSetTablePanel.class, "getTreeLock", null ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCSQLResultSetTablePanel.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCSQLResultSetTablePanel.class, "getForeground", "setForeground" ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCSQLResultSetTablePanel.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCSQLResultSetTablePanel.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCSQLResultSetTablePanel.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCSQLResultSetTablePanel.class, "isShowing", null ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCSQLResultSetTablePanel.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCSQLResultSetTablePanel.class, "getParent", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCSQLResultSetTablePanel.class, "getPeer", null ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCSQLResultSetTablePanel.class, "getComponentCount", null ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCSQLResultSetTablePanel.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCSQLResultSetTablePanel.class, "getHeight", null ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCSQLResultSetTablePanel.class, "isValid", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCSQLResultSetTablePanel.class, "isFocusCycleRoot", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCSQLResultSetTablePanel.class, "getWidth", null ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCSQLResultSetTablePanel.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCSQLResultSetTablePanel.class, "getBackground", "setBackground" ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCSQLResultSetTablePanel.class, "isValidateRoot", null ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCSQLResultSetTablePanel.class, "getTopLevelAncestor", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCSQLResultSetTablePanel.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCSQLResultSetTablePanel.class, "getRootPane", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCSQLResultSetTablePanel.class, "getName", "setName" ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCSQLResultSetTablePanel.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_ancestorListener = 1; + private static final int EVENT_inputMethodListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_propertyChangeListener = 7; + private static final int EVENT_keyListener = 8; + private static final int EVENT_hierarchyListener = 9; + private static final int EVENT_containerListener = 10; + private static final int EVENT_vetoableChangeListener = 11; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[12]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCSQLResultSetTablePanel.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCSQLResultSetTablePanel.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCSQLResultSetTablePanel.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCSQLResultSetTablePanel.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCSQLResultSetTablePanel.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCSQLResultSetTablePanel.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCSQLResultSetTablePanel.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCSQLResultSetTablePanel.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCSQLResultSetTablePanel.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCSQLResultSetTablePanel.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCSQLResultSetTablePanel.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCSQLResultSetTablePanel.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCServiceClient.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCServiceClient.java new file mode 100644 index 000000000..2993b3b9e --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCServiceClient.java @@ -0,0 +1,27 @@ +/* + * QCServiceClient.java + * + * Created on July 12, 2000, 3:54 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** An interface representing application objects which request services from + * the QCMgr. + * @author jax + * @version 1.0 + */ +public interface QCServiceClient { + + /** Called by a QCMgr, this function indicates that a service record supplied + * earlier by the QCMGr to the QCServiceClient instance will no longer be valid + * after this call completes. + * @param sr The service record which the QCMgr is indicating will no longer be valid after the relinquish completes. + */ + public void relinquish(QCServiceRecord sr); +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCServiceHash.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCServiceHash.java new file mode 100644 index 000000000..c105bdf5a --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCServiceHash.java @@ -0,0 +1,113 @@ +/* + * QCServiceHash.java + * + * Created on July 12, 2000, 3:50 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.util.*; + +/** + * + * @author jax + * @version + */ +public class QCServiceHash extends Object { + + private Hashtable serviceSessions; + + /** Creates new QCServiceHash */ + public QCServiceHash() { + serviceSessions = new Hashtable(); + } + + /** Clear all keys + * @throws UnsupportedOperationException + */ + public void clear () throws UnsupportedOperationException { + serviceSessions.clear(); + } + + /** Map in an object + * @param key + * @param object + * @return + */ + public com.ibm.as400.access.AS400 put(QCServiceRecord key, com.ibm.as400.access.AS400 object) { + serviceSessions.put(key, object); + return object; + } + + /** Get a server by name + * @param key + * @return + */ + public com.ibm.as400.access.AS400 get(QCServiceRecord key) { + return (com.ibm.as400.access.AS400) serviceSessions.get(key); + } + + /** Remove a server by name + * @param key + * @return + */ + public com.ibm.as400.access.AS400 remove(QCServiceRecord key) { + return (com.ibm.as400.access.AS400) serviceSessions.remove(key); + } + + /** Contains the server named? + * @param key + * @return + */ + public boolean containsServiceRecord(QCServiceRecord key) { + return serviceSessions.containsKey(key); + } + + /** Contains reference to the identical unique AS400 object + * @param as400 + * @return + */ + public boolean containsServer(com.ibm.as400.access.AS400 as400) { + return serviceSessions.containsValue(as400); + } + + /** Are any clients left of system as400 using service service? + * @param as400 An AS400 system which might currently be connected. + * @param service One of the AS400 service constants. + * @return true if any client is still active on system as400 using service service. + */ + public boolean anyServiceClients(com.ibm.as400.access.AS400 as400,int service) { + return false; + } + /** Number of elements + * @return + */ + public int size () { + return serviceSessions.size(); + } + + /** All service records */ + public Enumeration keys () { + return serviceSessions.keys(); + } + + /** Enumeration of elements elements + * @return + */ + public Enumeration elements () { + return serviceSessions.elements(); + } + + /** Is empty? + * @return + */ + public boolean isEmpty () { + return serviceSessions.isEmpty(); + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCServiceRecord.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCServiceRecord.java new file mode 100644 index 000000000..80a2e89b7 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCServiceRecord.java @@ -0,0 +1,28 @@ +/* QCServiceRecord.java + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +public class QCServiceRecord { + public final String serverName; + public final int service; + public final com.ibm.as400.access.AS400 as400; + public final QCServiceClient client; + + QCServiceRecord (String svrName, + int svc, + com.ibm.as400.access.AS400 a400, + QCServiceClient cli + ) + { + serverName = svrName; + service = svc; + as400 = a400; + client = cli; + } + } diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSpooledFileViewerPanel.form b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSpooledFileViewerPanel.form new file mode 100644 index 000000000..b87a7a2b6 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSpooledFileViewerPanel.form @@ -0,0 +1,144 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSpooledFileViewerPanel.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSpooledFileViewerPanel.java new file mode 100644 index 000000000..712b6bd00 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSpooledFileViewerPanel.java @@ -0,0 +1,225 @@ +/* + * QCSpooledFileViewerPanel.java + * + * Created on July 18, 2000, 9:26 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** Panel to hold a spool file viewer pane. + * @author jax + * @version 1.0 + */ +public class QCSpooledFileViewerPanel extends javax.swing.JPanel implements QCServiceClient { + + private QCMgr manager; + private java.lang.String serverName; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCServiceRecord serviceRecord; + private com.ibm.as400.vaccess.ErrorDialogAdapter errorDialogAdapter; + + /** Creates new form QCSpooledFileViewerPanel */ + public QCSpooledFileViewerPanel() { + initComponents (); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the FormEditor. + */ + private void initComponents () {//GEN-BEGIN:initComponents + spooledFileViewer1 = new com.ibm.as400.vaccess.SpooledFileViewer (); + jPanel1 = new javax.swing.JPanel (); + systemTextField = new javax.swing.JTextField (); + nameTextField = new javax.swing.JTextField (); + numberTextField = new javax.swing.JTextField (); + systemLabel = new javax.swing.JLabel (); + nameLabel = new javax.swing.JLabel (); + numberLabel = new javax.swing.JLabel (); + jobNameTextField = new javax.swing.JTextField (); + jobUserTextField = new javax.swing.JTextField (); + jobNumberTextField = new javax.swing.JTextField (); + jobNameLabel = new javax.swing.JLabel (); + jobUserLabel = new javax.swing.JLabel (); + jobNumberLabel = new javax.swing.JLabel (); + getSpoolFileButton = new javax.swing.JButton (); + setLayout (new java.awt.BorderLayout ()); + + + + add (spooledFileViewer1, java.awt.BorderLayout.CENTER); + + jPanel1.setLayout (new java.awt.GridLayout (4, 3)); + + systemTextField.setToolTipText ("Enter the name of the system on which the spool file resides."); + + jPanel1.add (systemTextField); + + nameTextField.setToolTipText ("Enter the name of the spool file."); + + jPanel1.add (nameTextField); + + numberTextField.setToolTipText ("Enter the spool file number."); + + jPanel1.add (numberTextField); + + systemLabel.setText ("System"); + + jPanel1.add (systemLabel); + + nameLabel.setText ("Name"); + + jPanel1.add (nameLabel); + + numberLabel.setText ("Number"); + + jPanel1.add (numberLabel); + + jobNameTextField.setToolTipText ("Enter the name of the job which produced the spool file."); + + jPanel1.add (jobNameTextField); + + jobUserTextField.setToolTipText ("Enter the username of the account which produced the spool file."); + + jPanel1.add (jobUserTextField); + + jobNumberTextField.setToolTipText ("Enter the number of the job which created the spool file."); + + jPanel1.add (jobNumberTextField); + + jobNameLabel.setText ("Job Name"); + + jPanel1.add (jobNameLabel); + + jobUserLabel.setText ("Job User"); + + jPanel1.add (jobUserLabel); + + jobNumberLabel.setText ("Job Number"); + + jPanel1.add (jobNumberLabel); + + + add (jPanel1, java.awt.BorderLayout.NORTH); + + getSpoolFileButton.setToolTipText ("Fill in the fields at the top of the window, then press this button to view the spool file."); + getSpoolFileButton.setText ("View Spool File"); + getSpoolFileButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + getSpoolFileButtonActionPerformed (evt); + } + } + ); + + + add (getSpoolFileButton, java.awt.BorderLayout.SOUTH); + + }//GEN-END:initComponents + + private void getSpoolFileButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_getSpoolFileButtonActionPerformed + // Add your handling code here: + + // Loading the directory can take some time! + java.awt.Cursor currentCursor = jPanel1.getCursor(); + setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR)); + + reinstanceServerFromTextEntry(); // Get our AS400 object. + + // Set the spooled file viewer to the loaded spooled file. + com.ibm.as400.access.SpooledFile spooledFile = + new com.ibm.as400.access.SpooledFile + (serviceRecord.as400, nameTextField.getText(), new Integer(numberTextField.getText()).intValue(), + jobNameTextField.getText(), jobUserTextField.getText(), jobNumberTextField.getText()); + + try { + spooledFileViewer1.setSpooledFile(spooledFile); + spooledFileViewer1.load(); + } + + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + catch (java.io.IOException e) { + e.printStackTrace(); + } + + // The wait is over. + setCursor(currentCursor); + }//GEN-LAST:event_getSpoolFileButtonActionPerformed + + private synchronized void reinstanceServerFromTextEntry() { + String newName = systemTextField.getText(); + if (null == serverName) { + serverName = ""; + } + if (null != newName) { + if (!newName.equals("")) { + if (!newName.equals(serverName)) { + serverName = newName; + if (null != serviceRecord) { + + try { // let go of the service from manager + manager.freeService(serviceRecord); + } + catch (Exception e) { + e.printStackTrace(); + } + serviceRecord = null; + } + try { + serviceRecord = manager.getService("qcmgr:" + serverName + "/PRINT", this); + } + catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private com.ibm.as400.vaccess.SpooledFileViewer spooledFileViewer1; + private javax.swing.JPanel jPanel1; + private javax.swing.JTextField systemTextField; + private javax.swing.JTextField nameTextField; + private javax.swing.JTextField numberTextField; + private javax.swing.JLabel systemLabel; + private javax.swing.JLabel nameLabel; + private javax.swing.JLabel numberLabel; + private javax.swing.JTextField jobNameTextField; + private javax.swing.JTextField jobUserTextField; + private javax.swing.JTextField jobNumberTextField; + private javax.swing.JLabel jobNameLabel; + private javax.swing.JLabel jobUserLabel; + private javax.swing.JLabel jobNumberLabel; + private javax.swing.JButton getSpoolFileButton; + // End of variables declaration//GEN-END:variables + /** Sets the QCMgr object which will handle AS400 instances for this client. + * @param mgr A QCMgr object. + */ + public void setManager(QCMgr mgr) { + manager = mgr; + } + + /** Connects the ErrorDialogAdapter with any as400.vaccess components present. + * @param eda An instance of an ErrorDialogAdapter already associated + * with a suitable Frame. + */ + public void propagateEDA(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + errorDialogAdapter=eda; + spooledFileViewer1.addErrorListener(eda); + } + /** Required implementantion of the QCServiceClient interface. Releases the + * AS400 object provided by the server. + * @param sr The service record which represents the AS400 to be + * relinquished. + */ + public void relinquish(QCServiceRecord sr) { + serviceRecord = null; + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSpooledFileViewerPanelBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSpooledFileViewerPanelBeanInfo.java new file mode 100644 index 000000000..4c17f866c --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCSpooledFileViewerPanelBeanInfo.java @@ -0,0 +1,315 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCSpooledFileViewerPanelBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_optimizedDrawingEnabled = 0; + private static final int PROPERTY_colorModel = 1; + private static final int PROPERTY_minimumSize = 2; + private static final int PROPERTY_visible = 3; + private static final int PROPERTY_toolkit = 4; + private static final int PROPERTY_displayable = 5; + private static final int PROPERTY_opaque = 6; + private static final int PROPERTY_requestFocusEnabled = 7; + private static final int PROPERTY_enabled = 8; + private static final int PROPERTY_autoscrolls = 9; + private static final int PROPERTY_y = 10; + private static final int PROPERTY_x = 11; + private static final int PROPERTY_accessibleContext = 12; + private static final int PROPERTY_componentOrientation = 13; + private static final int PROPERTY_components = 14; + private static final int PROPERTY_managingFocus = 15; + private static final int PROPERTY_inputMethodRequests = 16; + private static final int PROPERTY_border = 17; + private static final int PROPERTY_locale = 18; + private static final int PROPERTY_insets = 19; + private static final int PROPERTY_UIClassID = 20; + private static final int PROPERTY_graphics = 21; + private static final int PROPERTY_minimumSizeSet = 22; + private static final int PROPERTY_actionMap = 23; + private static final int PROPERTY_maximumSizeSet = 24; + private static final int PROPERTY_alignmentY = 25; + private static final int PROPERTY_alignmentX = 26; + private static final int PROPERTY_locationOnScreen = 27; + private static final int PROPERTY_cursor = 28; + private static final int PROPERTY_registeredKeyStrokes = 29; + private static final int PROPERTY_preferredSizeSet = 30; + private static final int PROPERTY_visibleRect = 31; + private static final int PROPERTY_bounds = 32; + private static final int PROPERTY_inputContext = 33; + private static final int PROPERTY_class = 34; + private static final int PROPERTY_focusTraversable = 35; + private static final int PROPERTY_font = 36; + private static final int PROPERTY_inputVerifier = 37; + private static final int PROPERTY_lightweight = 38; + private static final int PROPERTY_paintingTile = 39; + private static final int PROPERTY_maximumSize = 40; + private static final int PROPERTY_layout = 41; + private static final int PROPERTY_treeLock = 42; + private static final int PROPERTY_verifyInputWhenFocusTarget = 43; + private static final int PROPERTY_foreground = 44; + private static final int PROPERTY_preferredSize = 45; + private static final int PROPERTY_debugGraphicsOptions = 46; + private static final int PROPERTY_doubleBuffered = 47; + private static final int PROPERTY_showing = 48; + private static final int PROPERTY_nextFocusableComponent = 49; + private static final int PROPERTY_parent = 50; + private static final int PROPERTY_peer = 51; + private static final int PROPERTY_componentCount = 52; + private static final int PROPERTY_manager = 53; + private static final int PROPERTY_graphicsConfiguration = 54; + private static final int PROPERTY_height = 55; + private static final int PROPERTY_valid = 56; + private static final int PROPERTY_focusCycleRoot = 57; + private static final int PROPERTY_width = 58; + private static final int PROPERTY_toolTipText = 59; + private static final int PROPERTY_background = 60; + private static final int PROPERTY_validateRoot = 61; + private static final int PROPERTY_topLevelAncestor = 62; + private static final int PROPERTY_dropTarget = 63; + private static final int PROPERTY_rootPane = 64; + private static final int PROPERTY_name = 65; + private static final int PROPERTY_component = 66; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[67]; + + static { + try { + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCSpooledFileViewerPanel.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCSpooledFileViewerPanel.class, "getColorModel", null ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCSpooledFileViewerPanel.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCSpooledFileViewerPanel.class, "isVisible", "setVisible" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCSpooledFileViewerPanel.class, "getToolkit", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCSpooledFileViewerPanel.class, "isDisplayable", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCSpooledFileViewerPanel.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCSpooledFileViewerPanel.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCSpooledFileViewerPanel.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCSpooledFileViewerPanel.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCSpooledFileViewerPanel.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCSpooledFileViewerPanel.class, "getX", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCSpooledFileViewerPanel.class, "getAccessibleContext", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCSpooledFileViewerPanel.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCSpooledFileViewerPanel.class, "getComponents", null ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCSpooledFileViewerPanel.class, "isManagingFocus", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCSpooledFileViewerPanel.class, "getInputMethodRequests", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCSpooledFileViewerPanel.class, "getBorder", "setBorder" ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCSpooledFileViewerPanel.class, "getLocale", "setLocale" ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCSpooledFileViewerPanel.class, "getInsets", null ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCSpooledFileViewerPanel.class, "getUIClassID", null ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCSpooledFileViewerPanel.class, "getGraphics", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCSpooledFileViewerPanel.class, "isMinimumSizeSet", null ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCSpooledFileViewerPanel.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCSpooledFileViewerPanel.class, "isMaximumSizeSet", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCSpooledFileViewerPanel.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCSpooledFileViewerPanel.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCSpooledFileViewerPanel.class, "getLocationOnScreen", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCSpooledFileViewerPanel.class, "getCursor", "setCursor" ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCSpooledFileViewerPanel.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCSpooledFileViewerPanel.class, "isPreferredSizeSet", null ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCSpooledFileViewerPanel.class, "getVisibleRect", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCSpooledFileViewerPanel.class, "getBounds", "setBounds" ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCSpooledFileViewerPanel.class, "getInputContext", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCSpooledFileViewerPanel.class, "getClass", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCSpooledFileViewerPanel.class, "isFocusTraversable", null ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCSpooledFileViewerPanel.class, "getFont", "setFont" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCSpooledFileViewerPanel.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCSpooledFileViewerPanel.class, "isLightweight", null ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCSpooledFileViewerPanel.class, "isPaintingTile", null ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCSpooledFileViewerPanel.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCSpooledFileViewerPanel.class, "getLayout", "setLayout" ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCSpooledFileViewerPanel.class, "getTreeLock", null ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCSpooledFileViewerPanel.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCSpooledFileViewerPanel.class, "getForeground", "setForeground" ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCSpooledFileViewerPanel.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCSpooledFileViewerPanel.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCSpooledFileViewerPanel.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCSpooledFileViewerPanel.class, "isShowing", null ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCSpooledFileViewerPanel.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCSpooledFileViewerPanel.class, "getParent", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCSpooledFileViewerPanel.class, "getPeer", null ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCSpooledFileViewerPanel.class, "getComponentCount", null ); + properties[PROPERTY_manager] = new PropertyDescriptor ( "manager", QCSpooledFileViewerPanel.class, null, "setManager" ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCSpooledFileViewerPanel.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCSpooledFileViewerPanel.class, "getHeight", null ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCSpooledFileViewerPanel.class, "isValid", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCSpooledFileViewerPanel.class, "isFocusCycleRoot", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCSpooledFileViewerPanel.class, "getWidth", null ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCSpooledFileViewerPanel.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCSpooledFileViewerPanel.class, "getBackground", "setBackground" ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCSpooledFileViewerPanel.class, "isValidateRoot", null ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCSpooledFileViewerPanel.class, "getTopLevelAncestor", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCSpooledFileViewerPanel.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCSpooledFileViewerPanel.class, "getRootPane", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCSpooledFileViewerPanel.class, "getName", "setName" ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCSpooledFileViewerPanel.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_ancestorListener = 1; + private static final int EVENT_inputMethodListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_propertyChangeListener = 7; + private static final int EVENT_keyListener = 8; + private static final int EVENT_hierarchyListener = 9; + private static final int EVENT_containerListener = 10; + private static final int EVENT_vetoableChangeListener = 11; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[12]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCSpooledFileViewerPanel.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCSpooledFileViewerPanel.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCSpooledFileViewerPanel.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCSpooledFileViewerPanel.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCSpooledFileViewerPanel.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCSpooledFileViewerPanel.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCSpooledFileViewerPanel.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCSpooledFileViewerPanel.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCSpooledFileViewerPanel.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCSpooledFileViewerPanel.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCSpooledFileViewerPanel.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCSpooledFileViewerPanel.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTopFrame.form b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTopFrame.form new file mode 100644 index 000000000..4f8d6faa0 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTopFrame.form @@ -0,0 +1,54 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTopFrame.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTopFrame.java new file mode 100644 index 000000000..7816521bc --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTopFrame.java @@ -0,0 +1,103 @@ +/* + * QCTopFrame.java + * + * Created on July 15, 2000, 9:24 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** The top-level frame for the QCDemo. + * @author jax + * @version 1.0 + */ +public class QCTopFrame extends javax.swing.JFrame { + + /** Error dialog for the as400 vaccess classes to share. + */ + public com.ibm.as400.vaccess.ErrorDialogAdapter errorDialogAdapter; + + /** Creates new form QCTopFrame */ + public QCTopFrame() { + initComponents (); + pack (); + initStuff(); + initMenus(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the FormEditor. + */ + private void initComponents () {//GEN-BEGIN:initComponents + fileMenuBar = new javax.swing.JMenuBar (); + fileMenu = new javax.swing.JMenu (); + qCNotebookPanel1 = new com.SoftWoehr.JTOpenContrib.QCDemo.QCNotebookPanel (); + + fileMenu.setText ("File"); + + fileMenuBar.add (fileMenu); + setTitle ("SoftWoehr QCDemo 1.0"); + addWindowListener (new java.awt.event.WindowAdapter () { + public void windowClosing (java.awt.event.WindowEvent evt) { + exitForm (evt); + } + } + ); + + qCNotebookPanel1.setPreferredSize (new java.awt.Dimension(600, 500)); + + + getContentPane ().add (qCNotebookPanel1, java.awt.BorderLayout.CENTER); + + setJMenuBar (fileMenuBar); + + }//GEN-END:initComponents + + /** Exit the Application */ + private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm + System.exit (0); + }//GEN-LAST:event_exitForm + + /** Run QCDemo. + * @param args the command line arguments + */ + public static void main (String args[]) { + new QCTopFrame ().show (); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JMenuBar fileMenuBar; + private javax.swing.JMenu fileMenu; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCNotebookPanel qCNotebookPanel1; + // End of variables declaration//GEN-END:variables + + private void initStuff () { + errorDialogAdapter = new com.ibm.as400.vaccess.ErrorDialogAdapter(this); + qCNotebookPanel1.propagateEDA(errorDialogAdapter); + } + + private void initMenus () { + javax.swing.JMenuItem exitItem = new javax.swing.JMenuItem("Exit", java.awt.event.KeyEvent.VK_X); + javax.swing.JMenuItem aboutItem = new javax.swing.JMenuItem("About", java.awt.event.KeyEvent.VK_A); + exitItem.addActionListener(new java.awt.event.ActionListener () { + public void actionPerformed(java.awt.event.ActionEvent a) { + System.exit(0); + } + }); + aboutItem.addActionListener(new java.awt.event.ActionListener () { + public void actionPerformed(java.awt.event.ActionEvent a) { + javax.swing.JOptionPane.showMessageDialog(null, "SoftWoehr QCDemo 1.0\nCopyright *C* 2000, Jack J. Woehr jax@well.com http://www.well.com/user/jax/SoftWoehr\nCopyright *C* 2000 International Business Machines Corporation and others. All Rights Reserved.", "About QCDemo 1.0", javax.swing.JOptionPane.INFORMATION_MESSAGE); + } + }); + fileMenu.add(exitItem); + fileMenu.add(aboutItem); + } + + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTopFrameBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTopFrameBeanInfo.java new file mode 100644 index 000000000..5dff91e72 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTopFrameBeanInfo.java @@ -0,0 +1,299 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCTopFrameBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_x = 0; + private static final int PROPERTY_owner = 1; + private static final int PROPERTY_background = 2; + private static final int PROPERTY_rootPane = 3; + private static final int PROPERTY_dropTarget = 4; + private static final int PROPERTY_graphics = 5; + private static final int PROPERTY_name = 6; + private static final int PROPERTY_locationOnScreen = 7; + private static final int PROPERTY_bounds = 8; + private static final int PROPERTY_components = 9; + private static final int PROPERTY_layout = 10; + private static final int PROPERTY_JMenuBar = 11; + private static final int PROPERTY_glassPane = 12; + private static final int PROPERTY_accessibleContext = 13; + private static final int PROPERTY_defaultCloseOperation = 14; + private static final int PROPERTY_font = 15; + private static final int PROPERTY_cursorType = 16; + private static final int PROPERTY_cursor = 17; + private static final int PROPERTY_preferredSize = 18; + private static final int PROPERTY_focusTraversable = 19; + private static final int PROPERTY_width = 20; + private static final int PROPERTY_iconImage = 21; + private static final int PROPERTY_maximumSize = 22; + private static final int PROPERTY_enabled = 23; + private static final int PROPERTY_treeLock = 24; + private static final int PROPERTY_ownedWindows = 25; + private static final int PROPERTY_visible = 26; + private static final int PROPERTY_insets = 27; + private static final int PROPERTY_resizable = 28; + private static final int PROPERTY_contentPane = 29; + private static final int PROPERTY_state = 30; + private static final int PROPERTY_title = 31; + private static final int PROPERTY_lightweight = 32; + private static final int PROPERTY_componentCount = 33; + private static final int PROPERTY_menuBar = 34; + private static final int PROPERTY_parent = 35; + private static final int PROPERTY_componentOrientation = 36; + private static final int PROPERTY_opaque = 37; + private static final int PROPERTY_showing = 38; + private static final int PROPERTY_inputContext = 39; + private static final int PROPERTY_locale = 40; + private static final int PROPERTY_valid = 41; + private static final int PROPERTY_foreground = 42; + private static final int PROPERTY_colorModel = 43; + private static final int PROPERTY_warningString = 44; + private static final int PROPERTY_doubleBuffered = 45; + private static final int PROPERTY_class = 46; + private static final int PROPERTY_layeredPane = 47; + private static final int PROPERTY_minimumSize = 48; + private static final int PROPERTY_toolkit = 49; + private static final int PROPERTY_peer = 50; + private static final int PROPERTY_inputMethodRequests = 51; + private static final int PROPERTY_height = 52; + private static final int PROPERTY_displayable = 53; + private static final int PROPERTY_alignmentY = 54; + private static final int PROPERTY_graphicsConfiguration = 55; + private static final int PROPERTY_alignmentX = 56; + private static final int PROPERTY_focusOwner = 57; + private static final int PROPERTY_y = 58; + private static final int PROPERTY_component = 59; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[60]; + + static { + try { + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCTopFrame.class, "getX", null ); + properties[PROPERTY_owner] = new PropertyDescriptor ( "owner", QCTopFrame.class, "getOwner", null ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCTopFrame.class, "getBackground", "setBackground" ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCTopFrame.class, "getRootPane", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCTopFrame.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCTopFrame.class, "getGraphics", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCTopFrame.class, "getName", "setName" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCTopFrame.class, "getLocationOnScreen", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCTopFrame.class, "getBounds", "setBounds" ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCTopFrame.class, "getComponents", null ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCTopFrame.class, "getLayout", "setLayout" ); + properties[PROPERTY_JMenuBar] = new PropertyDescriptor ( "JMenuBar", QCTopFrame.class, "getJMenuBar", "setJMenuBar" ); + properties[PROPERTY_glassPane] = new PropertyDescriptor ( "glassPane", QCTopFrame.class, "getGlassPane", "setGlassPane" ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCTopFrame.class, "getAccessibleContext", null ); + properties[PROPERTY_defaultCloseOperation] = new PropertyDescriptor ( "defaultCloseOperation", QCTopFrame.class, "getDefaultCloseOperation", "setDefaultCloseOperation" ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCTopFrame.class, "getFont", "setFont" ); + properties[PROPERTY_cursorType] = new PropertyDescriptor ( "cursorType", QCTopFrame.class, "getCursorType", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCTopFrame.class, "getCursor", "setCursor" ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCTopFrame.class, "getPreferredSize", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCTopFrame.class, "isFocusTraversable", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCTopFrame.class, "getWidth", null ); + properties[PROPERTY_iconImage] = new PropertyDescriptor ( "iconImage", QCTopFrame.class, "getIconImage", "setIconImage" ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCTopFrame.class, "getMaximumSize", null ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCTopFrame.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCTopFrame.class, "getTreeLock", null ); + properties[PROPERTY_ownedWindows] = new PropertyDescriptor ( "ownedWindows", QCTopFrame.class, "getOwnedWindows", null ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCTopFrame.class, "isVisible", "setVisible" ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCTopFrame.class, "getInsets", null ); + properties[PROPERTY_resizable] = new PropertyDescriptor ( "resizable", QCTopFrame.class, "isResizable", "setResizable" ); + properties[PROPERTY_contentPane] = new PropertyDescriptor ( "contentPane", QCTopFrame.class, "getContentPane", "setContentPane" ); + properties[PROPERTY_state] = new PropertyDescriptor ( "state", QCTopFrame.class, "getState", "setState" ); + properties[PROPERTY_title] = new PropertyDescriptor ( "title", QCTopFrame.class, "getTitle", "setTitle" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCTopFrame.class, "isLightweight", null ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCTopFrame.class, "getComponentCount", null ); + properties[PROPERTY_menuBar] = new PropertyDescriptor ( "menuBar", QCTopFrame.class, "getMenuBar", "setMenuBar" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCTopFrame.class, "getParent", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCTopFrame.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCTopFrame.class, "isOpaque", null ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCTopFrame.class, "isShowing", null ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCTopFrame.class, "getInputContext", null ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCTopFrame.class, "getLocale", "setLocale" ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCTopFrame.class, "isValid", null ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCTopFrame.class, "getForeground", "setForeground" ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCTopFrame.class, "getColorModel", null ); + properties[PROPERTY_warningString] = new PropertyDescriptor ( "warningString", QCTopFrame.class, "getWarningString", null ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCTopFrame.class, "isDoubleBuffered", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCTopFrame.class, "getClass", null ); + properties[PROPERTY_layeredPane] = new PropertyDescriptor ( "layeredPane", QCTopFrame.class, "getLayeredPane", "setLayeredPane" ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCTopFrame.class, "getMinimumSize", null ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCTopFrame.class, "getToolkit", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCTopFrame.class, "getPeer", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCTopFrame.class, "getInputMethodRequests", null ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCTopFrame.class, "getHeight", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCTopFrame.class, "isDisplayable", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCTopFrame.class, "getAlignmentY", null ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCTopFrame.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCTopFrame.class, "getAlignmentX", null ); + properties[PROPERTY_focusOwner] = new PropertyDescriptor ( "focusOwner", QCTopFrame.class, "getFocusOwner", null ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCTopFrame.class, "getY", null ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCTopFrame.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_inputMethodListener = 1; + private static final int EVENT_componentListener = 2; + private static final int EVENT_hierarchyBoundsListener = 3; + private static final int EVENT_mouseListener = 4; + private static final int EVENT_focusListener = 5; + private static final int EVENT_propertyChangeListener = 6; + private static final int EVENT_windowListener = 7; + private static final int EVENT_keyListener = 8; + private static final int EVENT_hierarchyListener = 9; + private static final int EVENT_containerListener = 10; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[11]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCTopFrame.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCTopFrame.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCTopFrame.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCTopFrame.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCTopFrame.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCTopFrame.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCTopFrame.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_windowListener] = new EventSetDescriptor ( QCTopFrame.class, "windowListener", java.awt.event.WindowListener.class, new String[0], "addWindowListener", "removeWindowListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCTopFrame.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCTopFrame.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCTopFrame.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTreePane.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTreePane.java new file mode 100644 index 000000000..3c9109ad2 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTreePane.java @@ -0,0 +1,51 @@ +/* + * QCTreePane.java + * + * A wrapper around com.ibm.as400.vaccess.AS400TreePane to + * allow us to polymorphically switch panes in a panel. + * + * Created on July 16, 2000, 2:06 AM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** A wrapper around a JTOpen pane type to allow polymorphism. + * @author jax + * @version 1.0 + */ +public class QCTreePane extends com.ibm.as400.vaccess.AS400TreePane implements QCVNodeDisplayer { + + /** Creates new QCExplorer */ + public QCTreePane() { + } + + /** Sets the node as root for the pane. + * @param v The VNode to be setRoot by the pane. + */ + public void setRoot(com.ibm.as400.vaccess.VNode v) { + try { + super.setRoot(v); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + } + + /** Add the pane to the Container. + * @param c The Container to be added to. + */ + public void addTo(java.awt.Container c) { + c.add(this); + } + + /** Add error dialog as listener. + * @param eda The ErrorDialogAdapter to add. + */ + public void addErrorListener(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTreePaneBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTreePaneBeanInfo.java new file mode 100644 index 000000000..db441c98a --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCTreePaneBeanInfo.java @@ -0,0 +1,333 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCTreePaneBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_nextFocusableComponent = 0; + private static final int PROPERTY_validateRoot = 1; + private static final int PROPERTY_font = 2; + private static final int PROPERTY_selectionModel = 3; + private static final int PROPERTY_colorModel = 4; + private static final int PROPERTY_selectedObject = 5; + private static final int PROPERTY_alignmentY = 6; + private static final int PROPERTY_alignmentX = 7; + private static final int PROPERTY_y = 8; + private static final int PROPERTY_x = 9; + private static final int PROPERTY_accessibleContext = 10; + private static final int PROPERTY_layout = 11; + private static final int PROPERTY_preferredSize = 12; + private static final int PROPERTY_inputMethodRequests = 13; + private static final int PROPERTY_verifyInputWhenFocusTarget = 14; + private static final int PROPERTY_toolkit = 15; + private static final int PROPERTY_displayable = 16; + private static final int PROPERTY_class = 17; + private static final int PROPERTY_root = 18; + private static final int PROPERTY_autoscrolls = 19; + private static final int PROPERTY_insets = 20; + private static final int PROPERTY_cursor = 21; + private static final int PROPERTY_showing = 22; + private static final int PROPERTY_model = 23; + private static final int PROPERTY_preferredSizeSet = 24; + private static final int PROPERTY_components = 25; + private static final int PROPERTY_focusTraversable = 26; + private static final int PROPERTY_visible = 27; + private static final int PROPERTY_background = 28; + private static final int PROPERTY_UIClassID = 29; + private static final int PROPERTY_graphicsConfiguration = 30; + private static final int PROPERTY_inputContext = 31; + private static final int PROPERTY_registeredKeyStrokes = 32; + private static final int PROPERTY_valid = 33; + private static final int PROPERTY_locale = 34; + private static final int PROPERTY_componentOrientation = 35; + private static final int PROPERTY_graphics = 36; + private static final int PROPERTY_peer = 37; + private static final int PROPERTY_locationOnScreen = 38; + private static final int PROPERTY_name = 39; + private static final int PROPERTY_foreground = 40; + private static final int PROPERTY_actionMap = 41; + private static final int PROPERTY_topLevelAncestor = 42; + private static final int PROPERTY_paintingTile = 43; + private static final int PROPERTY_focusCycleRoot = 44; + private static final int PROPERTY_enabled = 45; + private static final int PROPERTY_lightweight = 46; + private static final int PROPERTY_dropTarget = 47; + private static final int PROPERTY_opaque = 48; + private static final int PROPERTY_componentCount = 49; + private static final int PROPERTY_maximumSizeSet = 50; + private static final int PROPERTY_confirm = 51; + private static final int PROPERTY_toolTipText = 52; + private static final int PROPERTY_height = 53; + private static final int PROPERTY_doubleBuffered = 54; + private static final int PROPERTY_border = 55; + private static final int PROPERTY_minimumSizeSet = 56; + private static final int PROPERTY_actionContext = 57; + private static final int PROPERTY_treeLock = 58; + private static final int PROPERTY_width = 59; + private static final int PROPERTY_managingFocus = 60; + private static final int PROPERTY_maximumSize = 61; + private static final int PROPERTY_minimumSize = 62; + private static final int PROPERTY_allowActions = 63; + private static final int PROPERTY_visibleRect = 64; + private static final int PROPERTY_debugGraphicsOptions = 65; + private static final int PROPERTY_optimizedDrawingEnabled = 66; + private static final int PROPERTY_requestFocusEnabled = 67; + private static final int PROPERTY_parent = 68; + private static final int PROPERTY_inputVerifier = 69; + private static final int PROPERTY_rootPane = 70; + private static final int PROPERTY_bounds = 71; + private static final int PROPERTY_selectedObjects = 72; + private static final int PROPERTY_component = 73; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[74]; + + static { + try { + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCTreePane.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCTreePane.class, "isValidateRoot", null ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCTreePane.class, "getFont", "setFont" ); + properties[PROPERTY_selectionModel] = new PropertyDescriptor ( "selectionModel", QCTreePane.class, "getSelectionModel", "setSelectionModel" ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCTreePane.class, "getColorModel", null ); + properties[PROPERTY_selectedObject] = new PropertyDescriptor ( "selectedObject", QCTreePane.class, "getSelectedObject", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCTreePane.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCTreePane.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCTreePane.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCTreePane.class, "getX", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCTreePane.class, "getAccessibleContext", null ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCTreePane.class, "getLayout", "setLayout" ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCTreePane.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCTreePane.class, "getInputMethodRequests", null ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCTreePane.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCTreePane.class, "getToolkit", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCTreePane.class, "isDisplayable", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCTreePane.class, "getClass", null ); + properties[PROPERTY_root] = new PropertyDescriptor ( "root", QCTreePane.class, "getRoot", "setRoot" ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCTreePane.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCTreePane.class, "getInsets", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCTreePane.class, "getCursor", "setCursor" ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCTreePane.class, "isShowing", null ); + properties[PROPERTY_model] = new PropertyDescriptor ( "model", QCTreePane.class, "getModel", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCTreePane.class, "isPreferredSizeSet", null ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCTreePane.class, "getComponents", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCTreePane.class, "isFocusTraversable", null ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCTreePane.class, "isVisible", "setVisible" ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCTreePane.class, "getBackground", "setBackground" ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCTreePane.class, "getUIClassID", null ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCTreePane.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCTreePane.class, "getInputContext", null ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCTreePane.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCTreePane.class, "isValid", null ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCTreePane.class, "getLocale", "setLocale" ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCTreePane.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCTreePane.class, "getGraphics", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCTreePane.class, "getPeer", null ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCTreePane.class, "getLocationOnScreen", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCTreePane.class, "getName", "setName" ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCTreePane.class, "getForeground", "setForeground" ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCTreePane.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCTreePane.class, "getTopLevelAncestor", null ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCTreePane.class, "isPaintingTile", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCTreePane.class, "isFocusCycleRoot", null ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCTreePane.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCTreePane.class, "isLightweight", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCTreePane.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCTreePane.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCTreePane.class, "getComponentCount", null ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCTreePane.class, "isMaximumSizeSet", null ); + properties[PROPERTY_confirm] = new PropertyDescriptor ( "confirm", QCTreePane.class, "getConfirm", "setConfirm" ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCTreePane.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCTreePane.class, "getHeight", null ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCTreePane.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCTreePane.class, "getBorder", "setBorder" ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCTreePane.class, "isMinimumSizeSet", null ); + properties[PROPERTY_actionContext] = new PropertyDescriptor ( "actionContext", QCTreePane.class, "getActionContext", null ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCTreePane.class, "getTreeLock", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCTreePane.class, "getWidth", null ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCTreePane.class, "isManagingFocus", null ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCTreePane.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCTreePane.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_allowActions] = new PropertyDescriptor ( "allowActions", QCTreePane.class, "getAllowActions", "setAllowActions" ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCTreePane.class, "getVisibleRect", null ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCTreePane.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCTreePane.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCTreePane.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCTreePane.class, "getParent", null ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCTreePane.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCTreePane.class, "getRootPane", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCTreePane.class, "getBounds", "setBounds" ); + properties[PROPERTY_selectedObjects] = new PropertyDescriptor ( "selectedObjects", QCTreePane.class, "getSelectedObjects", null ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCTreePane.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_inputMethodListener = 1; + private static final int EVENT_ancestorListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_treeSelectionListener = 7; + private static final int EVENT_propertyChangeListener = 8; + private static final int EVENT_keyListener = 9; + private static final int EVENT_hierarchyListener = 10; + private static final int EVENT_containerListener = 11; + private static final int EVENT_vetoableChangeListener = 12; + private static final int EVENT_errorListener = 13; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[14]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCTreePane.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCTreePane.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCTreePane.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCTreePane.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCTreePane.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCTreePane.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCTreePane.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_treeSelectionListener] = new EventSetDescriptor ( QCTreePane.class, "treeSelectionListener", javax.swing.event.TreeSelectionListener.class, new String[0], "addTreeSelectionListener", "removeTreeSelectionListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCTreePane.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCTreePane.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCTreePane.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCTreePane.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCTreePane.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + eventSets[EVENT_errorListener] = new EventSetDescriptor ( QCTreePane.class, "errorListener", com.ibm.as400.vaccess.ErrorListener.class, new String[0], "addErrorListener", "removeErrorListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCUserListPanel.form b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCUserListPanel.form new file mode 100644 index 000000000..071b226cd --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCUserListPanel.form @@ -0,0 +1,83 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCUserListPanel.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCUserListPanel.java new file mode 100644 index 000000000..176dc54ec --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCUserListPanel.java @@ -0,0 +1,194 @@ +/* + * QCUserListPanel.java + * + * Created on July 14, 2000, 9:07 PM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** Panel to hold AS400UserListPane. + * @author jax + * @version 1.0 + */ +public class QCUserListPanel extends javax.swing.JPanel implements com.SoftWoehr.JTOpenContrib.QCDemo.QCServiceClient { + + private QCMgr manager; + private java.lang.String serverName; + private com.SoftWoehr.JTOpenContrib.QCDemo.QCServiceRecord serviceRecord; + private com.ibm.as400.vaccess.ErrorDialogAdapter errorDialogAdapter; + + /** Creates new form QCUserListPanel */ + public QCUserListPanel() { + initComponents (); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the FormEditor. + */ + private void initComponents () {//GEN-BEGIN:initComponents + vUserList1 = new com.ibm.as400.vaccess.VUserList (); + aS400DetailsPane1 = new com.ibm.as400.vaccess.AS400DetailsPane (); + jPanel1 = new javax.swing.JPanel (); + systemLabel = new javax.swing.JLabel (); + systemTextField = new javax.swing.JTextField (); + listButton = new javax.swing.JButton (); + userListLabel = new javax.swing.JLabel (); + + setLayout (new java.awt.BorderLayout ()); + + + + add (aS400DetailsPane1, java.awt.BorderLayout.CENTER); + + jPanel1.setLayout (new java.awt.GridLayout (1, 3)); + + systemLabel.setText ("System name"); + systemLabel.setHorizontalAlignment (javax.swing.SwingConstants.RIGHT); + + jPanel1.add (systemLabel); + + systemTextField.setToolTipText ("Enter system name for user list."); + systemTextField.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + systemTextFieldActionPerformed (evt); + } + } + ); + + jPanel1.add (systemTextField); + + listButton.setToolTipText ("Get a list of user on system you selected."); + listButton.setText ("Get User LIst"); + listButton.addActionListener (new java.awt.event.ActionListener () { + public void actionPerformed (java.awt.event.ActionEvent evt) { + listButtonActionPerformed (evt); + } + } + ); + + jPanel1.add (listButton); + + + add (jPanel1, java.awt.BorderLayout.SOUTH); + + userListLabel.setText ("A list of users on the server."); + userListLabel.setToolTipText ("Fill in the system name below and press the button to get a list of users."); + userListLabel.setHorizontalAlignment (javax.swing.SwingConstants.CENTER); + + + add (userListLabel, java.awt.BorderLayout.NORTH); + + }//GEN-END:initComponents + + // Hitting ENTER in the textfield is the same as pressing the button. + private void systemTextFieldActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_systemTextFieldActionPerformed + // Add your handling code here: + listButtonActionPerformed (evt); + }//GEN-LAST:event_systemTextFieldActionPerformed + + // Hitting ENTER in the textfield is the same as pressing the button. + private void listButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_listButtonActionPerformed + // Add your handling code here: + java.awt.Cursor cursor = getCursor(); + setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR)); + reinstanceServerFromTextEntry(); + reinstanceUserList(); + if (null != vUserList1 && null != serviceRecord) { + loadUsers(); + setDetailsPaneRoot(); + } + setCursor(cursor); + }//GEN-LAST:event_listButtonActionPerformed + + private synchronized void reinstanceServerFromTextEntry() { + String newName = systemTextField.getText(); + if (null == serverName) { + serverName = ""; + } + if (null != newName) { + if (!newName.equals("")) { + if (!newName.equals(serverName)) { + serverName = newName; + if (null != serviceRecord) { + + try { // let go of the service from manager + manager.freeService(serviceRecord); + } + catch (Exception e) { + e.printStackTrace(); + } + serviceRecord = null; + } + try { + serviceRecord = manager.getService("qcmgr:" + serverName + "/COMMAND", this); + } + catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } + private synchronized void reinstanceUserList () { + vUserList1 = new com.ibm.as400.vaccess.VUserList(serviceRecord.as400); + if (null != errorDialogAdapter) { + vUserList1.addErrorListener(errorDialogAdapter); + } + } + + private void setDetailsPaneRoot() { + if (null != vUserList1) { + try { + aS400DetailsPane1.setRoot(vUserList1); + } + catch (java.beans.PropertyVetoException e) { + e.printStackTrace(); + } + } + } + + private void loadUsers () { + vUserList1.load(); + } + // Variables declaration - do not modify//GEN-BEGIN:variables + private com.ibm.as400.vaccess.VUserList vUserList1; + private com.ibm.as400.vaccess.AS400DetailsPane aS400DetailsPane1; + private javax.swing.JPanel jPanel1; + private javax.swing.JLabel systemLabel; + private javax.swing.JTextField systemTextField; + private javax.swing.JButton listButton; + private javax.swing.JLabel userListLabel; + // End of variables declaration//GEN-END:variables + + /** Sets the QCMgr object which will handle AS400 instances for this client. + * @param mgr A QCMgr object. + */ + public void setManager(QCMgr mgr) { + manager = mgr; + } + + /** Connects the ErrorDialogAdapter with any as400.vaccess components present. + * @param eda An instance of an ErrorDialogAdapter already associated + * with a suitable Frame. + */ + public void propagateEDA(com.ibm.as400.vaccess.ErrorDialogAdapter eda) { + errorDialogAdapter=eda; + aS400DetailsPane1.addErrorListener(eda); + vUserList1.addErrorListener(eda); + } + /** Required implementantion of the QCServiceClient interface. Releases the + * AS400 object provided by the server. + * @param sr The service record which represents the AS400 to be + * relinquished. + */ + public void relinquish(QCServiceRecord sr) { + serviceRecord = null; + } +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCUserListPanelBeanInfo.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCUserListPanelBeanInfo.java new file mode 100644 index 000000000..42175c888 --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCUserListPanelBeanInfo.java @@ -0,0 +1,315 @@ +package com.SoftWoehr.JTOpenContrib.QCDemo; + +import java.beans.*; + +public class QCUserListPanelBeanInfo extends SimpleBeanInfo { + + // Property identifiers //GEN-FIRST:Properties + private static final int PROPERTY_optimizedDrawingEnabled = 0; + private static final int PROPERTY_colorModel = 1; + private static final int PROPERTY_minimumSize = 2; + private static final int PROPERTY_visible = 3; + private static final int PROPERTY_toolkit = 4; + private static final int PROPERTY_displayable = 5; + private static final int PROPERTY_opaque = 6; + private static final int PROPERTY_requestFocusEnabled = 7; + private static final int PROPERTY_enabled = 8; + private static final int PROPERTY_autoscrolls = 9; + private static final int PROPERTY_y = 10; + private static final int PROPERTY_x = 11; + private static final int PROPERTY_accessibleContext = 12; + private static final int PROPERTY_componentOrientation = 13; + private static final int PROPERTY_components = 14; + private static final int PROPERTY_managingFocus = 15; + private static final int PROPERTY_inputMethodRequests = 16; + private static final int PROPERTY_border = 17; + private static final int PROPERTY_locale = 18; + private static final int PROPERTY_insets = 19; + private static final int PROPERTY_UIClassID = 20; + private static final int PROPERTY_graphics = 21; + private static final int PROPERTY_minimumSizeSet = 22; + private static final int PROPERTY_actionMap = 23; + private static final int PROPERTY_maximumSizeSet = 24; + private static final int PROPERTY_alignmentY = 25; + private static final int PROPERTY_alignmentX = 26; + private static final int PROPERTY_locationOnScreen = 27; + private static final int PROPERTY_cursor = 28; + private static final int PROPERTY_registeredKeyStrokes = 29; + private static final int PROPERTY_preferredSizeSet = 30; + private static final int PROPERTY_visibleRect = 31; + private static final int PROPERTY_bounds = 32; + private static final int PROPERTY_inputContext = 33; + private static final int PROPERTY_class = 34; + private static final int PROPERTY_focusTraversable = 35; + private static final int PROPERTY_font = 36; + private static final int PROPERTY_inputVerifier = 37; + private static final int PROPERTY_lightweight = 38; + private static final int PROPERTY_paintingTile = 39; + private static final int PROPERTY_maximumSize = 40; + private static final int PROPERTY_layout = 41; + private static final int PROPERTY_treeLock = 42; + private static final int PROPERTY_verifyInputWhenFocusTarget = 43; + private static final int PROPERTY_foreground = 44; + private static final int PROPERTY_preferredSize = 45; + private static final int PROPERTY_debugGraphicsOptions = 46; + private static final int PROPERTY_doubleBuffered = 47; + private static final int PROPERTY_showing = 48; + private static final int PROPERTY_nextFocusableComponent = 49; + private static final int PROPERTY_parent = 50; + private static final int PROPERTY_peer = 51; + private static final int PROPERTY_componentCount = 52; + private static final int PROPERTY_manager = 53; + private static final int PROPERTY_graphicsConfiguration = 54; + private static final int PROPERTY_height = 55; + private static final int PROPERTY_valid = 56; + private static final int PROPERTY_focusCycleRoot = 57; + private static final int PROPERTY_width = 58; + private static final int PROPERTY_toolTipText = 59; + private static final int PROPERTY_background = 60; + private static final int PROPERTY_validateRoot = 61; + private static final int PROPERTY_topLevelAncestor = 62; + private static final int PROPERTY_dropTarget = 63; + private static final int PROPERTY_rootPane = 64; + private static final int PROPERTY_name = 65; + private static final int PROPERTY_component = 66; + + // Property array + private static PropertyDescriptor[] properties = new PropertyDescriptor[67]; + + static { + try { + properties[PROPERTY_optimizedDrawingEnabled] = new PropertyDescriptor ( "optimizedDrawingEnabled", QCUserListPanel.class, "isOptimizedDrawingEnabled", null ); + properties[PROPERTY_colorModel] = new PropertyDescriptor ( "colorModel", QCUserListPanel.class, "getColorModel", null ); + properties[PROPERTY_minimumSize] = new PropertyDescriptor ( "minimumSize", QCUserListPanel.class, "getMinimumSize", "setMinimumSize" ); + properties[PROPERTY_visible] = new PropertyDescriptor ( "visible", QCUserListPanel.class, "isVisible", "setVisible" ); + properties[PROPERTY_toolkit] = new PropertyDescriptor ( "toolkit", QCUserListPanel.class, "getToolkit", null ); + properties[PROPERTY_displayable] = new PropertyDescriptor ( "displayable", QCUserListPanel.class, "isDisplayable", null ); + properties[PROPERTY_opaque] = new PropertyDescriptor ( "opaque", QCUserListPanel.class, "isOpaque", "setOpaque" ); + properties[PROPERTY_requestFocusEnabled] = new PropertyDescriptor ( "requestFocusEnabled", QCUserListPanel.class, "isRequestFocusEnabled", "setRequestFocusEnabled" ); + properties[PROPERTY_enabled] = new PropertyDescriptor ( "enabled", QCUserListPanel.class, "isEnabled", "setEnabled" ); + properties[PROPERTY_autoscrolls] = new PropertyDescriptor ( "autoscrolls", QCUserListPanel.class, "getAutoscrolls", "setAutoscrolls" ); + properties[PROPERTY_y] = new PropertyDescriptor ( "y", QCUserListPanel.class, "getY", null ); + properties[PROPERTY_x] = new PropertyDescriptor ( "x", QCUserListPanel.class, "getX", null ); + properties[PROPERTY_accessibleContext] = new PropertyDescriptor ( "accessibleContext", QCUserListPanel.class, "getAccessibleContext", null ); + properties[PROPERTY_componentOrientation] = new PropertyDescriptor ( "componentOrientation", QCUserListPanel.class, "getComponentOrientation", "setComponentOrientation" ); + properties[PROPERTY_components] = new PropertyDescriptor ( "components", QCUserListPanel.class, "getComponents", null ); + properties[PROPERTY_managingFocus] = new PropertyDescriptor ( "managingFocus", QCUserListPanel.class, "isManagingFocus", null ); + properties[PROPERTY_inputMethodRequests] = new PropertyDescriptor ( "inputMethodRequests", QCUserListPanel.class, "getInputMethodRequests", null ); + properties[PROPERTY_border] = new PropertyDescriptor ( "border", QCUserListPanel.class, "getBorder", "setBorder" ); + properties[PROPERTY_locale] = new PropertyDescriptor ( "locale", QCUserListPanel.class, "getLocale", "setLocale" ); + properties[PROPERTY_insets] = new PropertyDescriptor ( "insets", QCUserListPanel.class, "getInsets", null ); + properties[PROPERTY_UIClassID] = new PropertyDescriptor ( "UIClassID", QCUserListPanel.class, "getUIClassID", null ); + properties[PROPERTY_graphics] = new PropertyDescriptor ( "graphics", QCUserListPanel.class, "getGraphics", null ); + properties[PROPERTY_minimumSizeSet] = new PropertyDescriptor ( "minimumSizeSet", QCUserListPanel.class, "isMinimumSizeSet", null ); + properties[PROPERTY_actionMap] = new PropertyDescriptor ( "actionMap", QCUserListPanel.class, "getActionMap", "setActionMap" ); + properties[PROPERTY_maximumSizeSet] = new PropertyDescriptor ( "maximumSizeSet", QCUserListPanel.class, "isMaximumSizeSet", null ); + properties[PROPERTY_alignmentY] = new PropertyDescriptor ( "alignmentY", QCUserListPanel.class, "getAlignmentY", "setAlignmentY" ); + properties[PROPERTY_alignmentX] = new PropertyDescriptor ( "alignmentX", QCUserListPanel.class, "getAlignmentX", "setAlignmentX" ); + properties[PROPERTY_locationOnScreen] = new PropertyDescriptor ( "locationOnScreen", QCUserListPanel.class, "getLocationOnScreen", null ); + properties[PROPERTY_cursor] = new PropertyDescriptor ( "cursor", QCUserListPanel.class, "getCursor", "setCursor" ); + properties[PROPERTY_registeredKeyStrokes] = new PropertyDescriptor ( "registeredKeyStrokes", QCUserListPanel.class, "getRegisteredKeyStrokes", null ); + properties[PROPERTY_preferredSizeSet] = new PropertyDescriptor ( "preferredSizeSet", QCUserListPanel.class, "isPreferredSizeSet", null ); + properties[PROPERTY_visibleRect] = new PropertyDescriptor ( "visibleRect", QCUserListPanel.class, "getVisibleRect", null ); + properties[PROPERTY_bounds] = new PropertyDescriptor ( "bounds", QCUserListPanel.class, "getBounds", "setBounds" ); + properties[PROPERTY_inputContext] = new PropertyDescriptor ( "inputContext", QCUserListPanel.class, "getInputContext", null ); + properties[PROPERTY_class] = new PropertyDescriptor ( "class", QCUserListPanel.class, "getClass", null ); + properties[PROPERTY_focusTraversable] = new PropertyDescriptor ( "focusTraversable", QCUserListPanel.class, "isFocusTraversable", null ); + properties[PROPERTY_font] = new PropertyDescriptor ( "font", QCUserListPanel.class, "getFont", "setFont" ); + properties[PROPERTY_inputVerifier] = new PropertyDescriptor ( "inputVerifier", QCUserListPanel.class, "getInputVerifier", "setInputVerifier" ); + properties[PROPERTY_lightweight] = new PropertyDescriptor ( "lightweight", QCUserListPanel.class, "isLightweight", null ); + properties[PROPERTY_paintingTile] = new PropertyDescriptor ( "paintingTile", QCUserListPanel.class, "isPaintingTile", null ); + properties[PROPERTY_maximumSize] = new PropertyDescriptor ( "maximumSize", QCUserListPanel.class, "getMaximumSize", "setMaximumSize" ); + properties[PROPERTY_layout] = new PropertyDescriptor ( "layout", QCUserListPanel.class, "getLayout", "setLayout" ); + properties[PROPERTY_treeLock] = new PropertyDescriptor ( "treeLock", QCUserListPanel.class, "getTreeLock", null ); + properties[PROPERTY_verifyInputWhenFocusTarget] = new PropertyDescriptor ( "verifyInputWhenFocusTarget", QCUserListPanel.class, "getVerifyInputWhenFocusTarget", "setVerifyInputWhenFocusTarget" ); + properties[PROPERTY_foreground] = new PropertyDescriptor ( "foreground", QCUserListPanel.class, "getForeground", "setForeground" ); + properties[PROPERTY_preferredSize] = new PropertyDescriptor ( "preferredSize", QCUserListPanel.class, "getPreferredSize", "setPreferredSize" ); + properties[PROPERTY_debugGraphicsOptions] = new PropertyDescriptor ( "debugGraphicsOptions", QCUserListPanel.class, "getDebugGraphicsOptions", "setDebugGraphicsOptions" ); + properties[PROPERTY_doubleBuffered] = new PropertyDescriptor ( "doubleBuffered", QCUserListPanel.class, "isDoubleBuffered", "setDoubleBuffered" ); + properties[PROPERTY_showing] = new PropertyDescriptor ( "showing", QCUserListPanel.class, "isShowing", null ); + properties[PROPERTY_nextFocusableComponent] = new PropertyDescriptor ( "nextFocusableComponent", QCUserListPanel.class, "getNextFocusableComponent", "setNextFocusableComponent" ); + properties[PROPERTY_parent] = new PropertyDescriptor ( "parent", QCUserListPanel.class, "getParent", null ); + properties[PROPERTY_peer] = new PropertyDescriptor ( "peer", QCUserListPanel.class, "getPeer", null ); + properties[PROPERTY_componentCount] = new PropertyDescriptor ( "componentCount", QCUserListPanel.class, "getComponentCount", null ); + properties[PROPERTY_manager] = new PropertyDescriptor ( "manager", QCUserListPanel.class, null, "setManager" ); + properties[PROPERTY_graphicsConfiguration] = new PropertyDescriptor ( "graphicsConfiguration", QCUserListPanel.class, "getGraphicsConfiguration", null ); + properties[PROPERTY_height] = new PropertyDescriptor ( "height", QCUserListPanel.class, "getHeight", null ); + properties[PROPERTY_valid] = new PropertyDescriptor ( "valid", QCUserListPanel.class, "isValid", null ); + properties[PROPERTY_focusCycleRoot] = new PropertyDescriptor ( "focusCycleRoot", QCUserListPanel.class, "isFocusCycleRoot", null ); + properties[PROPERTY_width] = new PropertyDescriptor ( "width", QCUserListPanel.class, "getWidth", null ); + properties[PROPERTY_toolTipText] = new PropertyDescriptor ( "toolTipText", QCUserListPanel.class, "getToolTipText", "setToolTipText" ); + properties[PROPERTY_background] = new PropertyDescriptor ( "background", QCUserListPanel.class, "getBackground", "setBackground" ); + properties[PROPERTY_validateRoot] = new PropertyDescriptor ( "validateRoot", QCUserListPanel.class, "isValidateRoot", null ); + properties[PROPERTY_topLevelAncestor] = new PropertyDescriptor ( "topLevelAncestor", QCUserListPanel.class, "getTopLevelAncestor", null ); + properties[PROPERTY_dropTarget] = new PropertyDescriptor ( "dropTarget", QCUserListPanel.class, "getDropTarget", "setDropTarget" ); + properties[PROPERTY_rootPane] = new PropertyDescriptor ( "rootPane", QCUserListPanel.class, "getRootPane", null ); + properties[PROPERTY_name] = new PropertyDescriptor ( "name", QCUserListPanel.class, "getName", "setName" ); + properties[PROPERTY_component] = new IndexedPropertyDescriptor ( "component", QCUserListPanel.class, null, null, "getComponent", null ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Properties + + // Here you can add code for customizing the properties array. + +}//GEN-LAST:Properties + + // EventSet identifiers//GEN-FIRST:Events + private static final int EVENT_mouseMotionListener = 0; + private static final int EVENT_ancestorListener = 1; + private static final int EVENT_inputMethodListener = 2; + private static final int EVENT_componentListener = 3; + private static final int EVENT_hierarchyBoundsListener = 4; + private static final int EVENT_mouseListener = 5; + private static final int EVENT_focusListener = 6; + private static final int EVENT_propertyChangeListener = 7; + private static final int EVENT_keyListener = 8; + private static final int EVENT_hierarchyListener = 9; + private static final int EVENT_containerListener = 10; + private static final int EVENT_vetoableChangeListener = 11; + + // EventSet array + private static EventSetDescriptor[] eventSets = new EventSetDescriptor[12]; + + static { + try { + eventSets[EVENT_mouseMotionListener] = new EventSetDescriptor ( QCUserListPanel.class, "mouseMotionListener", java.awt.event.MouseMotionListener.class, new String[0], "addMouseMotionListener", "removeMouseMotionListener" ); + eventSets[EVENT_ancestorListener] = new EventSetDescriptor ( QCUserListPanel.class, "ancestorListener", javax.swing.event.AncestorListener.class, new String[0], "addAncestorListener", "removeAncestorListener" ); + eventSets[EVENT_inputMethodListener] = new EventSetDescriptor ( QCUserListPanel.class, "inputMethodListener", java.awt.event.InputMethodListener.class, new String[0], "addInputMethodListener", "removeInputMethodListener" ); + eventSets[EVENT_componentListener] = new EventSetDescriptor ( QCUserListPanel.class, "componentListener", java.awt.event.ComponentListener.class, new String[0], "addComponentListener", "removeComponentListener" ); + eventSets[EVENT_hierarchyBoundsListener] = new EventSetDescriptor ( QCUserListPanel.class, "hierarchyBoundsListener", java.awt.event.HierarchyBoundsListener.class, new String[0], "addHierarchyBoundsListener", "removeHierarchyBoundsListener" ); + eventSets[EVENT_mouseListener] = new EventSetDescriptor ( QCUserListPanel.class, "mouseListener", java.awt.event.MouseListener.class, new String[0], "addMouseListener", "removeMouseListener" ); + eventSets[EVENT_focusListener] = new EventSetDescriptor ( QCUserListPanel.class, "focusListener", java.awt.event.FocusListener.class, new String[0], "addFocusListener", "removeFocusListener" ); + eventSets[EVENT_propertyChangeListener] = new EventSetDescriptor ( QCUserListPanel.class, "propertyChangeListener", java.beans.PropertyChangeListener.class, new String[0], "addPropertyChangeListener", "removePropertyChangeListener" ); + eventSets[EVENT_keyListener] = new EventSetDescriptor ( QCUserListPanel.class, "keyListener", java.awt.event.KeyListener.class, new String[0], "addKeyListener", "removeKeyListener" ); + eventSets[EVENT_hierarchyListener] = new EventSetDescriptor ( QCUserListPanel.class, "hierarchyListener", java.awt.event.HierarchyListener.class, new String[0], "addHierarchyListener", "removeHierarchyListener" ); + eventSets[EVENT_containerListener] = new EventSetDescriptor ( QCUserListPanel.class, "containerListener", java.awt.event.ContainerListener.class, new String[0], "addContainerListener", "removeContainerListener" ); + eventSets[EVENT_vetoableChangeListener] = new EventSetDescriptor ( QCUserListPanel.class, "vetoableChangeListener", java.beans.VetoableChangeListener.class, new String[0], "addVetoableChangeListener", "removeVetoableChangeListener" ); + } + catch( IntrospectionException e) {}//GEN-HEADEREND:Events + + // Here you can add code for customizing the event sets array. + +}//GEN-LAST:Events + + private static java.awt.Image iconColor16 = null; //GEN-BEGIN:IconsDef + private static java.awt.Image iconColor32 = null; + private static java.awt.Image iconMono16 = null; + private static java.awt.Image iconMono32 = null; //GEN-END:IconsDef + private static String iconNameC16 = null;//GEN-BEGIN:Icons + private static String iconNameC32 = null; + private static String iconNameM16 = null; + private static String iconNameM32 = null;//GEN-END:Icons + + private static int defaultPropertyIndex = -1;//GEN-BEGIN:Idx + private static int defaultEventIndex = -1;//GEN-END:Idx + + + /** + * Gets the beans PropertyDescriptors. + * + * @return An array of PropertyDescriptors describing the editable + * properties supported by this bean. May return null if the + * information should be obtained by automatic analysis. + *

+ * If a property is indexed, then its entry in the result array will + * belong to the IndexedPropertyDescriptor subclass of PropertyDescriptor. + * A client of getPropertyDescriptors can use "instanceof" to check + * if a given PropertyDescriptor is an IndexedPropertyDescriptor. + */ + public PropertyDescriptor[] getPropertyDescriptors() { + return properties; + } + + /** + * Gets the beans EventSetDescriptors. + * + * @return An array of EventSetDescriptors describing the kinds of + * events fired by this bean. May return null if the information + * should be obtained by automatic analysis. + */ + public EventSetDescriptor[] getEventSetDescriptors() { + return eventSets; + } + + /** + * A bean may have a "default" property that is the property that will + * mostly commonly be initially chosen for update by human's who are + * customizing the bean. + * @return Index of default property in the PropertyDescriptor array + * returned by getPropertyDescriptors. + *

Returns -1 if there is no default property. + */ + public int getDefaultPropertyIndex() { + return defaultPropertyIndex; + } + + /** + * A bean may have a "default" event that is the event that will + * mostly commonly be used by human's when using the bean. + * @return Index of default event in the EventSetDescriptor array + * returned by getEventSetDescriptors. + *

Returns -1 if there is no default event. + */ + public int getDefaultEventIndex() { + return defaultPropertyIndex; + } + + /** + * This method returns an image object that can be used to + * represent the bean in toolboxes, toolbars, etc. Icon images + * will typically be GIFs, but may in future include other formats. + *

+ * Beans aren't required to provide icons and may return null from + * this method. + *

+ * There are four possible flavors of icons (16x16 color, + * 32x32 color, 16x16 mono, 32x32 mono). If a bean choses to only + * support a single icon we recommend supporting 16x16 color. + *

+ * We recommend that icons have a "transparent" background + * so they can be rendered onto an existing background. + * + * @param iconKind The kind of icon requested. This should be + * one of the constant values ICON_COLOR_16x16, ICON_COLOR_32x32, + * ICON_MONO_16x16, or ICON_MONO_32x32. + * @return An image object representing the requested icon. May + * return null if no suitable icon is available. + */ + public java.awt.Image getIcon(int iconKind) { + switch ( iconKind ) { + case ICON_COLOR_16x16: + if ( iconNameC16 == null ) + return null; + else { + if( iconColor16 == null ) + iconColor16 = loadImage( iconNameC16 ); + return iconColor16; + } + case ICON_COLOR_32x32: + if ( iconNameC32 == null ) + return null; + else { + if( iconColor32 == null ) + iconColor32 = loadImage( iconNameC32 ); + return iconColor32; + } + case ICON_MONO_16x16: + if ( iconNameM16 == null ) + return null; + else { + if( iconMono16 == null ) + iconMono16 = loadImage( iconNameM16 ); + return iconMono16; + } + case ICON_MONO_32x32: + if ( iconNameM32 == null ) + return null; + else { + if( iconNameM32 == null ) + iconMono32 = loadImage( iconNameM32 ); + return iconMono32; + } + } + return null; + } + +} diff --git a/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCVNodeDisplayer.java b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCVNodeDisplayer.java new file mode 100644 index 000000000..489ef344e --- /dev/null +++ b/demos/qcdemo/com/SoftWoehr/JTOpenContrib/QCDemo/QCVNodeDisplayer.java @@ -0,0 +1,32 @@ +/* + * QCVNodeDisplayer.java + * + * Created on July 16, 2000, 2:03 AM + * + * This is free open source software distributed under the IBM Public License found + * on the World Wide Web at http://oss.software.ibm.com/developerworks/opensource/license10.html + * Copyright *C* 2000, Jack J. Woehr, PO Box 51, Golden, CO 80402-0051 USA jax@well.com + * Copyright *C* 2000, International Business Machines Corporation and others. All Rights Reserved. + */ + +package com.SoftWoehr.JTOpenContrib.QCDemo; + +/** Another interface substituting for dual inheritance in Java. This + * allows a little polymorphism with AS400 panes. + * @author jax + * @version 1.0 + */ +public interface QCVNodeDisplayer { + /** AS400 pane sets its root VNode. + * @param v The VNode with data for the view pane. + */ + public void setRoot(com.ibm.as400.vaccess.VNode v); + /** Add this AS400 pane to an AWT Component. + * @param c The Component to which this pane is to be added. + */ + public void addTo(java.awt.Container c); + /** Set the ErrorDialogAdapter handling errors for this AS400 pane. + * @param eda An ErrorDialogAdapter attached to Frame. + */ + public void addErrorListener(com.ibm.as400.vaccess.ErrorDialogAdapter eda); +} diff --git a/demos/qcdemo/html/images/QCCommandPanel.jpg b/demos/qcdemo/html/images/QCCommandPanel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8a963068640b02ee3d43072e048a23fdae193cd GIT binary patch literal 39546 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 e)?6SeP%N-7-mh5a2q(J3!?;QlB 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 literal 0 HcmV?d00001 diff --git a/demos/qcdemo/html/images/QCConnectionManagerViewer.jpg b/demos/qcdemo/html/images/QCConnectionManagerViewer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7dcf28830d0ed3822b1ffc45db16c5a3a2fecb1 GIT binary patch literal 37290 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 MXqX>8`?c_205Se9BLDyZ literal 0 HcmV?d00001 diff --git a/demos/qcdemo/html/images/QCIFSPanel.jpg b/demos/qcdemo/html/images/QCIFSPanel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..10b307ad271e08283b28bcab453abca57362c1a0 GIT binary patch literal 93920 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

0%%-Ty4$*MR`Fw4sE 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�qDNDrfRt{Xx#P1)gPHBy?*kDMzB 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 literal 0 HcmV?d00001 diff --git a/demos/qcdemo/html/images/QCPrinterListPanel.jpg b/demos/qcdemo/html/images/QCPrinterListPanel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bde1ee487bc19cabb30f9562b93c7933b67ead7d GIT binary patch literal 45057 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 literal 0 HcmV?d00001 diff --git a/demos/qcdemo/html/images/QCSQLQueryBuilderPanel.jpg b/demos/qcdemo/html/images/QCSQLQueryBuilderPanel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4ac6677a1ec8d895b5e42a34ed2646f3f7bf1e6f GIT binary patch literal 51594 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 literal 0 HcmV?d00001 diff --git a/demos/qcdemo/html/images/QCSQLResultFormPanel.jpg b/demos/qcdemo/html/images/QCSQLResultFormPanel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b8522a075069a7eaf4961d9016e6c9238c1c978e GIT binary patch literal 28370 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 literal 0 HcmV?d00001 diff --git a/demos/qcdemo/html/images/QCSQLResultTablePanel.jpg b/demos/qcdemo/html/images/QCSQLResultTablePanel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb02cf3512a725d4e568db9705f069e3d389a8f7 GIT binary patch literal 42768 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 aS`%ze@}rI_mx%2(0y?5E9KZbA!2bfAUehE1 literal 0 HcmV?d00001 diff --git a/demos/qcdemo/html/images/QCSpooledFilePanel.jpg b/demos/qcdemo/html/images/QCSpooledFilePanel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13ce1841fb2ec409c906846469684d0f9e01a344 GIT binary patch literal 62033 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 literal 0 HcmV?d00001 diff --git a/demos/qcdemo/html/images/QCUserListPanel.jpg b/demos/qcdemo/html/images/QCUserListPanel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2cea07679760da57c6ff7656137f0f551e65a2c1 GIT binary patch literal 31572 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 + + + + + + + SoftWoehr QCDemo + + + +

+

+SoftWoehr QCDemo

+ +
Copyright 2000, Jack +J. Woehr +
P.O. Box 51, Golden, Colorado 80402-0051
+ +

+Table of Contents

+ + + +

+About QCDemo

+QCDemo demonstrates using the AS/400 +Java Beans contained in the JTOpen +project to remotely connect to and explore your AS/400 midrange computer. +The name "QC" stands for Quatre Cent, i.e., 400 :-) +

QCDemo comes with full source code which is released under an open source +license so that you may modify it to use this source on your own project +if you find it useful or helpful. +

QCDemo is a tabbed notebook. Each tabbed page demostrates one or more +JTOpen beans. +

The QCDemo tabbed notebook was developed using Sun +Forte for Java. All the .form files which go with the Forte project +are included, but are not necessary to build and/or modify QCDemo for your +use. +

+DISCLAIMER

+USE AT YOUR OWN RISK. THERE IS NO GUARANTEE OR WARANTEE FOR THIS +FREE SOFTWARE. QCDemo can modify files and settings on any AS/400 +to which it is connected. To the best of our belief, it performs exactly +what you direct it to do, which is dangerous enough, isn't it? Other slightly +dangerous aspects of JTOpen itself include the following: +
    +
  • +Your logins are real AS400 logins!
  • + +
      +
    • +Three password failures and OS/400 may lock you out of your account until +QSECOFR deals with it.
    • +
    + +
  • +YOUR LOGINS ARE ENCRYPTED BUT YOUR DATA GO OVER THE NETWORK UNENCRYPTED.
  • + +
      +
    • +There is indeed a SecureAS400 component in the JTOpen toolkit, but your +author didn't use it in QCDemo.
    • +
    +
+ +

+Thanks!

+ The author thanks the International +Business Machines Corporation for participating in the open source +community and notes all the fine work done by open source enthusiasts both +working for IBM and as customers of IBM on so many IBM platforms. And thanks +to you for trying out QCDemo and reporting +any problems you find. +

Fairmount, Colorado July, 2000 + + diff --git a/demos/qcdemo/html/progman.html b/demos/qcdemo/html/progman.html new file mode 100644 index 000000000..eb8952150 --- /dev/null +++ b/demos/qcdemo/html/progman.html @@ -0,0 +1,91 @@ + + + + + + + + SoftWoehr QCDemo Programmer Manual + + + +

+

+SoftWoehr QCDemo Programmer +Manual

+ +
Copyright 2000, Jack J. Woehr +
P.O. Box 51, Golden, Colorado 80402-0051
+ +

+Table of Contents

+ + + +

+Overview

+The QCDemo classes in the package com.SoftWoehr.JTOpenContrib.QCDemo implement +the tabbed notebook described the QCDemo User Manual.  +All source is present alongside the classes in the qcdemo.jar +file; unpack the jar to see the source. +

Also present in the jar are the NetBeans +forms which were produced by the design tool. They are included for the +convenience of NetBeans/Sun Forte users, but are not necessary to compile, +modify or run the application. +

Source code documentation in Javadoc form +is also provided, though in some cases it is perfunctory. +

+Design +of the QCDemo package

+Well, it wasn't so much designed as it grew. The author was experimenting +with NetBeans and JTOpen +at the same time. One aspect of the current age of interactive development +environments is that in the MVC Model-View-Controller paradigm, the controller +tends to get shoved aside, chopped up and parcelled out between graphic +components. +

To some extent, we have tried to avoid this, but much more could be +and should have been done. Therefore, we do not present the application +architecture we have adopted in the course of this two-week programming +lark as representative of our thoughts on application architecture. There +is a QCMgr class which manages shared connections; it is simplistic but +correct as far as it goes. Contrarily, references to the JTOpen ErrorDialogAdapter +shared by all the QCDemo classes that use that facility are manually passed +from component to component at initialization rather than being mantained +by a manager class. +

We are more convinced than ever that +

    +
  • +Shared facilities should reside in a central manager.
  • + +
  • +References to the manager should be provided to the components.
  • + +
      +
    • +A simple way to do this is via static methods of the manager class which +maintain a vector of manager instances identified by some URL which +the clients can pass to obtain the original reference.
    • +
    + +
  • +Components should call public functions of the manager for services.
  • +
+Even in an IDE there is no problem in doing this, witness the QCMgr class +and supporting classes of QCDemo. However, IDE's tend to make it appear +simpler to skip this factoring out of the controller. We wish to assure +you that the savings only go as far as trivial applications the size of +QCDemo. Were this application to grow any larger, it would be necessary +to complete the postponed factoring. +

Fairmount, Colorado July, 2000 +
  + + diff --git a/demos/qcdemo/html/userman.html b/demos/qcdemo/html/userman.html new file mode 100644 index 000000000..99f0f7caf --- /dev/null +++ b/demos/qcdemo/html/userman.html @@ -0,0 +1,464 @@ + + + + + + + + SoftWoehr QCDemo User Manual + + + +

+

+SoftWoehr QCDemo User +Manual

+ +
Copyright 2000, Jack J. Woehr +
P.O. Box 51, Golden, Colorado 80402-0051
+ +

+Table of Contents

+ + + +

+DISCLAIMER

+USE AT YOUR OWN RISK. THERE IS NO GUARANTEE OR WARANTEE FOR THIS +FREE SOFTWARE. QCDemo can modify files and settings on any AS/400 +to which it is connected. To the best of our belief, it performs exactly +what you direct it to do, which is dangerous enough, isn't it? Other slightly +dangerous aspects of JTOpen itself include the following: +
    +
  • +Your logins are real AS400 logins!
  • + +
      +
    • +Three password failures and OS/400 may lock you out of your account until +QSECOFR deals with it.
    • +
    + +
  • +YOUR LOGINS ARE ENCRYPTED BUT YOUR DATA GO OVER THE NETWORK UNENCRYPTED.
  • + +
      +
    • +There is indeed a SecureAS400 component in the JTOpen toolkit, but your +author didn't use it in QCDemo.
    • +
    +
+ +

+System Requirements

+To run QCDemo you need the following which are not provided with QCDemo: +
    +
  • +The Java environment.
  • + +
      +
    • +We have only tested QCDemo on Java +1.3.
    • +
    + +
  • +IBM's JTOpen +toolkit for the AS/400.
  • + +
  • +An AS/400 which is accessible via TCP/IP from the machine on which QCDemo +runs.
  • + +
      +
    • +We have not tested QCDemo running on an AS/400 under the RemoteAWT.
    • +
    +
+ +

+Launching QCDemo

+Make sure the following are in your classpath, or add them via the -classpath +argument to the Java environment: +
    +
  • +The JTOpen jar file jt400.jar
  • + +
  • +The QCDemo jar file qcdemo.jar
  • +
+The main class of the QCDemo jar file is +
com.SoftWoehr.JTOpenContrib.QCDemo.QCDemo
+Enter a command appropriate to your installation to run the main class +of the QCDemo jar file, such as +
java com.SoftWoehr.JTOpenContrib.QCDemo.QCDemo
+ +

+General +Considerations

+QCDemo opens a window with a tabbed notebook in it. Each tab demonstrates +one or more beans from the JTOpen project and offers access to different +resources. The tabs should be self-explanatory. Use the widgets which the +tab pane presents to operate on your AS/400, or flip to another tab to +perform a different task. Please remember when you are connected to +your AS/400 that any changes you make using QCDemo are real! +

Each tab pane allows you to make a connection to an AS/400 independently +of the other tab panes. Thus, all the tab panes can be connected to the +same AS/400 or to different AS/400s. You can change the connection of any +page. Connections are managed centrally so that resources are used economically. +There is a tab pane for seeing the managed connections; its tab says "Connection +Manager". +

Help for using QCDemo is provided by this document and by flyover text +which pops up over different fields and buttons if you leave the mouse +pointer sitting over these fields and buttons for a few seconds. +

Much of the data returned by JT400 components is in the form of graphic +objects having their own popup menus. Try right-clicking on graphic objects +returned in the windows of QCDemo; often more information can be returned +and operations performed on the target AS400 in this fashion. +

+The Individual +Tabs

+There are currently ten (10) tabs to the QCDemo notebook. They are described +and illustrated below in their notebook order. +

+The Command +Tab

+The Command Tab illustrates JTOpen's AS400CommandButto and allows you to +execute a non-interactive command on the AS/400. You are informed of completion +of the command and any error messages are returned. +
    +
  1. +Enter the name of the server.
  2. + +
  3. +Press the Set System button.
  4. + +
  5. +Enter the command and press enter.
  6. + +
  7. +The command button is now set to the command and its legend changes.
  8. + +
  9. +Press the button to execute the command.
  10. + +
  11. +Wait for the completion message before continuing.
  12. +
+Below, the execution of a successful command is illustrated. +

QCDemo Command Tab +

Below, the execution of an unsuccessful command is illustrated. +

QCDemo Command Tab after a bad command +

+The IFS Tab

+The IFS Tab allows you to navigate the file system. Clicking on graphic +objects returned frequently returns more information. Please note that +while your author has set the hourglass "wait" cursor for the original +load of the IFS data, the returned graphic components don't do the same. +Therefore, if you click on an object and the window seems to lock up, it's +just the component fetching more data. +
    +
  1. +Enter the system name
  2. + +
  3. +Press the Set System button.
  4. + +
  5. +Enter the IFS path you wish to explore.
  6. + +
  7. +Press the Set IFS Path button.
  8. +
+You may also switch views between +
    +
  • +Explorer
  • + +
  • +Details
  • + +
  • +List
  • + +
  • +Tree
  • +
+views by using the clearly labeled buttons provided for this purpose. +

Below, a session with the IFS Tab in an explorer view is illustrated. +

+

+The User List +Tab

+The User List Tab returns a list of those users whose profiles you are +authorized to access on the server of your choice. +
    +
  1. +Enter the system name.
  2. + +
  3. +Press the Get User List button.
  4. +
+Below, a session with the User List Tab is illustrated. +

QCDemo User List Tab +

+The Job List +Tab

+The Job List Tab returns a list of active jobs you are authorized to access +on the server of your choice. +
    +
  1. +Enter the system name.
  2. + +
  3. +Enter the selection criteria or *ALL.
  4. + +
  5. +Press the Get User List button.
  6. +
+NOTE that if you ask for jobs you aren't authorized to see, you +may receive many, many error dialog popups, one after another, one or two +for each job! +

Below, a session with the Job List Tab is illustrated. +

QCDemo Job List Panel +

+The Printer +List Tab

+The Printer List Tab returns a list of printers and documents on the server +of your choice. +
    +
  1. +Enter the system name.
  2. + +
  3. +Enter the selection criteria or *ALL.
  4. + +
  5. +Press the Get Printer List button.
  6. +
+NOTE that this panel may come up with the separator bar all the +way over to the left hiding the printer list. Just grab the bar with the +mouse and slide it to the right. (See Bugs.) +

Click on a printer to see its documents. +

Below, a session with the Printer List Tab is illustrated. +

QCDemo Printer List Panel +

+The +Spooled File Viewer Tab

+The Spooled File Viewer Tab returns a printable WYSIWYG view of spooled +files on the server of your choice. +
    +
  1. +Enter the system name.
  2. + +
  3. +Enter the spooled file name.
  4. + +
  5. +Enter the spooled file number
  6. + +
  7. +Enter the job name which produced the spooled file.
  8. + +
  9. +Enter the user name which produced the spooled file.
  10. + +
  11. +Enter the job number which produced the spooled file.
  12. + +
  13. +Press the View Spool File button.
  14. +
+NOTE that since graphic data is transferred in this operation it +may take a bit of time. +

Below, a session with the Spooled File Viewer Tab is illustrated. +

QCDemo Spooled File Viewer Tab +

+The +SQL Query Builder Tab

+The SQL Query Builder Tab presents a JTOpen SQL Query Builder pane. You +can create SQL queries and execute them, sending the results to either +the SQL Result Table Tab or the +SQL +Result Form Tab. +
    +
  1. +Choose a driver from the radio buttons offered. The URL will then be partially +filled in by QCDemo.
  2. + +
      +
    • +If you choose "Custom" you must enter the full classname of the driver +you wish to load, as well as edit the JDBC URL to suit what that driver +expects.
    • + +
        +
      • +QCDemo assumes that the custom driver possesses a class static method which +will register the driver. QCDemo does not attempt to register the custom +driver.
      • +
      +
    + +
  3. +Finish the partial URL by adding the server name and any other JDBC URL +information such as
  4. + +
      +
    • +Database
    • + +
    • +Username
    • + +
    • +Password
    • +
    + +
  5. +Press the Connect Now button.
  6. + +
  7. +If you connect successfully, you are now ready to formulate queries.
  8. + +
      +
    • +See the JTOpen documentation for more information on using the SQL Query +Builder itself.
    • +
    + +
  9. +When you wish to execute the query, press either Do Query button depending +on which Result Tab you wish the results of your query to go to.
  10. + +
  11. +Flip to the Result Tab of your choice to see the results of your query.
  12. +
+Below, a session with SQL Query Builder Tab is illustrated. +

QCDemo SQL Query Builder Tab +

See also the SQL Result Table Tab +and SQL Result Form Tab. +

+The +SQL Result Table Tab

+The SQL Result Table Tab shows the results of using the SQL +Query Builder Tab in a table, as illustrated below. +

QCDemo SQL Query Result Table Tab +

+The +SQL Result Form Tab

+The SQL Result Table Tab shows the results of using the SQL +Query Builder Tab in a form, as illustrated below. +

QCDemo SQL Result Form Tab +

+The +Connection Manager Tab

+The Connection Manager Tab shows the QCDemo simple connection manager's +current status. This view does not update itself. You must push the Refresh +button to update the view. +

The display of the Connection Manager Tab is illustrated below. +

QCDemo Connection Manager Tab +

There is more information about the Connection Manager in the QCDemo +Programmer Manual. +

+Bugs

+ +
    +
  • +Your author has not really mastered window resizing issues with JTOpen +JavaBean component windows. With certain panels such as the IFS +Tab, when they load their data they occasionally resize themselves +so that either their draggable panel separator bar is over to one side +of the screen hiding the data, or they redraw a bit small. You can usually +straighten this effect out by moving separator bars with your mouse.
  • + +
  • +Some panels misbehave a bit if you fail to connect or if you repeatedly +do not log on correctly. Usually poking around with the mouse (not too +much or too rapidly!) and waiting a while will straighten this out.
  • + +
      +
    • +Some of the JTOpen components themselves are not terribly graceful about +a large number of errors, e.g., when you ask for a list of all jobs and +there are many jobs which you don't have authorization for. Try it yourself +if you are bored but patient!
    • +
    + +
  • +The connection manager is extremely simplistic and serves only as an illustration, +e.g.:
  • + +
      +
    • +It thinks AS400 and as400 are two different machines.
    • + +
    • +It may have the service names wrong for the services actually used.
    • +
    + +
  • +Your author was learning the Sun Forte IDE at the same time as experimenting +with JTOpen. You will notice some of the panels are better designed than +others. The better designed ones were done later in the week :-).
  • + +
  • +Please report other bugs you find to the author, Jack +J. Woehr (jax@well.com)
  • +
+Fairmount, Colorado July, 2000 + + diff --git a/demos/validationlist/com/kingland/as400/access/util/ChangeValidationListEntry.java b/demos/validationlist/com/kingland/as400/access/util/ChangeValidationListEntry.java new file mode 100644 index 000000000..705789d85 --- /dev/null +++ b/demos/validationlist/com/kingland/as400/access/util/ChangeValidationListEntry.java @@ -0,0 +1,114 @@ +package com.kingland.as400.access.util; + +import com.ibm.as400.access.*; +import com.kingland.as400.access.*; + +/** + * Copyright © 2001, International Business Machines Corporation and others. All Rights Reserved. + ** + *

+ * Example program to change the contents of an AS/400 validation list entry. + *

+ * Call syntax: ChangeValidationListEntry validationListPath ccsid + * oneWayEncrypted[*YES|*NO] entryID encryptedData unencryptedData + *
+ * Example: ChangeValidationListEntry /qsys.lib/qgpl.lib/test.vldl 37 *yes bob password data + * + * @author Thomas Johnson (tom.johnson@kingland.com), Kingland Systems Corporation + */ +public class ChangeValidationListEntry extends ValidationListUtil { + static final String COPYRIGHT = + "Copyright © 2001, International Business Machines Corporation and others. All Rights Reserved."; +/** + * Default constructor. + */ +private ChangeValidationListEntry() { + super(); +} +/** + * ChangeValidationListEntry constructor. + */ +public ChangeValidationListEntry(String vldlPath, int ccsid, boolean oneWayEncrypt) { + this(); + ccsid_ = ccsid; + oneWayEncrypt_ = oneWayEncrypt; + vldl_ = new ValidationList( + getAS400(), new QSYSObjectPathName(vldlPath)); +} + +/** + * Starts the application. + * @param args an array of command-line arguments + */ +public static void main(java.lang.String[] args) { + // Check for correct number of arguments + if (args.length < 6) { + syntaxNotCorrect(); + return; + } + try { + // Run the app + new ChangeValidationListEntry( args[0], new Integer(args[1]).intValue(), !args[2].equalsIgnoreCase("*NO") + ).chgwebusr( + args[3], + args[4], + args[5]); + } catch (Exception e) { + e.printStackTrace(); + } finally { + System.exit(0); + } +} +/** + * Displays output indicating the expected syntax. + */ +private static void syntaxNotCorrect() { + System.out.println(""); + System.out.println("Parameters are not correct. Expected syntax is:"); + System.out.println(""); + System.out.println("ChangeValidationListUser validationListPath oneWayEncrypted[*YES|*NO] ccsid "+ + "entryID encryptedData unencryptedData"); + System.out.println(""); + System.out.println("For example:"); + System.out.println(""); + System.out.println(" ChangeValidationListUser /qsys.lib/qgpl.lib/test.vldl 37 *yes bob password newData"); + System.out.println(""); + System.out.println(""); +} + +/** + * Services the request. + * + * @param id + * The entry ID to change. + * @param pwd + * The new encrypted data. + * @param data + * The new unencrypted data. + */ +protected void chgwebusr(String id, String pwd, String data) { + ValidationListEntry vle = new ValidationListEntry(); + + try { + // Assign the entry ID + vle.setEntryID( + new ValidationListTranslatedData(id, ccsid_, getAS400())); + // Assign the encrypted data (i.e. password) + vle.setDataToEncrypt( + new ValidationListDataToEncrypt(pwd, ccsid_, getAS400())); + // Assign the attribute indicating one or two-way encryption + vle.setAttributeInfo( + new ValidationListAttributeInfo( + new ValidationListAttribute[] + { getEncryptAttribute() })); + // Assign the unencrypted data + vle.setUnencryptedData( + new ValidationListTranslatedData(data, ccsid_, getAS400())); + // Perform the change + vldl_.changeEntry(vle); + } + catch (PersistenceException pe) { + pe.printStackTrace(); + } +} +} \ No newline at end of file diff --git a/demos/validationlist/com/kingland/as400/access/util/CompareValidationListEntries.java b/demos/validationlist/com/kingland/as400/access/util/CompareValidationListEntries.java new file mode 100644 index 000000000..edb33c2c0 --- /dev/null +++ b/demos/validationlist/com/kingland/as400/access/util/CompareValidationListEntries.java @@ -0,0 +1,156 @@ +package com.kingland.as400.access.util; + +import com.ibm.as400.access.*; +import com.kingland.as400.access.*; +import java.util.*; + +/** + * Copyright © 2001, International Business Machines Corporation and others. All Rights Reserved. + ** + *

+ * Example program to compare the contents of two AS/400 validation lists. + * Differences are printed to standard output. + *

+ * Call syntax: CompareValidationListEntries validationListPath1 validationListPath2 + *
+ * Example: CompareValidationListEntries /qsys.lib/qgpl.lib/test1.vldl /qsys.lib/qgpl.lib/test2.vldl + * + * @author Thomas Johnson (tom.johnson@kingland.com), Kingland Systems Corporation + */ +public class CompareValidationListEntries extends ValidationListUtil { + static final String COPYRIGHT = + "Copyright © 2001, International Business Machines Corporation and others. All Rights Reserved."; +/** + * Default constructor. + */ +public CompareValidationListEntries() { + super(); +} +/** + * Print a list of differences (ids & non-encrypted data) to System.out + */ +public void compare(String vldlPath1, String vldlPath2) { + AS400 as400 = getAS400(); + ValidationList vl1 = new ValidationList(as400, new QSYSObjectPathName(vldlPath1)); + ValidationList vl2 = new ValidationList(as400, new QSYSObjectPathName(vldlPath2)); + + ValidationListEntry vle1, vle2; + ValidationListEntry[] entries1, entries2 = new ValidationListEntry[0]; + Hashtable vl2Hash = null; + + // Cumulative statistics + int addCount = 0; + int deleteCount = 0; + int changeCount = 0; + + try { + // Print report header + System.out.println("*** Comparing source... "+vldlPath1); + System.out.println("*** To target ......... "+vldlPath2); + System.out.println(); + + // Retrieve all entries for each list + entries1 = vl1.getEntries(); + entries2 = vl2.getEntries(); + + System.out.println(" Source contains "+entries1.length+" entries..."); + System.out.println(" Target contains "+entries2.length+" entries..."); + System.out.println(); + + // Create a hash from the target list, keyed on ID + vl2Hash = new Hashtable(); + for (int i=0; i + * Example program to delete a specific entry from a validation list. + *

+ * Call syntax: DeleteValidationListEntry validationListPath ccsid entryID + *
+ * Example: DeleteValidationListEntry /qsys.lib/qgpl.lib/test.vldl 37 bob + * + * @author Thomas Johnson (tom.johnson@kingland.com), Kingland Systems Corporation + */ +public class DeleteValidationListEntry extends ValidationListUtil { + static final String COPYRIGHT = + "Copyright © 2001, International Business Machines Corporation and others. All Rights Reserved."; +/** + * Default constructor. + */ +private DeleteValidationListEntry() { + super(); +} +/** + * DeleteValidationListEntry constructor. + */ +public DeleteValidationListEntry(String vldlPath, int ccsid) { + this(); + ccsid_ = ccsid; + vldl_ = new ValidationList( + getAS400(), new QSYSObjectPathName(vldlPath)); +} + +/** + * Starts the application. + * @param args an array of command-line arguments + */ +public static void main(java.lang.String[] args) { + // Check for correct number of arguments + if (args.length < 3) { + syntaxNotCorrect(); + return; + } + try { + // Run the app + new DeleteValidationListEntry( args[0], new Integer(args[1]).intValue() + ).dltEntry(args[2]); + } catch (Exception e) { + e.printStackTrace(); + } finally { + System.exit(0); + } +} +/** + * Displays output indicating the expected syntax. + */ +private static void syntaxNotCorrect() { + System.out.println(""); + System.out.println("Parameters are not correct. Expected syntax is:"); + System.out.println(""); + System.out.println("DeleteValidationListEntry validationListPath ccsid entryID"); + System.out.println(""); + System.out.println("For example:"); + System.out.println(""); + System.out.println(" DeleteValidationListEntry /qsys.lib/qgpl.lib/test.vldl 37 bob"); + System.out.println(""); + System.out.println(""); +} + +/** + * Services the request. + * + * @param id + * The ID of the entry to delete. + */ +protected void dltEntry(String id) { + try { + ValidationListEntry entry = new ValidationListEntry(); + entry.setEntryID( + new ValidationListTranslatedData(id, ccsid_, getAS400())); + vldl_.removeEntry(entry); + } + catch (PersistenceException pe) { + pe.printStackTrace(); + } +} +} \ No newline at end of file diff --git a/demos/validationlist/com/kingland/as400/access/util/InsertValidationListEntry.java b/demos/validationlist/com/kingland/as400/access/util/InsertValidationListEntry.java new file mode 100644 index 000000000..5fe3ab250 --- /dev/null +++ b/demos/validationlist/com/kingland/as400/access/util/InsertValidationListEntry.java @@ -0,0 +1,114 @@ +package com.kingland.as400.access.util; + +import com.ibm.as400.access.*; +import com.kingland.as400.access.*; + +/** + * Copyright © 2001, International Business Machines Corporation and others. All Rights Reserved. + ** + *

+ * Example program to insert an AS/400 validation list entry. + *

+ * Call syntax: InsertValidationListEntry validationListPath ccsid + * oneWayEncrypted[*YES|*NO] entryID encryptedData unencryptedData + *
+ * Example: InsertValidationListEntry /qsys.lib/qgpl.lib/test.vldl 37 *yes bob password data + * + * @author Thomas Johnson (tom.johnson@kingland.com), Kingland Systems Corporation + */ +public class InsertValidationListEntry extends ValidationListUtil { + static final String COPYRIGHT = + "Copyright © 2001, International Business Machines Corporation and others. All Rights Reserved."; +/** + * Default constructor. + */ +private InsertValidationListEntry() { + super(); +} +/** + * InsertValidationListEntry constructor. + */ +public InsertValidationListEntry(String vldlPath, int ccsid, boolean oneWayEncrypt) { + this(); + ccsid_ = ccsid; + oneWayEncrypt_ = oneWayEncrypt; + vldl_ = new ValidationList( + getAS400(), new QSYSObjectPathName(vldlPath)); +} + +/** + * Starts the application. + * @param args an array of command-line arguments + */ +public static void main(java.lang.String[] args) { + // Check for correct number of arguments + if (args.length < 6) { + syntaxNotCorrect(); + return; + } + try { + // Run the app + new InsertValidationListEntry( args[0], new Integer(args[1]).intValue(), !args[2].equalsIgnoreCase("*NO") + ).addwebusr( + args[3], + args[4], + args[5]); + } catch (Exception e) { + e.printStackTrace(); + } finally { + System.exit(0); + } +} +/** + * Displays output indicating the expected syntax. + */ +private static void syntaxNotCorrect() { + System.out.println(""); + System.out.println("Parameters are not correct. Expected syntax is:"); + System.out.println(""); + System.out.println("InsertValidationListEntry validationListPath oneWayEncrypted[*YES|*NO] ccsid "+ + "entryID encryptedData unencryptedData"); + System.out.println(""); + System.out.println("For example:"); + System.out.println(""); + System.out.println(" InsertValidationListEntry /qsys.lib/qgpl.lib/test.vldl 37 *yes bob password data"); + System.out.println(""); + System.out.println(""); +} + +/** + * Services the request. + * + * @param id + * The entry ID to add. + * @param pwd + * The encrypted data. + * @param data + * The unencrypted data. + */ +protected void addwebusr(String id, String pwd, String data) { + ValidationListEntry vle = new ValidationListEntry(); + + try { + // Assign the entry ID + vle.setEntryID( + new ValidationListTranslatedData(id, ccsid_, getAS400())); + // Assign the encrypted data (i.e. password) + vle.setDataToEncrypt( + new ValidationListDataToEncrypt(pwd, ccsid_, getAS400())); + // Assign the attribute indicating one or two-way encryption + vle.setAttributeInfo( + new ValidationListAttributeInfo( + new ValidationListAttribute[] + { getEncryptAttribute() })); + // Assign the unencrypted data + vle.setUnencryptedData( + new ValidationListTranslatedData(data, ccsid_, getAS400())); + // Perform the add + vldl_.addEntry(vle); + } + catch (PersistenceException pe) { + pe.printStackTrace(); + } +} +} \ No newline at end of file diff --git a/demos/validationlist/com/kingland/as400/access/util/ListValidationListEntries.java b/demos/validationlist/com/kingland/as400/access/util/ListValidationListEntries.java new file mode 100644 index 000000000..f56dc6965 --- /dev/null +++ b/demos/validationlist/com/kingland/as400/access/util/ListValidationListEntries.java @@ -0,0 +1,95 @@ +package com.kingland.as400.access.util; + +import com.ibm.as400.access.*; +import com.kingland.as400.access.*; + +/** + * Copyright © 2001, International Business Machines Corporation and others. All Rights Reserved. + ** + *

+ * Example program to list the entries in an AS/400 validation list. + *

+ * Call syntax: ListValidationListEntries validationListPath + *
+ * Example: ListValidationListEntries /qsys.lib/qgpl.lib/test.vldl + * + * @author Thomas Johnson (tom.johnson@kingland.com), Kingland Systems Corporation + */ +public class ListValidationListEntries extends ValidationListUtil { + static final String COPYRIGHT = + "Copyright © 2001, International Business Machines Corporation and others. All Rights Reserved."; +/** + * Default constructor. + */ +public ListValidationListEntries() { + super(); +} +/** + * Print a list of entries (ids & non-encrypted data) to System.out + */ +public void displayEntries(String vldlPath) { + AS400 as400 = getAS400(); + ValidationList vl = new ValidationList(as400, new QSYSObjectPathName(vldlPath)); + ValidationListEntry vle; + ValidationListEntry[] entries = new ValidationListEntry[0]; + + try { + // Print report header + System.out.println("*** Listing source... "+vldlPath); + // Retrieve all entries + entries = vl.getEntries(); + System.out.println(" Source contains "+entries.length+" entries..."); + System.out.println(); + + // Now run through the list and display + String id; + for (int i=0; i"+id+" "); + System.out.print("Unencrypted data==>"+entries[i].getUnencryptedData().getString(as400)); + System.out.println(); + } catch (Exception e) { + System.out.println(e); + } + } + } catch (Exception e) { + e.printStackTrace(); + } +} +/** + * Starts the application. + * @param args an array of command-line arguments + */ +public static void main(java.lang.String[] args) { + // Check for correct number of arguments + if (args.length < 1) { + syntaxNotCorrect(); + return; + } + try { + // Run the app + new ListValidationListEntries().displayEntries(args[0]); + } catch (Exception e) { + e.printStackTrace(); + } finally { + System.exit(0); + } +} +/** + * Displays output indicating the expected syntax. + */ +private static void syntaxNotCorrect() { + System.out.println(""); + System.out.println("Parameters are not correct. Expected syntax is:"); + System.out.println(""); + System.out.println(" ListValidationListEntries validationListPath"); + System.out.println(""); + System.out.println("For example:"); + System.out.println(""); + System.out.println(" ListValidationListEntries /qsys.lib/qgpl.lib/test.vldl"); + System.out.println(""); + System.out.println(""); +} +} \ No newline at end of file diff --git a/demos/validationlist/com/kingland/as400/access/util/RetrieveValidationListEntryEncryptedData.java b/demos/validationlist/com/kingland/as400/access/util/RetrieveValidationListEntryEncryptedData.java new file mode 100644 index 000000000..0258cd957 --- /dev/null +++ b/demos/validationlist/com/kingland/as400/access/util/RetrieveValidationListEntryEncryptedData.java @@ -0,0 +1,94 @@ +package com.kingland.as400.access.util; + +import com.ibm.as400.access.*; +import com.kingland.as400.access.*; + +/** + * Copyright © 2001, International Business Machines Corporation and others. All Rights Reserved. + ** + *

+ * Example program to retrieve and display the encrypted information stored + * in a validation list entry. + *

+ * Note: Encrypted information cannot be retrieved if one-way encrypted on insertion into + * the validation list. + *

+ * Call syntax: RetrieveValidationListEntryEncryptedData validationListPath ccsid entryID + *
+ * Example: RetrieveValidationListEntryEncryptedData /qsys.lib/qgpl.lib/test.vldl 37 bob + * + * @author Thomas Johnson (tom.johnson@kingland.com), Kingland Systems Corporation + */ +public class RetrieveValidationListEntryEncryptedData { + static final String COPYRIGHT = + "Copyright © 2001, International Business Machines Corporation and others. All Rights Reserved."; +/** + * Default constructor. + */ +public RetrieveValidationListEntryEncryptedData() { + super(); +} + +/** + * Starts the application. + * @param args an array of command-line arguments + */ +public static void main(java.lang.String[] args) { + // Check for correct number of arguments + if (args.length < 3) { + syntaxNotCorrect(); + return; + } + try { + // Run the app + new RetrieveValidationListEntryEncryptedData().findEntry( + args[0], + new Integer(args[1]).intValue(), + args[2]); + } catch (Exception e) { + e.printStackTrace(); + } finally { + System.exit(0); + } +} +/** + * Displays output indicating the expected syntax. + */ +private static void syntaxNotCorrect() { + System.out.println(""); + System.out.println("Parameters are not correct. Expected syntax is:"); + System.out.println(""); + System.out.println(" RetrieveValidationListEntryEncryptedData validationListPath ccsid entryID"); + System.out.println(""); + System.out.println("For example:"); + System.out.println(""); + System.out.println(" RetrieveValidationListEntryEncryptedData /qsys.lib/qgpl.lib/test.vldl 37 bob"); + System.out.println(""); + System.out.println(""); +} + +/** + * Find & print the entry (id & encrypted data) to System.out + */ +public void findEntry(String vldlPath, int ccsid, String id) { + AS400 as400 = new AS400(); + ValidationList vldl = new ValidationList(as400, new QSYSObjectPathName(vldlPath)); + + ValidationListAttributeData attrData = new ValidationListAttributeData(); + attrData.setCcsid(-1); + attrData.setBytes(new AS400Text(1, 65535, as400).toBytes("1")); + + ValidationListAttribute[] attrs = new ValidationListAttribute[1]; + ValidationListAttribute attr = new ValidationListAttribute(as400); + attr.setIdentifier("QsyEncryptData"); + attrs[0] = attr; + + try { + ValidationListEntry entry = vldl.findEntry(id, ccsid, attrs); + System.out.println("Encrypted data==>"+entry.getEncryptedData().getString(as400)); + } catch (Exception e) { + System.out.println("Encrypted data not retrieved."); + e.printStackTrace(); + } +} +} \ No newline at end of file diff --git a/demos/validationlist/com/kingland/as400/access/util/ValidationListUtil.java b/demos/validationlist/com/kingland/as400/access/util/ValidationListUtil.java new file mode 100644 index 000000000..4434217c5 --- /dev/null +++ b/demos/validationlist/com/kingland/as400/access/util/ValidationListUtil.java @@ -0,0 +1,58 @@ +package com.kingland.as400.access.util; + +import com.ibm.as400.access.*; +import com.kingland.as400.access.*; + +/** + * Copyright © 2001, International Business Machines Corporation and others. All Rights Reserved. + ** + *

+ * Abstract superclass for validation list utilities & examples. + * + * @author Thomas Johnson (tom.johnson@kingland.com), Kingland Systems Corporation + */ +abstract class ValidationListUtil { + static final String COPYRIGHT = + "Copyright © 2001, International Business Machines Corporation and others. All Rights Reserved."; + + protected int ccsid_ = 37; + protected ValidationList vldl_ = null; + protected boolean oneWayEncrypt_ = true; + + protected AS400 as400_ = null; + +/** + * Return the AS/400 system object. + * @return com.ibm.as400.access.AS400 + */ +protected AS400 getAS400() { + if (as400_ == null) + as400_ = new AS400(); + return as400_; +} + +/** + * Returns a QsyEncryptData attribute based on the oneWayEncrypt_ field. + *

+ * When the attribute value is '0', the encrypted data (i.e. password) cannot be retrieved. + *

+ * Note: The system value QRETSVRSEC (Retain server security data) still has the final say + * in determining if the original data is allowed to be stored with the entry. + * + * @return + * com.kingland.as400.access.ValidationListAttribute + */ +protected ValidationListAttribute getEncryptAttribute() { + ValidationListAttribute attr = null; + + attr = new ValidationListAttribute(getAS400()); + attr.setIdentifier("QsyEncryptData"); + ValidationListAttributeData attrData = new ValidationListAttributeData(); + attrData.setCcsid(-1); + attrData.setBytes(new AS400Text(1, 65535, getAS400() + ).toBytes(oneWayEncrypt_ ? "0" : "1")); + attr.setData(attrData); + + return attr; +} +} \ No newline at end of file