home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powergui.iso / powergui / cnr / treedet / treedeth.cpp < prev    next >
Text File  |  1996-10-29  |  6KB  |  208 lines

  1. //************************************************************
  2. // Container - Combined Tree and Details View
  3. //
  4. // Copyright (C) 1994, Law, Leong, Love, Olson, Tsuji.
  5. // Copyright (c) 1997 John Wiley & Sons, Inc. 
  6. // All Rights Reserved.
  7. //************************************************************
  8. extern "C" {
  9.    #define INCL_WINWINDOWMGR
  10.    #define INCL_WINSYS
  11.    #define INCL_WINSTDCNR
  12.    #define INCL_WINMENUS
  13.    #include <os2.h>
  14. }
  15.  
  16. #include <ifont.hpp>
  17. #include <itrace.hpp>
  18. #include <icolor.hpp>
  19. #include <icnrolst.hpp>
  20. #include "treedetc.hpp"
  21. #include "treedeth.hpp"
  22. #include <malloc.h>
  23. #include <itrace.hpp>
  24.  
  25.  
  26. DetailsTreeHandler :: DetailsTreeHandler ( DetailsTreeContainer* tree)
  27.                            : treeCnr(tree)
  28. {
  29.   IFUNCTRACE_DEVELOP()
  30.   handleEventsFor(tree);
  31.   handleEventsFor(&(tree->detailsContainer()));
  32. }
  33.  
  34.  
  35. Boolean DetailsTreeHandler :: dispatchHandlerEvent ( IEvent& evt)
  36. {
  37.   if(evt.eventId() == WM_PRESPARAMCHANGED)
  38.   {
  39.      if(evt.parameter1() == PP_FONTNAMESIZE ||
  40.         evt.parameter1() == PP_FONTHANDLE)
  41.         return fontChanged(evt);
  42.   }
  43.   return Inherited::dispatchHandlerEvent(evt);
  44. }
  45.  
  46.  
  47. Boolean DetailsTreeHandler :: treeCollapsed(IContainerObject* collapsedObject, IContainerControl* container)
  48. {
  49.   // On collapse, remove the coresponding objects in the
  50.   // details view (we'd really like to hide the objects in
  51.   // the details view, but hiding or filtering objects in the
  52.   // details view, resets the container to the top).
  53.   IContainerObject* pobj =0 ;
  54.   ICnrObjectSet childObjects = container->descendentsOf(collapsedObject);
  55.   if(childObjects.numberOfElements() != 0)
  56.   {
  57.     treeCnr->detailsContainer().disableUpdate();
  58.  
  59.     ICnrObjectSet::Cursor cursor(childObjects);
  60.     for(cursor.setToFirst(); cursor.isValid(); cursor.setToNext()) {
  61.        pobj = childObjects.elementAt(cursor);
  62.        if(treeCnr->detailsContainer().containsObject(pobj))
  63.          treeCnr->detailsContainer().removeObject(pobj);
  64.     }
  65.     treeCnr->detailsContainer().enableUpdate();
  66.     collapsedObject->refresh(&(treeCnr->detailsContainer()));
  67.   } 
  68.   return true;
  69. }
  70.  
  71. Boolean DetailsTreeHandler :: treeExpanded(IContainerObject* expandedObject, 
  72.                                            IContainerControl* )
  73. {
  74.   IFUNCTRACE_DEVELOP()
  75.   IContainerObject* lastObject = expandedObject;
  76.   IContainerObject* currentObject;
  77.   Boolean needsRefresh = false;
  78.  
  79.   // On expand, add the coresponding objects to the
  80.   // details view (or show them if already there)
  81.  
  82.   IContainerControl::ObjectCursor cursor(*treeCnr, expandedObject, true);
  83.   cursor.setToFirst();
  84.   if (cursor.isValid()) {
  85.      treeCnr->detailsContainer().disableUpdate();
  86.      needsRefresh = true;
  87.   } 
  88.  
  89.   for(; cursor.isValid(); cursor.setToNext()) {
  90.      currentObject = treeCnr->objectAt(cursor);
  91.      if(treeCnr->isExpanded(treeCnr->parentObject(currentObject))) {
  92.        if(treeCnr->detailsContainer().containsObject(currentObject))
  93.           treeCnr->detailsContainer().showObject(currentObject);
  94.        else {
  95.          treeCnr->detailsContainer().addObjectAfter(currentObject, lastObject);
  96.        }
  97.        lastObject = currentObject;
  98.      }
  99.   }
  100.   if (needsRefresh) {
  101.      treeCnr->detailsContainer().enableUpdate();
  102.      expandedObject->refresh(&(treeCnr->detailsContainer()));
  103.   }
  104.   return true;
  105.  
  106. }
  107.  
  108.  
  109. Boolean DetailsTreeHandler :: inuseChanged(ICnrEmphasisEvent& evt)
  110. {
  111.   IFUNCTRACE_DEVELOP()
  112.   // Not currently implemented
  113.   return true;
  114. }
  115.  
  116. Boolean DetailsTreeHandler :: cursoredChanged(ICnrEmphasisEvent& evt)
  117. {
  118.   IFUNCTRACE_DEVELOP()
  119.   IContainerControl* thisContainer = (IContainerControl*)evt.controlWindow();
  120.   IContainerControl* otherContainer;
  121.  
  122.   if(thisContainer==treeCnr)
  123.     otherContainer = &(treeCnr->detailsContainer());
  124.   else
  125.     otherContainer = treeCnr;
  126.  
  127.  
  128.   Boolean fAcquired;
  129.   try {
  130.      fAcquired = thisContainer->isCursored(evt.object());
  131.      if(fAcquired) {
  132.        if (!treeCnr->cursorMoveStarted()) {
  133.          treeCnr->setCursorMoveStarted();
  134.          try {
  135.            otherContainer->setCursor(evt.object());
  136.          } catch (IException&) {}
  137.        }
  138.        else
  139.          treeCnr->setCursorMoveStarted(false);
  140.      }
  141.   } 
  142.   catch(IException&) {}
  143.  
  144.   return true;
  145. }
  146.  
  147.  
  148. Boolean DetailsTreeHandler :: windowScrolled(ICnrScrollEvent& evt)
  149. {
  150.   IFUNCTRACE_DEVELOP()
  151.   IContainerControl* thisContainer = (IContainerControl*)evt.controlWindow();
  152.   IContainerControl* otherContainer;
  153.  
  154.   if(thisContainer==treeCnr) {
  155.     ITRACE_DEVELOP("Tree scrolled")
  156.     otherContainer = &(treeCnr->detailsContainer());
  157.   }
  158.   else {
  159.     ITRACE_DEVELOP("Details scrolled")
  160.     otherContainer = treeCnr;
  161.   }
  162.  
  163.   // Only worry about Vertical Scroll - scroll the Tree View the
  164.   // same amount.
  165.   if(evt.isVertical()) {
  166.      if (!treeCnr->scrollStarted()) {
  167.        treeCnr->setScrollStarted(true);
  168.        otherContainer->scrollVertically(evt.amount());
  169.        ITRACE_DEVELOP(IString("Scrolled  vertically(")+IString(evt.amount()))
  170.      }
  171.      else
  172.        treeCnr->setScrollStarted(false);
  173.   }
  174.   return true;
  175. }
  176.  
  177. Boolean DetailsTreeHandler :: fontChanged(IEvent& evt)
  178. {
  179.   IFUNCTRACE_DEVELOP()
  180.   IContainerControl* thisContainer = (IContainerControl*)evt.window();
  181.   IContainerControl* otherContainer;
  182.  
  183.   if(thisContainer==treeCnr) {
  184.     otherContainer = &(treeCnr->detailsContainer());
  185.   }
  186.   else {
  187.     otherContainer = treeCnr;
  188.   }
  189.  
  190.  
  191.   // We need to keep track of the top level entry to this    
  192.   // function so that we avoid a ping-pong affect that could 
  193.   // occur between the two containers on font a change. This 
  194.   // works since the font change notification is WinSent.    
  195.   Boolean fNested = treeCnr->fontChangeStarted();
  196.   treeCnr->setFontChangeStarted(true);
  197.  
  198.  
  199.   if(!fNested) {
  200.        IFont newFont(thisContainer);
  201.        otherContainer->setFont(newFont);
  202.        treeCnr->setFontChangeStarted(false);
  203.   }
  204.   return false;
  205. }
  206.  
  207.  
  208.