home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powerGUI_sampleCode.zip / CNR / TREEDET / PARTLIST.CPP < prev    next >
Text File  |  1996-10-29  |  12KB  |  337 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_WINSTDCNR
  11.    #define INCL_WINSYS
  12.    #include <os2.h>
  13. }
  14.  
  15. #include <iframe.hpp>
  16. #include <icnrctl.hpp>
  17. #include <icnrcol.hpp>
  18. #include <isplitcv.hpp>
  19. #include <imcelcv.hpp>
  20. #include <istattxt.hpp>
  21. #include <iscroll.hpp>
  22. #include <itrace.hpp>
  23. #include <isizehdr.hpp>
  24. #include "partlist.hpp"
  25. #include "partlist.h"
  26. #include "partobj.hpp"
  27. #include "treedetc.hpp"
  28. #include "treedeth.hpp"
  29. #include <malloc.h>
  30.  
  31. // A resize handler to hide the tree view scroll bar
  32. class ScrollBarResizeHandler : public IResizeHandler
  33. {
  34. protected:
  35. virtual Boolean
  36.   windowResize ( IResizeEvent& event )
  37.   {
  38.      if (event.newSize() != ISize(0,0))
  39.         event.window()->sizeTo(ISize(0,0));
  40.      return true;
  41.   }
  42. };
  43.  
  44. PartsList :: ~PartsList ( )
  45. {
  46.   IFUNCTRACE_DEVELOP()
  47.   // Note we rely on Auto Delete to clean up the
  48.   // objects for windows contained herein.
  49.   delete treeHandler;
  50.   delete colorHandler;
  51. }
  52.  
  53. PartsList :: PartsList ( )
  54.                 : IFrameWindow(EX_PARTLIST_FRAME ),
  55.                   colorChanged(false)
  56. {
  57.   IFUNCTRACE_DEVELOP()
  58.   // Create a frame window with a split canvas client
  59.   //            left  side = Multi-Cell Canvas
  60.   //            right side = Multi-Cell Canvas
  61.   // There is also a static text field on top
  62.   // of the Tree view scroll Bar
  63.   //
  64.   //  --------------------------------------------
  65.   //  |          |  ||   Empty Row for Pad       |
  66.   //  |          |S ||---------------------------|
  67.   //  |          |t ||                           |
  68.   //  |          |a ||                           |
  69.   //  |          |t ||                           |
  70.   //  |  Tree    |i ||     Details               |
  71.   //  |  Cnr     |c ||       Cnr                 |
  72.   //  |          |  ||                           |
  73.   //  |          |T ||                           |
  74.   //  |          |e ||                           |
  75.   //  |          |x ||                           |
  76.   //  |          |t ||                           |
  77.   //  --------------------------------------------
  78.   //
  79.  
  80.   // Create a split canvas as a client
  81.   canvas = new ISplitCanvas (EX_PARTLIST_CANVAS,
  82.                               this, this);
  83.   this->setClient(canvas);
  84.  
  85.   // Create a MultiCell canvas for both the left window (to
  86.   // contain the tree) and the right (to contain the
  87.   // details view)
  88.   leftMCell  = new IMultiCellCanvas(EX_PARTLIST_LEFTCANVAS,
  89.                               canvas, this);
  90.   rightMCell = new IMultiCellCanvas(EX_PARTLIST_RIGHTCANVAS,
  91.                               canvas, this);
  92.  
  93.   // Create the tree and a Static Text field for the
  94.   // left canvas.  The static text is used to overlay
  95.   // the tree view scroll bar (the container and
  96.   // the static text field share a column)
  97.   treeCnr        = new DetailsTreeContainer(EX_PARTLIST_TREE,
  98.                                          leftMCell, this);
  99.  
  100.  
  101.   // Add the cells to the left canvas
  102.   (*leftMCell)
  103.     .addToCell(treeCnr, 1, 1, 2, 2)      
  104.     .setColumnWidth(2, IScrollBar::systemScrollBarWidth())  
  105.     .setColumnWidth(1, 50, true)
  106.     .setRowHeight(1, 10, true)   
  107.     .setRowHeight(2, IScrollBar::systemScrollBarWidth());
  108.  
  109.  
  110.   // Create the details container and put it into row 2
  111.   // with some pad for alignment,
  112.   detailsCnr  = new IContainerControl(EX_PARTLIST_DETAILS,
  113.                                       rightMCell, this);
  114.   (*rightMCell)
  115.     .addToCell(detailsCnr, 1, 2)
  116.     .setRowHeight(1,6)
  117.     .setRowHeight(2,30, true)
  118.     .setColumnWidth(1, 10, true);
  119.  
  120.   // Wrapper the Tree view scroll bar, turn off updating for it,
  121.   // and add a handler to keep its size at ISize(0,0).
  122.   treeScroll = new IScrollBar(CID_VSCROLL, treeCnr);
  123.   treeScroll->disableUpdate();
  124.   treeScroll->sizeTo(ISize(0,0));
  125.   ScrollBarResizeHandler* resizeHandler = new ScrollBarResizeHandler();
  126.   resizeHandler->handleEventsFor(treeScroll);
  127.  
  128.  
  129.   // Notify the DetailsTreeContainer of it's details view
  130.   treeCnr->setDetailsContainer(detailsCnr);
  131.  
  132.   // Set the appropriate views
  133.   treeCnr->showTreeTextView();
  134.   detailsCnr->showDetailsView();
  135.  
  136.  
  137.   // We show a details title and
  138.   // and set the line spacing. 
  139.   treeCnr->showTitle();
  140.   treeCnr->setTitle("Object");         // RDL
  141.   treeCnr->setLineSpacing(3);          // RDL
  142.   detailsCnr->setLineSpacing(3);       // RDL
  143.  
  144.   // Create the handlers for syncing changes
  145.   // Note: handleEventsFor is done in the constructor.
  146.   // 1) Font
  147.   treeHandler = new DetailsTreeHandler(treeCnr);
  148.  
  149.   // 2) Color
  150.   colorHandler = new ColorChangeHandler(this);
  151.  
  152.  
  153. #ifdef IC_DEVELOP
  154. // For testing, add the iconViewText column
  155.   IContainerColumn* pcol;
  156.   pcol = new IContainerColumn(IContainerColumn::isIconViewText);
  157.   pcol->setHeadingText( "Test Column");
  158.   pcol->showSeparators(IContainerColumn::horizontalSeparator);
  159.   pcol->justifyData(IContainerColumn::bottom, IContainerColumn::left);
  160.   detailsCnr->addColumn(pcol);
  161.   detailsCnr->setDetailsViewSplit(pcol);
  162.   detailsCnr->showSplitBar();
  163. #endif
  164.   // Setup the headings for the columns.
  165.   ExecutablePart::setHeadingText(
  166.        IApplication::current().userResourceLibrary().loadString(EX_COLUMN_TRACEABLE),
  167.        ExecutablePart::kTraceableColumn);
  168.   ExecutablePart::setHeadingText(
  169.        IApplication::current().userResourceLibrary().loadString(EX_COLUMN_ENABLED),
  170.        ExecutablePart::kEnabledPartColumn);      
  171.   ExecutablePart::setHeadingText(
  172.        IApplication::current().userResourceLibrary().loadString(EX_COLUMN_GENTRACE),
  173.        ExecutablePart::kGeneratesTraceColumn);   
  174.   ExecutablePart::setHeadingText(
  175.        IApplication::current().userResourceLibrary().loadString(EX_COLUMN_TRIGGER),
  176.        ExecutablePart::kContainsTriggerColumn);  
  177.  
  178.   // Create the columns.
  179.   ExecutablePart::createAllColumnsFor(*detailsCnr); 
  180.  
  181.  
  182.   // add some objects
  183.   loadObjects ();
  184.  
  185.   // Auto Delete our objects when the PM Window gets destroyed
  186.   canvas->setAutoDeleteObject();
  187.   leftMCell->setAutoDeleteObject();
  188.   rightMCell->setAutoDeleteObject();
  189.   treeScroll->setAutoDeleteObject();
  190.   treeCnr->setAutoDeleteObject();
  191.   treeCnr->setDeleteObjectsOnClose();
  192.   detailsCnr->setAutoDeleteObject();
  193.   detailsCnr->setDeleteColumnsOnClose();
  194.   detailsCnr->setDeleteObjectsOnClose();
  195.  
  196. detailsCnr->refresh();
  197.  
  198. }
  199.  
  200. PartsList& PartsList :: open ( )
  201. {
  202.   if ( isMinimized() )
  203.     restore();
  204.   setFocus();
  205.   show();
  206.   return *this;
  207. }
  208.  
  209.  
  210.  
  211. // Load Some Executable Parts into the container
  212. PartsList& PartsList :: loadObjects ( )
  213. {
  214.   ExecutablePart *partExe, *partObj, *partFunc;
  215.  
  216.   partExe = new ExecutablePart("CPPOOU3.DLL");
  217.   treeContainer().addObject(partExe);
  218.     partObj = new ExecutablePart("IWINDOW2.OBJ");
  219.     treeContainer().addObject(partObj, partExe);
  220.       partFunc = new ExecutablePart("IWindow::show");
  221.       treeContainer().addObject(partFunc, partObj);
  222.       partFunc = new ExecutablePart("IWindow::hide");
  223.       treeContainer().addObject(partFunc, partObj);
  224.       partFunc = new ExecutablePart("IWindow::enableUpdate");
  225.       treeContainer().addObject(partFunc, partObj);
  226.     partObj = new ExecutablePart("ICNROBJ0.OBJ");
  227.     treeContainer().addObject(partObj, partExe);
  228.       partFunc = new ExecutablePart("IContainerObject::enableDataUpdate");
  229.       treeContainer().addObject(partFunc, partObj);
  230.       partFunc = new ExecutablePart("IContainerObject::setIcon");
  231.       treeContainer().addObject(partFunc, partObj);
  232.       partFunc = new ExecutablePart("IContainerObject::setIconText");
  233.       treeContainer().addObject(partFunc, partObj);
  234.   partExe = new ExecutablePart("CPPOM30.DLL");
  235.   treeContainer().addObject(partExe);
  236.     partObj = new ExecutablePart("CTORDTOR.OBJ");
  237.     treeContainer().addObject(partObj, partExe);
  238.       partFunc = new ExecutablePart("__ctdtused");
  239.       treeContainer().addObject(partFunc, partObj);
  240.       partFunc = new ExecutablePart("__ctordtorTerm");
  241.       treeContainer().addObject(partFunc, partObj);
  242.   partExe = new ExecutablePart("CPPOOB3.DLL");
  243.   treeContainer().addObject(partExe);
  244.     partObj = new ExecutablePart("IEXCBASE.OBJ");
  245.     treeContainer().addObject(partObj, partExe);
  246.       partFunc = new ExecutablePart("IOutOfWindowResource::~IOutOfWindowResource");
  247.       treeContainer().addObject(partFunc, partObj);
  248.       partFunc = new ExecutablePart("IException::terminate");
  249.       treeContainer().addObject(partFunc, partObj);
  250.     partObj = new ExecutablePart("IMSGTEXT.OBJ");
  251.     treeContainer().addObject(partObj, partExe);
  252.       partFunc = new ExecutablePart("IMessageText::setDefaultText");
  253.       treeContainer().addObject(partFunc, partObj);
  254.  
  255.   return *this;
  256. }
  257.  
  258. IContainerControl& PartsList :: otherContainer (
  259.                   const IContainerControl& opposite)
  260. {
  261.   if (&opposite == treeCnr)
  262.      return *detailsCnr;
  263.   else
  264.      return *treeCnr;
  265. }
  266.  
  267.  
  268. ColorChangeHandler :: ColorChangeHandler ( PartsList* partsList)
  269. {
  270.   IFUNCTRACE_DEVELOP()
  271.   this->partsList = partsList;
  272.   handleEventsFor(&partsList->leftMultiCell());
  273.   handleEventsFor(&partsList->rightMultiCell());
  274. //  handleEventsFor(&partsList->treeScrollHide());
  275.   handleEventsFor(&partsList->treeContainer());
  276.   handleEventsFor(&partsList->detailsContainer());
  277. }
  278.  
  279.  
  280.  
  281. Boolean ColorChangeHandler :: dispatchHandlerEvent ( IEvent& evt)
  282. {
  283.    if(evt.eventId() == WM_PRESPARAMCHANGED)
  284.    {
  285.       if(evt.parameter1() == PP_BACKGROUNDCOLOR )
  286.          return backgroundColorChanged(evt);
  287.    }
  288.  
  289.  
  290.   return false;
  291. }
  292.  
  293. Boolean ColorChangeHandler :: backgroundColorChanged(IEvent& evt)
  294. {
  295.   // We need to keep track of the top level entry to this
  296.   // function so that we avoid a ping-pong affect that could 
  297.   // occur when the notification is received more then once. 
  298.   Boolean fNested = partsList->colorChangeStarted();
  299.   partsList->setColorChangeStarted(true);
  300.  
  301.  
  302.   if(!fNested) {
  303.        IWindow* receiver=evt.window();
  304.        // The following will change with new color scheme
  305.        IColor color(IColor::white);
  306.  
  307.        // Determine the color of the changed window.
  308.        if (receiver==&partsList->leftMultiCell() 
  309.            || receiver == &partsList->rightMultiCell())
  310.           color = ((IMultiCellCanvas*)receiver)->color();
  311.        else if (receiver==&partsList->treeContainer()
  312.            || receiver==&partsList->detailsContainer())
  313.           color = ((IContainerControl*)receiver)->color(IContainerControl::background);
  314.        else if (receiver==&partsList->treeScrollHide())
  315.           color = partsList->treeScrollHide().color(IStaticText::background);
  316.  
  317.        // Apply the new color to the other windows in the SplitCanvas
  318.           partsList->rightMultiCell().setColor(color);
  319.        if(receiver!=&partsList->rightMultiCell())
  320.           partsList->rightMultiCell().setColor(color);
  321.        if(receiver!=&partsList->leftMultiCell())
  322.           partsList->leftMultiCell().setColor(color);
  323.        if(receiver!=&partsList->splitCanvas())
  324.           partsList->splitCanvas().setColor(ISplitCanvas::splitBarMiddle, color);
  325.        if(receiver!=&partsList->treeContainer())
  326.           partsList->treeContainer().setColor(IContainerControl::background, color);
  327.        if(receiver!=&partsList->detailsContainer())
  328.           partsList->detailsContainer().setColor(IContainerControl::background, color);
  329.        if(receiver!=&partsList->treeScrollHide())
  330.           partsList->treeScrollHide().setColor(IStaticText::background, color);
  331.        partsList->setColorChangeStarted(false);
  332.   }
  333.  
  334.   return false;
  335. }
  336.  
  337.