home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powergui.iso / trialva / ibmcppw / samples / ioc / lancelot / ltask.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-22  |  28.1 KB  |  639 lines

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