home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / VSCPPv8.zip / VACPP / IBMCPP / samples / IOC / LANCELOT / LTASK.CPP < prev    next >
C/C++ Source or Header  |  1995-04-07  |  29KB  |  642 lines

  1. /*******************************************************************************
  2. * FILE NAME: ltask.cpp                                                         *
  3. *                                                                              *
  4. * DESCRIPTION:                                                                 *
  5. *                                                                              *
  6. * Classes                                                                      *
  7. *   TasksPage                                                                  *
  8. *   TaskCnrObj                                                                 *
  9. *                                                                              *
  10. * COPYRIGHT:                                                                   *
  11. *   Licensed Materials - Property of IBM                                       *
  12. *   (C) Copyright IBM Corporation 1992, 1995                                   *
  13. *   All Rights Reserved                                                        *
  14. *   US Government Users Restricted Rights - Use, duplication, or disclosure    *
  15. *   restricted by GSA ADP Schedule Contract with IBM Corp.                     *
  16. *                                                                              *
  17. * CHANGE HISTORY:                                                              *
  18. *******************************************************************************/
  19.  
  20. #ifndef _IBASE_                         //Make sure ibase.hpp is included
  21.   #include <ibase.hpp>                  //  since that is where IC_<environ>
  22. #endif                                  //  is defined.
  23. #include <ireslib.hpp>
  24. #include <ihelp.hpp>
  25. #include <iexcbase.hpp>
  26. #include "ltask.hpp"
  27. #include "lancelot.h"
  28.  
  29. /******************************************************************************
  30. * Class TasksPage :: TasksPage - Constructor for the task page                *
  31. *                                                                             *
  32. * Define yourself as an IMultiCellCanvas                                      *
  33. * Create generic page buttons                                                 *
  34. * Create generic page container buttons                                       *
  35. * Create static text for the task                                             *
  36. * Create static text for the billable status                                  *
  37. * Create static text for the description                                      *
  38. * Create static text for the responsible manager                              *
  39. * Create entryfield for the task                                              *
  40. * Create checkbox for the active status                                       *
  41. * Create entryfield for the description                                       *
  42. * Define a null container pointer                                             *
  43. * Define a null container object pointer                                      *
  44. * Define a null container column pointer                                      *
  45. * Define a null container column pointer                                      *
  46. * Create an task data object given the key                                    *
  47. * Create a empty task data object                                             *
  48. * Set the key in your private data                                            *
  49. * Create the notebook page settings                                           *
  50. * Create a alphanumeric handler (MOTIF only)                                  *
  51. * Create a container select handler                                           *
  52. ******************************************************************************/
  53. TasksPage::TasksPage       ( IWindow* pParent,
  54.                              const IString& aKey )
  55.      :IMultiCellCanvas     ( ID_TASK_PAGE, pParent, pParent ),
  56.       pageButtons          ( ID_TASK_PAGE_BUTTONS, this, this, false ),
  57.       pageCnrButtons       ( ID_TASK_PAGE_CNRBUTTONS, this, this, false ),
  58.       taskText             ( ID_NO_ITEM, this, this ),
  59.       billableText         ( ID_NO_ITEM, this, this ),
  60.       descrText            ( ID_NO_ITEM, this, this ),
  61. //    currentTasksText     ( ID_NO_ITEM, this, this ),
  62. //    descr2Text           ( ID_NO_ITEM, this, this ),
  63. //    billable2Text        ( ID_NO_ITEM, this, this ),
  64.       task                 ( ID_TSK_TASK_EF, this, this,
  65.                              IRectangle(),
  66.                              IEntryField::classDefaultStyle
  67.                            | IControl::tabStop ),
  68.       billable             ( ID_TSK_BILLABLE_CB, this, this ),
  69.       descr                ( ID_TSK_DESCR_EF, this, this,
  70.                              IRectangle(),
  71.                              IEntryField::classDefaultStyle
  72.                              | IControl::tabStop ),
  73.       pCnr                 ( (IContainerControl*) NULL ),
  74.       pTaskCnrObj          ( (TaskCnrObj*) NULL ),
  75.       pColTask             ( (IContainerColumn*) NULL ),
  76.       pColBill             ( (IContainerColumn*) NULL ),
  77.       taskData             ( aKey ),
  78.       origTaskData         (),
  79.       Key                  ( aKey ),
  80.       thePageSettings      ( IApplication::current().userResourceLibrary().
  81.                              loadString( STR_TSK_TASKS_TAB ), NULL,
  82.                              INotebook::PageSettings::autoPageSize
  83.                              | INotebook::PageSettings::majorTab ),
  84. #ifdef IC_MOTIF
  85.       alphaNumericHandler  ( this, TEST_ALPHANUMERIC ),
  86. #endif
  87.       cnrSelHandler        ( this )
  88. {
  89. /*-----------------------------------------------------------------------------
  90. | Save the task data to another object in case the user wishes to             |
  91. |  undo any changes.                                                          |
  92. | Label the static text objects.                                              |
  93. | Set the limit for the entryfields.                                          |
  94. -----------------------------------------------------------------------------*/
  95.    origTaskData = taskData;
  96.    taskText.setText( STR_TSK_TASK );
  97.    billableText.setText( STR_TSK_BILLABLE );
  98.    descrText.setText( STR_TSK_DESCR );
  99.    task.setLimit( DISPLAY_LARGE );
  100.    descr.setLimit( DISPLAY_LARGE );
  101.  
  102. /*-----------------------------------------------------------------------------
  103. | Fill the container from the database.                                       |
  104. | Set the objects on yourself (IMultiCellCanvas).                             |
  105. | Start handling the events.                                                  |
  106. -----------------------------------------------------------------------------*/
  107.    fillCnr();
  108.    setCells();
  109.    handleIt();
  110. }
  111.  
  112. /******************************************************************************
  113. * Class TaskPage :: ~TaskPage - Destructor for the task page                  *
  114. ******************************************************************************/
  115. TasksPage :: ~TasksPage()
  116. {
  117. /*-----------------------------------------------------------------------------
  118. | Stop handling events.                                                       |
  119. -----------------------------------------------------------------------------*/
  120.    ICommandHandler::stopHandlingEventsFor( &pageButtons );
  121.    ICommandHandler::stopHandlingEventsFor( &pageCnrButtons );
  122.    ISelectHandler::stopHandlingEventsFor( &pageButtons );
  123.    cnrSelHandler.stopHandlingEventsFor( pCnr );
  124. #ifdef IC_MOTIF
  125.    alphaNumericHandler.stopHandlingEventsFor( &task );
  126. #endif
  127. }
  128.  
  129. /******************************************************************************
  130. * Class ProjectPage :: handleIt()                                             *
  131. ******************************************************************************/
  132. TasksPage&  TasksPage :: handleIt()
  133. {
  134. /*-----------------------------------------------------------------------------
  135. | Begin handling events.                                                      |
  136. -----------------------------------------------------------------------------*/
  137.    ICommandHandler::handleEventsFor( &pageButtons );
  138.    ICommandHandler::handleEventsFor( &pageCnrButtons );
  139.    ISelectHandler::handleEventsFor( &pageButtons );
  140. #ifdef IC_MOTIF
  141.     alphaNumericHandler.handleEventsFor( &task );
  142. #endif
  143.    return *this;
  144. }
  145.  
  146.  
  147. /******************************************************************************
  148. * Class ProjectPage :: fillCnr - Set up the container                         *
  149. ******************************************************************************/
  150. TasksPage& TasksPage::fillCnr()
  151. {
  152. /*-----------------------------------------------------------------------------
  153. | If the container already exists,                                            |
  154. |  delete all the objects                                                     |
  155. | Else create a new container.                                                |
  156. -----------------------------------------------------------------------------*/
  157.    if ( pCnr )
  158.       pCnr->deleteAllObjects();
  159.    else
  160.    {
  161.       pCnr = new IContainerControl( ID_TSK_CNR,
  162.                                     this, this,
  163.                                     IRectangle(),
  164.                                     IContainerControl::classDefaultStyle
  165.                                     | IContainerControl::readOnly,
  166.                                     IContainerControl::readOnlyTitle
  167.                                     | IContainerControl::detailsView );
  168.  
  169. /*-----------------------------------------------------------------------------
  170. | Handle selection events for the new container.                              |
  171. -----------------------------------------------------------------------------*/
  172.       cnrSelHandler.handleEventsFor( pCnr );
  173.  
  174. /*-----------------------------------------------------------------------------
  175. | Delete the objects when the container is deleted.                           |
  176. | Tell the container to allow multiple selection.                             |
  177. | Tell the container to automatically refresh upon changes.                   |
  178. -----------------------------------------------------------------------------*/
  179.       pCnr->setDeleteObjectsOnClose();
  180.       pCnr->setDeleteColumnsOnClose();
  181.       pCnr->setMultipleSelection();
  182.  
  183. /*-----------------------------------------------------------------------------
  184. | Create four container columns.                                              |
  185. -----------------------------------------------------------------------------*/
  186.       pColTask =
  187.          new IContainerColumn( pTaskCnrObj->taskOffset(),
  188.                                IContainerColumn::defaultHeadingStyle(),
  189.                                IContainerColumn::string );
  190.  
  191.       pColDesc =
  192.          new IContainerColumn( pTaskCnrObj->descOffset(),
  193.                                IContainerColumn::defaultHeadingStyle(),
  194.                                IContainerColumn::string );
  195.  
  196.       pColBill =
  197.          new IContainerColumn( pTaskCnrObj->billOffset(),
  198.                                IContainerColumn::defaultHeadingStyle(),
  199.                                IContainerColumn::string );
  200.  
  201. /*-----------------------------------------------------------------------------
  202. | Label the container column headings.                                        |
  203. | Show the headings.                                                          |
  204. | Show the headings.                                                          |
  205. -----------------------------------------------------------------------------*/
  206.       pColTask->setHeadingText( STR_TSK_CURR );
  207.       pColDesc->setHeadingText( STR_TSK_DESCR2 );
  208.       pColBill->setHeadingText( STR_TSK_BILLABLE2 );
  209.      pCnr->showDetailsViewTitles();
  210.  
  211. /*-----------------------------------------------------------------------------
  212. | Add the columns to the container.                                           |
  213. | Add column separators between the columns.                                  |
  214. -----------------------------------------------------------------------------*/
  215.       pCnr->addColumn( pColTask );
  216.       pCnr->addColumn( pColDesc );
  217.       pCnr->addColumn( pColBill );
  218.       pColTask->showSeparators( IContainerColumn::verticalSeparator
  219.                                 | IContainerColumn::horizontalSeparator );
  220.       pColDesc->showSeparators( IContainerColumn::verticalSeparator
  221.                                 | IContainerColumn::horizontalSeparator );
  222.       pColBill->showSeparators( IContainerColumn::horizontalSeparator );
  223.    }
  224.  
  225. /*-----------------------------------------------------------------------------
  226. | Start from the beginning of the task data.                                  |
  227. | While there exists items,                                                   |
  228. |   add objects to the container.                                             |
  229. | Refresh the container.                                                      |
  230. | Return yourself.                                                            |
  231. -----------------------------------------------------------------------------*/
  232.    IString
  233.       theTask,
  234.       theDesc,
  235.       theBill;
  236.    LTaskData::Rule
  237.       rule;
  238.  
  239.    taskData.setFirst();
  240.    while ( taskData.getItem( theTask, theDesc, theBill, rule ) )
  241.    {
  242.       addTask( theTask, theDesc, theBill );
  243.       taskData.getNext();
  244.    }
  245.  
  246.    billable.select();
  247.    pCnr->refresh();
  248.  
  249.    return *this;
  250. }
  251.  
  252.  
  253. /******************************************************************************
  254. * Class TasksPage :: setCells - Set up your multicell canvas cells            *
  255. ******************************************************************************/
  256. TasksPage& TasksPage::setCells()
  257. {
  258. /*-----------------------------------------------------------------------------
  259. | Add the objects to your multicell canvas.                                   |
  260. | Allow the container to expand horizontally.                                 |
  261. | Allow the page buttons to expand horizontally.                              |
  262. | Return yourself.                                                            |
  263. -----------------------------------------------------------------------------*/
  264.    addToCell( &taskText,         2,  2 );
  265.    addToCell( &task,             2,  4 );
  266.  
  267.    addToCell( &billable,         4,  4 );
  268.    addToCell( &billableText,     5,  4 );
  269.  
  270.    addToCell( &descrText,        2,  5 );
  271.    addToCell( &descr,            2,  6 );
  272.  
  273.    addToCell( pCnr,              2,  8,  6,  3 );
  274.    addToCell( &pageCnrButtons,   8,  9 );
  275.    setColumnWidth(               7,  0, true );
  276.  
  277.    addToCell( &pageButtons,      2, 11,  5,  3 );
  278.    setColumnWidth(               6,  0,  true );
  279.  
  280.    return *this;
  281. }
  282.  
  283.  
  284. /******************************************************************************
  285. * Class TasksPage :: verifyAndSave - Save page information to the database    *
  286. ******************************************************************************/
  287. IBase::Boolean TasksPage::verifyAndSave( IString& theString,
  288.                                          IString& theEntry,
  289.                                          const IString theName )
  290. {
  291.  
  292. /*-----------------------------------------------------------------------------
  293. | If there is no data or is a query, return.                                  |
  294. -----------------------------------------------------------------------------*/
  295.    if ( ( ! theName.length() )
  296.         && ( ! Key.length() ) )
  297.       return true;
  298.  
  299. /*-----------------------------------------------------------------------------
  300. | If able to retrieve the container information,                              |
  301. |  save the information to the database based on the key or query name.       |
  302. -----------------------------------------------------------------------------*/
  303.    if ( setTasksData() )
  304.    {
  305.       if ( theName.length() )
  306.          taskData.save( theName );
  307.       else
  308.          taskData.save( Key );
  309.    }
  310.  
  311.    return true;
  312. }
  313.  
  314.  
  315. /******************************************************************************
  316. * Class TasksPage :: setTasksData - Retrieve the page information             *
  317. ******************************************************************************/
  318. IBase::Boolean TasksPage::setTasksData()
  319. {
  320.    IContainerControl::ObjectCursor
  321.       iterator( *pCnr );
  322.  
  323.    iterator.setToFirst();
  324.    if ( ! iterator.isValid() )
  325.       return false;
  326.  
  327.    TaskCnrObj
  328.      *cnrEntry;
  329.    IString
  330.       it1,
  331.       it2;
  332.  
  333. /*-----------------------------------------------------------------------------
  334. | Empty the bag.                                                              |
  335. | Iterate through the cursor and add objects to the bag.                      |
  336. -----------------------------------------------------------------------------*/
  337.    taskData.emptyBag();
  338.    while ( iterator.isValid() )
  339.    {
  340.       cnrEntry = (TaskCnrObj *) iterator.current();
  341.       this->taskData.putItem( cnrEntry->task(),
  342.                               cnrEntry->desc(),
  343.                               cnrEntry->bill() );
  344.       cnrEntry = (TaskCnrObj *) iterator.next();
  345.    }
  346.  
  347.    return true;
  348. };
  349.  
  350. /******************************************************************************
  351. * Class TasksPage :: fillEntryfields - Fill the entryfields for the object    *
  352. ******************************************************************************/
  353. TasksPage& TasksPage::fillEntryfields( TaskCnrObj* pCnrObject )
  354. {
  355. /*-----------------------------------------------------------------------------
  356. | Set the entryfields for the given task container object.                    |
  357. | Return yourself.                                                            |
  358. -----------------------------------------------------------------------------*/
  359.    task.setText( pCnrObject->task() );
  360.    descr.setText( pCnrObject->desc() );
  361.    if ( pCnrObject->bill() == "yes" )
  362.       billable.select();
  363.    else
  364.       billable.select( false );
  365.  
  366.    return *this;
  367. };
  368.  
  369.  
  370. /******************************************************************************
  371. * Class TasksPage :: command - Catch and process command events.              *
  372. ******************************************************************************/
  373. IBase::Boolean TasksPage::command( ICommandEvent& cmdEvent )
  374. {
  375.    IString
  376.       theTask = task.text(),
  377.       theDesc = descr.text(),
  378.       theBill = ( true == billable.isSelected() ) ? "yes" : "no";
  379.    LTaskData::Rule
  380.       theRule = LTaskData::na;
  381.    Boolean
  382.       rc = false;
  383.    unsigned int
  384.       count = 0;
  385.  
  386. /*-----------------------------------------------------------------------------
  387. | Create a container object cursor based on the selected objects.             |
  388. | Process the command events.                                                 |
  389. -----------------------------------------------------------------------------*/
  390.    IContainerControl::ObjectCursor
  391.       soc( *pCnr, IContainerObject::selected );
  392.  
  393.    switch ( cmdEvent.commandId() )
  394.    {
  395. /*-----------------------------------------------------------------------------
  396. | User pressed the UNDO button.                                               |
  397. | Reset the task data to the original task data.                              |
  398. | Reset the container.                                                        |
  399. | Reset the entryfields and checkbox.                                         |
  400. -----------------------------------------------------------------------------*/
  401.       case ID_BUTTON_UNDO:
  402.       {
  403.          taskData = origTaskData;
  404.          fillCnr();
  405.          task.setText("");
  406.          descr.setText("");
  407.          rc = true;
  408.          break;
  409.       }
  410.  
  411. /*-----------------------------------------------------------------------------
  412. | User pressed the REMOVE button.                                             |
  413. | Iterate through the selected objects,                                       |
  414. |  remove the object from the the database.                                   |
  415. -----------------------------------------------------------------------------*/
  416.       case ID_BUTTON_REMOVE:
  417.       {
  418.          for ( soc.setToFirst();
  419.                soc.isValid();
  420.                soc.setToNext() )
  421.          {
  422.             TaskCnrObj *pObj = (TaskCnrObj *) soc.current();
  423.             taskData.putItem( pObj->task(),
  424.                               pObj->desc(),
  425.                               pObj->bill(),
  426.                               LTaskData::remove );
  427.             ++count;
  428.          }
  429.  
  430.          if ( ! count )
  431.          {
  432.             IMessageBox
  433.                warning( owner() );
  434.             warning.show( STR_MSG_REMOVE,
  435.                           IMessageBox::enterButton
  436.                            | IMessageBox::informationIcon );
  437.          }
  438.          else
  439.          {
  440.             pCnr->removeSelectedObjects();
  441.             pCnr->refresh();
  442.          }
  443.          rc = true;
  444.          break;
  445.       }
  446.  
  447. /*-----------------------------------------------------------------------------
  448. | User pressed the CHANGE button.                                             |
  449. | Ignore all but the first selected container object.                         |
  450. | Update the entryfields with the selected container object information.      |
  451. -----------------------------------------------------------------------------*/
  452.       case ID_BUTTON_CHANGE:
  453.       {
  454.          soc.setToFirst();
  455.          if ( soc.isValid() )
  456.          {
  457.             if ( theTask.length() )
  458.             {
  459.                changeTask( theTask, theDesc, theBill,
  460.                   (TaskCnrObj*) soc.current() );
  461.                task.setText( "" );
  462.                descr.setText( "" );
  463.                billable.select();
  464.             }
  465.          }
  466.          else
  467.          {
  468.              IMessageBox warning(owner());
  469.              warning.show( STR_MSG_CHANGE,
  470.                         IMessageBox::enterButton |
  471.                         IMessageBox::informationIcon);
  472.          }
  473.          unMark();
  474.          rc = true;
  475.          break;
  476.       }
  477.  
  478. /*-----------------------------------------------------------------------------
  479. | User pressed the ADD button.                                                |
  480. | Add the entryfield information to the database and container.               |
  481. | Reset the entryfields.                                                      |
  482. -----------------------------------------------------------------------------*/
  483.       case ID_BUTTON_ADD:
  484.       {
  485.          if ( theTask.length() )
  486.          {
  487.             addTask( theTask, theDesc, theBill );
  488.             task.setText( "" );
  489.             descr.setText( "" );
  490.             billable.select();
  491.          }
  492.  
  493. /*-----------------------------------------------------------------------------
  494. | Deselect any container objects.                                             |
  495. -----------------------------------------------------------------------------*/
  496.          unMark();
  497.          rc = true;
  498.          break;
  499.       }
  500.  
  501. /*-----------------------------------------------------------------------------
  502. | User pressed the HELP button.                                               |
  503. | Show the help for the account page.                                         |
  504. -----------------------------------------------------------------------------*/
  505.       case ID_BUTTON_HELP:
  506.       {
  507.          IHelpWindow::helpWindow( this )->
  508.             show( IResourceId( ID_TASK_PAGE ) );
  509.          rc = true;
  510.          break;
  511.       }
  512.   }
  513.  
  514.   return rc;
  515. }
  516.  
  517. /******************************************************************************
  518. * Class TaskPage :: addTask - Add the task information to the container       *
  519. ******************************************************************************/
  520. IBase::Boolean TasksPage::addTask( IString& theTask, IString& theDesc,
  521.                                    IString& theBill )
  522. {
  523.    Boolean
  524.       rc = true;
  525.  
  526. /*-----------------------------------------------------------------------------
  527. | Create a container text cursor based on the task.                           |
  528. -----------------------------------------------------------------------------*/
  529.    IContainerControl::TextCursor
  530.       txtCur( *pCnr, IString( theTask ), true, false, true );
  531.  
  532.    txtCur.setToFirst();
  533.    if ( txtCur.isValid() )
  534.       rc = false;
  535.  
  536. /*-----------------------------------------------------------------------------
  537. | If the object doesn't exist,                                                |
  538. |  Add the object to the database.                                            |
  539. |  Create a container object.                                                 |
  540. |  Add the object to the container.                                           |
  541. |  Refresh the container.                                                     |
  542. -----------------------------------------------------------------------------*/
  543.    if ( rc )
  544.    {
  545.       taskData.putItem( theTask, theDesc, theBill, LTaskData::add );
  546.       pTaskCnrObj = new TaskCnrObj( theTask, theDesc, theBill );
  547.       pCnr->addObject( pTaskCnrObj );
  548.       pCnr->refresh();
  549.    }
  550.  
  551.    return rc;
  552. }
  553.  
  554. /******************************************************************************
  555. * Class TaskPage :: changeTask - Change the task information for the          *
  556. *  selected container object.                                                 *
  557. ******************************************************************************/
  558. IBase::Boolean TasksPage::changeTask( IString& theTask, IString& theDesc,
  559.                                      IString& theBill,
  560.                                      TaskCnrObj* pCnrObj )
  561. {
  562.    Boolean
  563.       rc = true;
  564.  
  565. /*-----------------------------------------------------------------------------
  566. | Create a container text cursor based on the task.                           |
  567. -----------------------------------------------------------------------------*/
  568.    IContainerControl::TextCursor
  569.       txtCur( *pCnr, IString( theTask ), true, false, true );
  570.  
  571.  
  572.    txtCur.setToFirst();
  573.    if ( !txtCur.isValid() )
  574.       rc = false;
  575.  
  576. /*-----------------------------------------------------------------------------
  577. | If the container object exists -and- the task exists,                       |
  578. |  Set the container object's data.                                           |
  579. |  Reset the entryfields.                                                     |
  580. |  Deselect the container objects.                                            |
  581. -----------------------------------------------------------------------------*/
  582.    if ( pCnrObj && rc )
  583.    {
  584.       pCnrObj->setTask( theTask );
  585.       pCnrObj->setDesc( theDesc );
  586.       pCnrObj->setBill( theBill );
  587.  
  588.    }
  589.  
  590.    return rc;
  591. }
  592.  
  593.  
  594. /******************************************************************************
  595. * Class TasksPage :: unMark - Deselect the selected container objects.        *
  596. ******************************************************************************/
  597. TasksPage& TasksPage :: unMark()
  598. {
  599.    IContainerControl::ObjectCursor
  600.       co( *pCnr );
  601.    for ( co.setToFirst();
  602.          co.isValid();
  603.          co.setToNext() )
  604.    {
  605.       try
  606.       {
  607.          pCnr->removeSelected(pCnr->objectAt( co ) );
  608.       }
  609.       catch ( IException& exc )
  610.       {}
  611.    }
  612.  
  613.    return *this;
  614. };
  615.  
  616.  
  617. /******************************************************************************
  618. * Class TasksCnrObj :: TasksCnrObj - Constructor for tasks container          *
  619. *  objects.                                                                   *
  620. *                                                                             *
  621. * Define yourself as a container object.                                      *
  622. * Set the task in your private data.                                          *
  623. * Set the description in your private data.                                   *
  624. * Set the billable flag in your private data.                                 *
  625. ******************************************************************************/
  626. TaskCnrObj::TaskCnrObj( const IString& stTask,
  627.                         const IString& stDesc,
  628.                         const IString& stBill )
  629.      :IContainerObject(),
  630.       Task( stTask ),
  631.       Desc( stDesc ),
  632.       Bill( stBill )
  633. {}
  634.  
  635.  
  636. /******************************************************************************
  637. * Class TasksCnrObj :: ~TasksCnrObj - Destructor for task container           *
  638. *  object.                                                                    *
  639. ******************************************************************************/
  640. TaskCnrObj::~TaskCnrObj()
  641. {}
  642.