home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / VSCPPv7.zip / VACPP / IBMCPP / smarts / ICLUI / ICLUI.CPP < prev    next >
Text File  |  1995-06-02  |  17KB  |  493 lines

  1.  
  2. %PROLOG%
  3.  
  4. /* UI Class Library headers */
  5. #include <iaccel.hpp>
  6. #include <ititle.hpp>
  7. #include <iapp.hpp>
  8. #include <iinfoa.hpp>
  9. #include <ifont.hpp>
  10. #include <ithread.hpp>
  11. #include <ifiledlg.hpp>
  12. #include <imsgbox.hpp>
  13. #include <ihelp.hpp>
  14. #include <iexcept.hpp>
  15.  
  16. /* OS/2 Headers */
  17. #define INCL_DOSERRORS
  18. #define INCL_WINHELP        //  For HM_TUTORIAL message
  19. #include <os2.h>
  20.  
  21. /* Application headers */
  22. #include "openfile.hpp"
  23. #include "prodinfo.hpp"
  24. #include "msgbox.hpp"
  25. #include "%FILE_NAME%.h"
  26. #include "%FILE_NAME%.hpp"
  27.  
  28.  
  29. /**************************************************************/
  30. /* main() program entry point                                 */
  31. /**************************************************************/
  32. void main()
  33. {
  34.    AppWindow appWindow(IDW_FRAME_WINDOW);
  35.    IApplication::current().run();
  36. }
  37.  
  38.  
  39. /**************************************************************/
  40. /* Application main window constructor.  Sets events handler, */
  41. /* icon, window style and menu bar.  It also sets static text */
  42. /* as the client area control.  You may want to set           */
  43. /**************************************************************/
  44. AppWindow :: AppWindow(unsigned long windowId)
  45.    : IFrameWindow( IFrameWindow::defaultStyle() |   // Create frame window in default style
  46.                    IFrameWindow::accelerator,    
  47.                    windowId), 
  48.      canvas(ID_CANVAS,this,this),            // Create canvas for client area
  49.      menuBar(this),                          // Create menu bar
  50.      openFileName(EMPTY_STRING),             // No file open yet
  51.      hasHelp(true),                          // Assume help is available for now
  52.      statusLine (IDT_STATUS_LINE,this,this)  // Create status line
  53. {
  54.  
  55.    // Set up status line
  56.    statusLine.setText( IDS_GENERAL_DESC);             // Set status line text
  57.    addExtension(&statusLine,                          // Extend client window by
  58.                 IFrameWindow::belowClient,            // placing status area below 
  59.                 (IFont(&statusLine).maxCharHeight() + 3));
  60.  
  61.    // Set up menu bar
  62.    menuBar.setMenu( IResourceId(IDW_FRAME_WINDOW));  
  63.  
  64.    // Set up client area canvas
  65.    setClient(&canvas);       // Set canvas control for client area
  66.  
  67.    // Set self as command event handler
  68.    ICommandHandler::handleEventsFor(this);
  69.  
  70.    // Set application icon
  71.    setIcon(IDI_ICON);     
  72.  
  73.    try
  74.    {
  75.      // Set up help, help settings
  76.      IHelpWindow::Settings helpSettings;
  77.      helpSettings.setMenuBar(IDM_HELP);
  78.      helpSettings.setTutorial(TUTORIAL_FILE);
  79.      helpSettings.setTitle(IDS_HELP_TITLE);
  80.      helpSettings.setHelpTable(IDH_MAIN_HELPTABLE);
  81.      helpSettings.setLibraries(HELP_FILE_NAME);
  82.      help = new IHelpWindow(helpSettings,this);
  83.  
  84.      // Create and set help event handler
  85.      helpHdlr = new AppHelpHandler;
  86.      helpHdlr->handleEventsFor(this);
  87.    }
  88.    catch( IAccessError &exc )
  89.    {
  90.       // Send this window an event indicating that the help could not be loaded
  91.       IEventParameter1 evtParm1( UM_NOHELP );
  92.       this->postEvent( IWindow::command, evtParm1);
  93.       // Set internal help flag to indicate that no help is available
  94.       hasHelp = false;
  95.    }
  96.  
  97.    // Set focus to this window and show
  98.    setFocus();               
  99.    show();                  
  100. }
  101.  
  102.  
  103. /***********************************************************/
  104. /* Application main window destructor.  It stops the event */
  105. /* handling and deletes any objects on the heap.           */
  106. /***********************************************************/
  107. AppWindow :: ~AppWindow ()
  108. {
  109.    ICommandHandler::stopHandlingEventsFor(this);
  110.    helpHdlr->stopHandlingEventsFor(this);
  111.    if (hasHelp) 
  112.    {
  113.       delete help;
  114.       delete helpHdlr;
  115.    }
  116. }
  117.  
  118.  
  119. /***********************************************************/
  120. /* AppWindow main window command event handler             */
  121. /***********************************************************/
  122. Boolean AppWindow :: command(ICommandEvent &cmdEvent)
  123.  {
  124.    IResourceLibrary  resLib;
  125.    IThread*          openThread;
  126.    IThreadFn*        openFn;
  127.  
  128.  
  129.    switch (cmdEvent.commandId()) 
  130.    {
  131.       case IDM_FILE_OPEN:
  132.        {
  133.         /*-------------------------------------------------------------*/
  134.         /* When the user selects the File->Open menu item to open a    */
  135.         /* file, display the standard "File open" dialog using         */
  136.         /* IFileDialog.  The dialog is set to its most previous        */
  137.         /* values.  Then, a thread is started to open the file and     */
  138.         /* and perform any other application-specific file processing. */
  139.         /*-------------------------------------------------------------*/
  140.  
  141.          IFileDialog::Settings fdSettings;  // Create file dialog settings object
  142.          fdSettings.setOpenDialog();
  143.          fdSettings.setOKButtonText(IResourceId(IDS_OPEN));
  144.          fdSettings.setTitle(IResourceId(IDS_FILE_OPEN));
  145.          if ( isFileOpen() )
  146.             fdSettings.setFileName("*.*");
  147.          else 
  148.             fdSettings.setFileName(openFileName);
  149.  
  150.          // Create and associate file dialog help handler. Pass the
  151.          // help panel resource ID for "File open".
  152.          FileDlgHelpHandler fdHelpHdlr ( help, IDH_FILEOPEN_RESNO );
  153.          fdHelpHdlr.handleEventsFor(this);
  154.  
  155.          // Create and show File open dialog 
  156.          IFileDialog fileDlg (desktopWindow(),         // Parent is desktop
  157.                               this,                    // Owner is main window
  158.                               IFileDialog::helpButton, // Help button style
  159.                               fdSettings);             // Here are my settings
  160.  
  161.          // Stop special file dialog help handler
  162.          fdHelpHdlr.stopHandlingEventsFor(this);
  163.  
  164.          // Check results
  165.          if ( fileDlg.pressedOK() )
  166.           {
  167.             openFileName = fileDlg.fileName();         // Store selected file name
  168.  
  169.             // Create secondary thread to handle file open operation 
  170.             openFn = new AppOpenFileFn(this);
  171.             openThread = new IThread(openFn);
  172.  
  173.           } 
  174.  
  175.          return true;
  176.        }
  177.  
  178.  
  179.       case IDM_FILE_SAVE:
  180.        {
  181.          // Write to status area
  182.          IString tmpText = resLib.loadString(IDS_SAVE_FILE);
  183.          tmpText.change( "%s", 
  184.                          openFileName,            
  185.                          1, 1);
  186.          writeStatus (tmpText);
  187.          return true;
  188.        }
  189.  
  190.  
  191.       case IDM_FILE_SAVEAS:
  192.        {
  193.         /*-------------------------------------------------------------*/
  194.         /* When the user selects the "File->Save as" menu item,        */
  195.         /* display the standard "Save as" dialog using IFileDialog.    */
  196.         /* Use the IFileDialog::Settings class to specify initial      */
  197.         /* settings, such as the currently open file.                  */
  198.         /*-------------------------------------------------------------*/
  199.  
  200.          // Check if there is a file open and report error or write status
  201.          if (writeStatus (IResourceId(IDS_SAVEAS)))
  202.           {
  203.             // Specify Save as dialog settings
  204.             IFileDialog::Settings fdSettings;  
  205.             fdSettings.setFileName(openFileName);
  206.             fdSettings.setSaveAsDialog();
  207.             fdSettings.setOKButtonText(IResourceId(IDS_SAVEAS));
  208.             fdSettings.setTitle(IResourceId(IDS_SAVEAS));
  209.             
  210.             // Create and associate file dialog help handler. Pass the
  211.             // help panel resource ID for "Save as".
  212.             FileDlgHelpHandler fdHelpHdlr ( help, IDH_SAVEAS_RESNO );
  213.             fdHelpHdlr.handleEventsFor(this);
  214.  
  215.             // Create and show Save as dialog 
  216.             IFileDialog fileDlg (desktopWindow(),         // Parent is desktop
  217.                                  this,                    // Owner is main window
  218.                                  IFileDialog::helpButton, // Help button style
  219.                                  fdSettings);             // Here are my settings
  220.             
  221.             // Stop special file dialog help handler
  222.             fdHelpHdlr.stopHandlingEventsFor(this);
  223.  
  224.             // Check results
  225.             if (fileDlg.pressedOK()) 
  226.              {
  227.                /*================================================*/
  228.                /* Place processing to save file here.            */
  229.                /*================================================*/
  230.             
  231.                // Display status 
  232.                IString tmpStatus = resLib.loadString(IDS_FILE_SAVED);
  233.                tmpStatus.change( "%s", 
  234.                                  fileDlg.fileName(), 
  235.                                  1, 1);
  236.                writeStatus (tmpStatus);
  237.              }  
  238.           }  // endif   
  239.             
  240.          return true;
  241.        } 
  242.  
  243.  
  244.      case IDM_FILE_PRINT:
  245.       { 
  246.          // Write to status area
  247.          IString tmpText = resLib.loadString(IDS_PRINT_FILE);
  248.          tmpText.change( "%s", 
  249.                          openFileName,            
  250.                          1, 1);
  251.          writeStatus (tmpText);
  252.          return true;
  253.        } 
  254.  
  255.       case IDM_FILE_CLOSE:
  256.        {
  257.          // Display "Are you sure" message box
  258.          IMessageBox closeMsg(this);
  259.          closeMsg.setTitle( IResourceId(IDW_FRAME_WINDOW));  // Title is application title
  260.          IMessageBox::Response msgRC;
  261.          msgRC = closeMsg.show( IResourceId(IDS_EXIT), 
  262.                         IMessageBox::yesNoButton      | 
  263.                         IMessageBox::defButton1       | 
  264.                         IMessageBox::queryIcon        |
  265.                         IMessageBox::applicationModal |
  266.                         IMessageBox::moveable);
  267.  
  268.  
  269.          if (msgRC == IMessageBox::yes)  // If user responded yes, close window
  270.              close();
  271.          return true;
  272.        }
  273.  
  274.       case IDM_EDIT_UNDO:
  275.          // do item action
  276.          writeStatus (IResourceId(IDS_UNDO));
  277.          return true;
  278.  
  279.       case IDM_EDIT_COPY:
  280.          // do item action
  281.          writeStatus (IResourceId(IDS_COPY));
  282.          return true;
  283.  
  284.       case IDM_EDIT_CUT:
  285.          // do item action
  286.          writeStatus (IResourceId(IDS_CUT));
  287.          return true;
  288.  
  289.       case IDM_EDIT_PASTE:
  290.          // do item action
  291.          writeStatus (IResourceId(IDS_PASTE));
  292.          return true;
  293.  
  294.       case IDM_EDIT_FIND:
  295.          // do item action
  296.          writeStatus (IResourceId(IDS_FIND));
  297.          return true;
  298.  
  299.       case IDM_EDIT_FINDNEXT:
  300.          // do item action
  301.          writeStatus (IResourceId(IDS_FINDNEXT));
  302.          return true;
  303.  
  304.  
  305.       case IDM_HELP_USING:
  306.          // Show IPF Using Help panel
  307.          if (hasHelp) 
  308.            help->show(IHelpWindow::using);
  309.          writeStatus (IResourceId(IDS_HELP_USING), true);
  310.          return true;
  311.  
  312.  
  313.       case IDM_HELP_TUTORIAL:
  314.          // Send message to help handler
  315.          cmdEvent.window()->sendEvent( HM_TUTORIAL );
  316.          writeStatus (IResourceId(IDS_HELP_TUTORIAL), true);
  317.          return true;
  318.  
  319.  
  320.       case IDM_HELP_PRODINFO:
  321.          // Show product information dialog
  322.          productInfo();
  323.          writeStatus (IResourceId(IDS_HELP_PRODINFO), true);
  324.          return true;
  325.  
  326.       case UM_NOHELP:
  327.        {
  328.          // Tell user help could not be loaded then continue
  329.          IMessageBox errorMsg( this );
  330.          errorMsg.setTitle( IResourceId(IDW_FRAME_WINDOW));
  331.          errorMsg.show( IResourceId(IDS_ERROR_NO_HELP),
  332.                         IMessageBox::catastrophic);
  333.        }
  334.  
  335.  
  336.    } /* end switch */
  337.    return false;
  338. }
  339.  
  340.  
  341.  
  342.  
  343. /*********************************************************************/
  344. /* This productInfo function displays the product information dialog */
  345. /*********************************************************************/
  346. void AppWindow :: productInfo()
  347. {
  348.    unsigned short rc;      // Return value from show dialog
  349.  
  350.    ProdInfoDialog *prodInfo = new ProdInfoDialog(this);
  351.    prodInfo->showModally();
  352.    rc = prodInfo->result();       //Get result (eg OK or Cancel)         .
  353.    delete prodInfo;
  354. }
  355.  
  356.  
  357. /***********************************************************/
  358. /* This function writes the argument resource string onto  */
  359. /* the status area.                                        */
  360. /***********************************************************/
  361. Boolean AppWindow :: writeStatus(const IResourceId status,  
  362.                                  const Boolean isHelpCmd)
  363. {
  364.   IResourceLibrary resLib;
  365.  
  366.   /*---------------------------------------------------------------------------*/
  367.   /* If the selected command is a help command, write the text unconditionally.*/
  368.   /* Otherwise, check first whether a file has been loaded before writing the  */
  369.   /* text.  Display an error message if no file has been loaded.               */
  370.   /*---------------------------------------------------------------------------*/
  371.  
  372.    // Call overloaded writeStatus() function with translated status string
  373.    return writeStatus (resLib.loadString(status), isHelpCmd);
  374. }
  375.  
  376.  
  377. /***********************************************************/
  378. /* This function writes the argument string onto the       */
  379. /* status area.                                            */
  380. /***********************************************************/
  381. Boolean AppWindow :: writeStatus(const IString &status,
  382.                                  const Boolean isHelpCmd)
  383. {
  384.   /*---------------------------------------------------------------------------*/
  385.   /* If the selected command is a help command, write the text unconditionally.*/
  386.   /* Otherwise, check first whether a file has been loaded before writing the  */
  387.   /* text.  Display an error message if no file has been loaded.               */
  388.   /*---------------------------------------------------------------------------*/
  389.    if (!isHelpCmd && isFileOpen())
  390.     {
  391.       /* Display "Error: no file open" message box */
  392.       AppMessageBox errorMsg(this);
  393.       errorMsg.show( IResourceId(IDS_ERROR_NO_FILE_LOADED),
  394.                      IMessageBox::catastrophic,
  395.                      IDH_FILEOPENERR2_RESNO);
  396.       return false;
  397.     }
  398.    else
  399.     {
  400.      statusLine.setText(status);              // Set status line text
  401.      return true;
  402.     }
  403.  
  404.    refresh();
  405. }
  406.  
  407.  
  408. /***********************************************************/
  409. /* This function returns TRUE if there is currently no     */
  410. /* file open.  It checks the state of the openFileName     */
  411. /* data member of AppWindow.                               */
  412. /***********************************************************/
  413. Boolean AppWindow :: isFileOpen() const
  414. {
  415.    return (openFileName == EMPTY_STRING);
  416. }
  417.  
  418.  
  419.  
  420. /***********************************************************/
  421. /* This function returns TRUE if there is currently no     */
  422. /* help available to the application.                      */
  423. /***********************************************************/
  424. Boolean AppWindow :: isHelpAvailable() const
  425. {
  426.    return (hasHelp);
  427. }
  428.  
  429.  
  430.  
  431. /***********************************************************/
  432. /* This function opens the requested file and returns true */
  433. /* if the file was opened successfully.  This function     */
  434. /* immediately closes the file after opening it, as a      */
  435. /* safety measure.  You can add your own file open         */
  436. /* processing as required.                                 */
  437. /***********************************************************/
  438. Boolean AppWindow :: openFile()
  439. {
  440.  IResourceLibrary resLib;
  441.  
  442.  CHAR     szFileName[CCHMAXPATH];    // File to open 
  443.  HFILE    hFile;                     // File handle of opened file 
  444.  ULONG    ulAction;                  // Action taken by DosOpen 
  445.  APIRET   rc;                        // Return code for DosOpen 
  446.  
  447.  /* Open file */
  448.  rc = DosOpen (openFileName,              
  449.                &hFile,
  450.                &ulAction,
  451.                0L,
  452.                0L,
  453.                OPEN_ACTION_FAIL_IF_NEW |
  454.                OPEN_ACTION_OPEN_IF_EXISTS,
  455.                OPEN_SHARE_DENYWRITE |
  456.                OPEN_ACCESS_READONLY,
  457.                0L);
  458.  
  459.  if (rc != NO_ERROR)
  460.    {
  461.      // Display "Error: cannot open file" message box 
  462.      IMessageBox errorMsg(this);
  463.      IString tmpMsg = resLib.loadString(IDS_ERROR_OPENING_FILE);
  464.      tmpMsg.change( "%s", openFileName, 1, 1);
  465.      errorMsg.setTitle( IResourceId(IDW_FRAME_WINDOW));  
  466.      errorMsg.show( tmpMsg,
  467.                     IMessageBox::catastrophic,
  468.                     IDH_FILEOPENERR1_RESNO);
  469.  
  470.      return false;
  471.    }
  472.  else   // DosOpen successful.
  473.    {
  474.      /*=======================================================*/
  475.      /* Add further file processing here                      */
  476.      /*=======================================================*/
  477.  
  478.      // Display status 
  479.      IString tmpStatus = resLib.loadString(IDS_OPEN_FILE);
  480.      tmpStatus.change( "%s", openFileName, 1, 1);
  481.      writeStatus(tmpStatus);
  482.  
  483.      DosClose (hFile);    // Close file for now 
  484.      return true;
  485.    }
  486.  
  487.    return true;
  488. }
  489.  
  490.  
  491.  
  492.  
  493.