home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powergui.iso / powergui / cnr / spreadsh / sprdhdr.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-10-29  |  5.7 KB  |  168 lines

  1. //************************************************************
  2. // Container Control - Spreadsheet Behavior
  3. //
  4. // Copyright (C) 1994, Law, Leong, Love, Olson, Tsuji.
  5. // Copyright (c) 1997 John Wiley & Sons, Inc. 
  6. // All Rights Reserved.
  7. //************************************************************
  8. #include "sprdhdr.hpp"
  9.  
  10. // SpreadSheetHandler:
  11. // The handler fully implements the spreadsheet-like behavior.
  12. // On creation, we post an SPD_OPEN so that we initally have an
  13. // edit field open on the container.
  14. CnrSpreadSheetHandler::CnrSpreadSheetHandler( 
  15.                          IContainerControl& container)
  16.                  : cnrctl(container),
  17.                    accel(SPD_ACCELERATOR, container.owner()) {
  18.   container.owner()->postEvent(IWindow::command, SPD_OPEN);
  19. }
  20.  
  21. IContainerControl& CnrSpreadSheetHandler::container( ) {
  22.   return cnrctl;
  23. }
  24.  
  25. Boolean CnrSpreadSheetHandler:: command(ICommandEvent& cmdevt) {
  26.   Boolean processed =false;
  27.  
  28.   switch (cmdevt.commandId())
  29.   {
  30.     // Forward tab - right and down if warranted.
  31.     case  SPD_TAB :
  32.     {
  33.       IContainerControl::ColumnCursor colCursor(container());
  34.       IContainerControl::ObjectCursor objCursor(container(),
  35.                                  IContainerObject::none,
  36.                                  IContainerControl::itemOrder);
  37.       IContainerColumn* pcnrcol = container().currentEditColumn();
  38.       IContainerObject* pcnrobj = container().currentEditObject();
  39.  
  40.       if(pcnrcol) {
  41.          colCursor.setCurrent(pcnrcol);
  42.  
  43.          // See if there is a next column in this row for edit.
  44.          // If not move to the next row, first column.         
  45.          if ((pcnrcol=colCursor.next())== 0)
  46.          {
  47.             objCursor.setCurrent(pcnrobj);
  48.             pcnrobj = objCursor.next();
  49.             pcnrcol = colCursor.first();
  50.  
  51.          }
  52.          // Scroll to the object and open the edit field.
  53.          if(pcnrobj) {
  54.            container().closeEdit();
  55.            container().scrollToObject(pcnrobj, pcnrcol, false);
  56.            container().editObject(pcnrobj, pcnrcol);
  57.          }
  58.       }
  59.       processed = true;
  60.       break;
  61.     }
  62.     // Back tab - left and up if warranted.
  63.     case  SPD_BACKTAB :
  64.     {
  65.       IContainerControl::ColumnCursor colCursor(container());
  66.       IContainerControl::ObjectCursor objCursor(container(),
  67.                                 IContainerObject::none,
  68.                                 IContainerControl::itemOrder);
  69.       IContainerColumn* pcnrcol = container().currentEditColumn();
  70.       IContainerObject* pcnrobj = container().currentEditObject();
  71.  
  72.       if(pcnrcol) {
  73.      
  74.          colCursor.setCurrent(pcnrcol);
  75.          // See if there is a previous column in this row for  
  76.          // edit, If not move to the prior row, first column.  
  77.          if ((pcnrcol=colCursor.previous())== 0)
  78.          {
  79.             objCursor.setCurrent(pcnrobj);
  80.             pcnrobj = objCursor.previous();
  81.             pcnrcol = colCursor.last();
  82.      
  83.          }
  84.          if(pcnrobj) {
  85.            container().closeEdit();
  86.            container().scrollToObject(pcnrobj, pcnrcol, false);
  87.            container().editObject(pcnrobj, pcnrcol);
  88.          }
  89.       }
  90.       processed = true;
  91.       break;
  92.     }
  93.     // Arrow up - Move up to prior record; stop at first edit field.
  94.     case  SPD_UP :
  95.     {
  96.       IContainerControl::ColumnCursor colCursor(container());
  97.       IContainerControl::ObjectCursor objCursor(container(),
  98.                                  IContainerObject::none,
  99.                                  IContainerControl::itemOrder);
  100.       IContainerColumn* pcnrcol = container().currentEditColumn();
  101.       IContainerObject* pcnrobj = container().currentEditObject();
  102.       if(pcnrcol) {
  103.         if(pcnrobj) {
  104.           objCursor.setCurrent(pcnrobj);
  105.           pcnrobj = objCursor.previous();
  106.         }
  107.         else
  108.           pcnrobj = objCursor.first();
  109.      
  110.         if (pcnrobj) {
  111.            container().closeEdit();
  112.            container().scrollToObject(pcnrobj, pcnrcol, false);
  113.            container().editObject(pcnrobj, pcnrcol);
  114.      
  115.         }
  116.       }
  117.       processed = true;
  118.       break;
  119.     }
  120.     case  SPD_DOWN :
  121.     // Down arrow - Move to next record; stop at last
  122.     {
  123.       IContainerControl::ColumnCursor colCursor(container());
  124.       IContainerControl::ObjectCursor objCursor(container(),
  125.                                  IContainerObject::none,
  126.                                  IContainerControl::itemOrder);
  127.       IContainerColumn* pcnrcol = container().currentEditColumn();
  128.       IContainerObject* pcnrobj = container().currentEditObject();
  129.       if(pcnrcol) {
  130.         if(pcnrobj) {
  131.           objCursor.setCurrent(pcnrobj);
  132.           pcnrobj = objCursor.next();
  133.         }
  134.         else
  135.           pcnrobj = objCursor.last();
  136.      
  137.         if (pcnrobj) {
  138.            container().closeEdit();
  139.            container().scrollToObject(pcnrobj, pcnrcol, false);
  140.            container().editObject(pcnrobj, pcnrcol);
  141.         }
  142.       }
  143.       processed = true;
  144.       break;
  145.     }
  146.     // Initially open the edit field.
  147.     case  SPD_OPEN :
  148.     {
  149.       IContainerControl::ColumnCursor colCursor(container());
  150.       IContainerControl::ObjectCursor objCursor(container(),
  151.                                  IContainerObject::none,
  152.                                  IContainerControl::itemOrder);
  153.       colCursor.setToFirst();
  154.       objCursor.setToFirst();
  155.       if(colCursor.isValid() && objCursor.isValid()) {
  156.            container().scrollToObject(container().objectAt(objCursor));
  157.            container().editObject(container().objectAt(objCursor), 
  158.                                   container().columnAt(colCursor));
  159.       }
  160.  
  161.  
  162.       processed = true;
  163.       break;
  164.     }
  165.  }
  166.  return processed;
  167. }
  168.