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

  1. //************************************************************
  2. // Container Control - Pop Up Menu Example 
  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 <iframe.hpp>
  9. #include <icnrctl.hpp>
  10. #include <icnrcol.hpp>
  11. #include <icnrobj.hpp>
  12. #include <icnrmhdr.hpp>
  13. #include <ipopmenu.hpp>
  14. #include <ictlevt.hpp>
  15. #include <iapp.hpp>
  16. #include <itrace.hpp>
  17. #include <iexcept.hpp>
  18. #include <stddef.h>
  19. #include "popup.h"
  20.  
  21. class Developer : public IContainerObject
  22. {
  23.   public:
  24.   Developer   ( IString       name,
  25.                 unsigned long iconId,
  26.                 IString       compuServeId,
  27.                 unsigned long age)
  28.      : IContainerObject(name, iconId),
  29.        fCompuServeId(compuServeId),
  30.        fAge(age)
  31.  
  32.  {}
  33.  
  34. // Column functions
  35. enum Column 
  36. { kNameColumn, 
  37.   kIconColumn, 
  38.   kCompuServeIdColumn,
  39.   kAgeColumn
  40. };
  41. static IContainerColumn
  42.  *createAndOrphanColumnFor ( IContainerControl& container,
  43.                              Column             column);
  44. static void
  45.   createAllColumnsFor      ( IContainerControl&  container);
  46.  
  47. private:
  48.  
  49. IString
  50.   fCompuServeId;
  51. unsigned long
  52.   fAge;
  53. };
  54.  
  55.  
  56. class DeveloperMenuHandler : public ICnrMenuHandler
  57. {
  58.  
  59. protected:
  60.  
  61. virtual Boolean
  62.  makePopUpMenu(IMenuEvent& mnEvt);
  63.  
  64. };
  65.  
  66. void main ()
  67. {
  68.  
  69. // Create a frame with a container as the client.
  70. IFrameWindow cnrFrame("Container Pop-up Menu Example");
  71. IContainerControl cnr(0x101,        
  72.                       &cnrFrame,    
  73.                       &cnrFrame);
  74. cnrFrame.setClient(&cnr);
  75.  
  76. // Create the columns for the details view.
  77. Developer::createAllColumnsFor(cnr);
  78.  
  79. // Create and add the objects to the container.
  80. Developer* developer;
  81. developer = new Developer("Joe South", 
  82.                           ICON_FOLDER,  
  83.                           "12345,6789",
  84.                           38);
  85. cnr.addObject(developer);
  86. developer = new Developer("Silly Sally",
  87.                           ICON_FOLDER,  
  88.                           "98765,4321",
  89.                           40);
  90. cnr.addObject(developer);
  91.  
  92.  
  93. //Create a container MenuHandler.
  94. DeveloperMenuHandler* pmenu = new DeveloperMenuHandler();
  95. pmenu->handleEventsFor(&cnr);
  96.  
  97. // Show the details view.
  98. cnr.showDetailsView();
  99.  
  100. cnrFrame.show();
  101. cnrFrame.setFocus();
  102.  
  103. IApplication::current().run();
  104. }
  105.  
  106.  
  107. void Developer::createAllColumnsFor ( IContainerControl&  container)
  108. {
  109.  IContainerColumn* newColumn;
  110.  
  111.  newColumn = createAndOrphanColumnFor( container, Developer::kIconColumn);
  112.  newColumn = createAndOrphanColumnFor( container, Developer::kNameColumn);
  113.  container.setDetailsViewSplit(newColumn, 125);
  114.  newColumn = createAndOrphanColumnFor( container, Developer::kCompuServeIdColumn);
  115.  newColumn = createAndOrphanColumnFor( container, Developer::kAgeColumn);
  116.  
  117.  container.setDeleteColumnsOnClose();
  118. }
  119.  
  120.  
  121. IContainerColumn* Developer::createAndOrphanColumnFor ( 
  122.                              IContainerControl& container,
  123.                              Column             columnType)
  124. {
  125.   // Setup a default Column.
  126.   IContainerColumn* newColumn = 0;
  127.   IString headingText;
  128.   Boolean editable = false;
  129.   const unsigned long invalidOffset = (unsigned long)-1;
  130.   unsigned long offset = invalidOffset;
  131.   IContainerColumn::HeadingStyle headingStyle = IContainerColumn::defaultHeadingStyle();
  132.   IContainerColumn::DataStyle dataStyle = IContainerColumn::defaultDataStyle();
  133.  
  134.   if (columnType == Developer::kNameColumn)
  135.   {
  136.     newColumn = new IContainerColumn(IContainerColumn::isIconViewText,
  137.                                      headingStyle,
  138.                                      dataStyle);
  139.     headingText = "Name";
  140.     editable = true;
  141.   }
  142.   else if (columnType == Developer::kIconColumn)
  143.   {
  144.     newColumn = new IContainerColumn(IContainerColumn::isIcon,
  145.                                      headingStyle,
  146.                                      dataStyle);
  147.     headingText = "Role";
  148.   }
  149.   else if (columnType == Developer::kCompuServeIdColumn)
  150.   {
  151.     offset = offsetof(Developer, fCompuServeId);
  152.     headingText = "CompuServe Id";
  153.     editable = true;
  154.   }
  155.   else if (columnType == Developer::kAgeColumn)
  156.   {
  157.     offset = offsetof(Developer, fAge);
  158.     headingText = "Age";
  159.     dataStyle = IContainerColumn::number
  160.                 | IContainerColumn::centeredVertically
  161.                 | IContainerColumn::alignRight;
  162.     editable = true;
  163.   }
  164.   
  165.   if (newColumn == 0 && offset < invalidOffset )
  166.     newColumn = new IContainerColumn(offset,
  167.                                      headingStyle,
  168.                                      dataStyle);
  169.  
  170.   // Insure that a new column has been created.
  171.   IASSERTSTATE(newColumn != 0)
  172.  
  173.   newColumn->setHeadingText(headingText);
  174.  
  175.   if (editable == true) 
  176.     newColumn->enableDataUpdate();
  177.  
  178.   // Add the column to the container.
  179.   container.addColumn( newColumn);
  180.  
  181.   return newColumn;
  182. }
  183.  
  184.  
  185.  
  186. Boolean DeveloperMenuHandler :: makePopUpMenu(IMenuEvent& menuEvent)
  187. {
  188.   // If on an object, create a menu for the object
  189.   // Support should be added to have a container window
  190.   // Menu if we aren't over an object
  191.  
  192.   IContainerControl* container;
  193.   container = (IContainerControl*)(menuEvent.window());
  194.  
  195.   if(popupMenuObject()) {
  196.     IPopUpMenu* ppumn = new IPopUpMenu(POPUP_MENU, container);
  197.     ppumn->setAutoDeleteObject();
  198.     ppumn->show(menuEvent.mousePosition());
  199.     return true;
  200.   }
  201.   return false;
  202. }
  203.