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

  1. //************************************************************
  2. // Problem Determination  - Trace Queue Browser
  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 <ibase.hpp>
  9. #ifdef IC_WIN
  10.   #ifndef WIN32_LEAN_AND_MEAN
  11.     #define WIN32_LEAN_AND_MEAN
  12.   #endif
  13.   #include <windows.h>
  14. #endif
  15.  
  16. #include <icmdevt.hpp>
  17. #include <iclipbrd.hpp>
  18. #include <ifont.hpp>
  19. #include <imsgbox.hpp>
  20. #include "trbrowse.hpp"
  21. #include "filtdlg.hpp"
  22. #include "trbrowse.h"
  23.  
  24. // set of strings to include
  25. FilterSet      fsIncludedSet;
  26.  
  27. class MyContainerFilter : public IContainerControl::FilterFn {
  28. /**************************************************************************
  29. * Class:   MyContainerFilter                                              *
  30. *                                                                         *
  31. * Purpose: filter out objects not matching fsIncludedSet.                 *
  32. *                                                                         *
  33. **************************************************************************/
  34. public:
  35. /*------------------------ Object Filtering -------------------------------*/
  36. virtual Boolean
  37.   isMemberOf  ( IContainerObject* object,
  38.                 IContainerControl* container) const;
  39. };
  40.  
  41.  
  42. /*------------------------------------------------------------------------------
  43. | TraceBrowser::TraceBrowser                                                   |
  44. ------------------------------------------------------------------------------*/
  45. TraceBrowser::TraceBrowser ( const IString& queueName )
  46.        : IFrameWindow  (WND_MAIN,
  47.                         IFrameWindow::defaultStyle() |
  48.                         IFrameWindow::minimizedIcon),
  49.          queueHandler  (*this),
  50.          commandHandler(*this),
  51.          cnrWin        (IC_FRAME_CLIENT_ID, this, this, IRectangle(),
  52.                         IContainerControl::defaultStyle() |
  53.                         IContainerControl::noSharedObjects ),
  54.          reader        (queueName, this->handle()),
  55.          thread        (),
  56.          menuBar       (WND_MAIN, this),
  57.          fautoScroll   (false),
  58.          fwaitCursor   (false)
  59. {
  60.   // Attach handlers to our frame.
  61.   queueHandler.handleEventsFor(this);
  62.   commandHandler.handleEventsFor(this);
  63.  
  64.   // Change the font & show text view with extended selection.
  65.   IFont font("Courier", 8);
  66.   container()
  67.     .showTextView()
  68.     .setExtendedSelection()
  69.     .setFont(font);
  70.  
  71.   // Make the container the client and start the queue
  72.   (*this)
  73.     .setClient(&container())
  74.     .postEvent(START_QUEUE);
  75. }
  76.  
  77. /*------------------------------------------------------------------------------
  78. | TraceBrowser::enableReader                                                   |
  79. ------------------------------------------------------------------------------*/
  80. TraceBrowser&  TraceBrowser::enableReader( Boolean enable )
  81. {
  82.   queueReader().enable( enable );
  83.   if ( queueReader().isEnabled() )
  84.      menuBar.setText(MI_START, STOP_TEXT);
  85.   else
  86.      menuBar.setText(MI_START, START_TEXT);
  87.   return *this;
  88. }
  89.  
  90. /*------------------------------------------------------------------------------
  91. | IBase::Boolean TraceBrowser::isReaderEnabled                                 |
  92. ------------------------------------------------------------------------------*/
  93. IBase::Boolean TraceBrowser::isReaderEnabled( ) const
  94. {
  95.    return ((TraceBrowser*)this)->queueReader().isEnabled() ;
  96. }
  97.  
  98. /*------------------------------------------------------------------------------
  99. | IBase::Boolean TraceBrowser::isMessageWaiting                                |
  100. ------------------------------------------------------------------------------*/
  101. IBase::Boolean TraceBrowser::isMessageWaiting() const
  102. {
  103.    Boolean result = false;
  104.    // Check for any pending messages in the user range
  105. #ifdef __WINDOWS__
  106.    MSG msg;
  107.    result = PeekMessage( &msg,
  108.                          this->handle(),
  109.                          USER_MESSAGE_START, USER_MESSAGE_END,
  110.                          PM_NOREMOVE );
  111. #endif
  112.    return result;
  113. }
  114.  
  115. /*------------------------------------------------------------------------------
  116. | IBase::Boolean TraceBrowser::setWaitCursor                                   |
  117. ------------------------------------------------------------------------------*/
  118. TraceBrowser& TraceBrowser::setWaitCursor( Boolean wait )
  119. {
  120.   if (wait && !fwaitCursor)
  121.     {
  122.     this->setMousePointer( ISystemPointerHandle(
  123.                                ISystemPointerHandle::wait ) );
  124.     fwaitCursor = true;
  125.     }
  126.   else if (!wait && fwaitCursor)
  127.     {
  128.     this->setMousePointer( IPointerHandle( 0 ) );
  129.     fwaitCursor = false;
  130.     }
  131.   return *this;
  132. }
  133.  
  134. /*------------------------------------------------------------------------------
  135. | TraceBrowser::enableAutoScroll                                               |
  136. ------------------------------------------------------------------------------*/
  137. TraceBrowser&  TraceBrowser::enableAutoScroll( Boolean enable )
  138. {
  139.    fautoScroll=enable;
  140.    menuBar.checkItem( MI_AUTOSCROLL, fautoScroll );
  141.    return *this;
  142. }
  143.  
  144. /*------------------------------------------------------------------------------
  145. | IBase::Boolean TraceCommandHandler::command                                  |
  146. ------------------------------------------------------------------------------*/
  147. IBase::Boolean TraceCommandHandler::command ( ICommandEvent& event )
  148. {
  149.    Boolean result = true;
  150.    switch ( event.commandId() )
  151.       {
  152.       //    MI_FILE
  153.       case  MI_EXIT        :
  154.          browserWindow.close();
  155.          break;
  156.  
  157.       //    MI_SELECTED
  158.       case  MI_CUT         :
  159.       case  MI_COPY        :
  160.          {
  161.          // Empty the clipboard to establish ownership
  162.          IClipboard clipboard(event.window()->handle());
  163.          clipboard.empty();
  164.  
  165.          // Find the cursored object in the container.
  166.          IContainerControl& container = browserWindow.container();
  167.          IContainerObject* cursoredObject = container.cursoredObject();
  168.  
  169.          // If the cursored object is selected, loop through all other
  170.          // selected objects and store the objects in our set.
  171.          if (container.isSelected(cursoredObject))
  172.            {
  173.            IString objectsAsText("");
  174.            IContainerControl::ObjectCursor cursor(container,
  175.                                                   IContainerObject::selected);
  176.            for (cursor.setToFirst(); cursor.isValid(); cursor.setToNext())
  177.              {
  178.              IContainerObject* selectedObject = container.objectAt(cursor);
  179.              objectsAsText = objectsAsText +  selectedObject->iconText();
  180.              }
  181.  
  182.            // Put the data on the clipboard.
  183.            clipboard.setText(objectsAsText);
  184.  
  185.            // If this is a Cut,  delete selected objects
  186.            if (event.commandId() == MI_CUT)
  187.              {
  188.              container.deleteSelectedObjects();
  189.              }
  190.            }
  191.          else
  192.            {
  193.            // cursored object not selected.  Put the cursored object
  194.            // on clipboard.
  195.            clipboard.setText( cursoredObject->iconText() );
  196.  
  197.            // If this is a Cut request delete the cursored object.
  198.            if (event.commandId() == MI_CUT)
  199.              {
  200.              container.removeObject(cursoredObject);
  201.              delete cursoredObject;
  202.              }
  203.            }
  204.          }
  205.          break;
  206.  
  207.       case  MI_CLEAR       :
  208.          {
  209.          browserWindow.postEvent( DELETE_ALL );
  210.          }
  211.          break;
  212.  
  213.       case  MI_SELECTALL   :
  214.          {
  215.          IContainerControl::ObjectCursor oc( browserWindow.container() );
  216.          for (oc.setToFirst(); oc.isValid(); oc.setToNext())
  217.             {
  218.             browserWindow.container().setSelected( oc.current() );
  219.             }
  220.          }
  221.          break;
  222.       case  MI_DESELECTALL :
  223.          {
  224.          IContainerControl::ObjectCursor oc( browserWindow.container() );
  225.          for (oc.setToFirst(); oc.isValid(); oc.setToNext())
  226.             {
  227.             browserWindow.container().removeSelected( oc.current() );
  228.             }
  229.          }
  230.          break;
  231.  
  232.  
  233.       //    MI_VIEW
  234.       case  MI_INCLUDE     :
  235.          {
  236.          // disable tracing
  237.          Boolean wasEnabled = browserWindow.isReaderEnabled();
  238.          if (wasEnabled)
  239.             browserWindow.enableReader( false );
  240.          // filter some objects
  241.          FilterDialog   dialog( fsIncludedSet, &browserWindow );
  242.          dialog.showModally();
  243.  
  244.          MyContainerFilter filterfn;
  245.          browserWindow.container().filter( filterfn );
  246.          // re-enable tracing
  247.          if (wasEnabled)
  248.             browserWindow.enableReader( true );
  249.          }
  250.          break;
  251.  
  252.       case  MI_INCLUDEALL  :
  253.          {
  254.          // restore all objects
  255.          browserWindow.container().filter( );
  256.          }
  257.          break;
  258.  
  259.       case  MI_INPUTFILTER   :
  260.          {
  261.          // disable tracing and lock the filter list
  262.          Boolean wasEnabled = browserWindow.isReaderEnabled();
  263.          if (wasEnabled)
  264.             browserWindow.enableReader( false );
  265.          IResourceLock lock( browserWindow.queueReader().filterLock() );
  266.          // show the dialog
  267.          FilterDialog   dialog( browserWindow.queueReader().inputFilterSet(),
  268.                                 &browserWindow );
  269.          dialog.showModally();
  270.          // re-enable tracing.  Lock freed on exit of block.
  271.          if (wasEnabled)
  272.             browserWindow.enableReader( true );
  273.          }
  274.          break;
  275.  
  276.       case  MI_AUTOSCROLL  :
  277.          // toggle autoscroll
  278.          browserWindow.enableAutoScroll( !browserWindow.isAutoScroll() );
  279.          break;
  280.  
  281.  
  282.       //    MI_START
  283.       case  MI_START:
  284.          // Toggle the enabled state of the queue
  285.          browserWindow.enableReader( !browserWindow.isReaderEnabled() );
  286.          break;
  287.  
  288.       //    MI_HELP
  289.       case  MI_ABOUT       :
  290.          {
  291.          IMessageBox msgbox( &browserWindow );
  292.          msgbox.show( ABOUT_TEXT, IMessageBox::information );
  293.          }
  294.          break;
  295.       default:
  296.          result = false;
  297.       }
  298.  
  299.    return result;
  300. }
  301.  
  302. /*------------------------------------------------------------------------------
  303. | TraceBrowserHandler::dispatchHandlerEvent                                    |
  304. ------------------------------------------------------------------------------*/
  305. IBase::Boolean  TraceBrowserHandler::dispatchHandlerEvent ( IEvent & event )
  306. {
  307.   switch (event.eventId())
  308.   {
  309.      case ADD_OBJECT:
  310.      {
  311.        browserWindow.container()
  312.          .addObject((IContainerObject*)(void*)event.parameter1());
  313.  
  314.        if ( !browserWindow.isMessageWaiting() &&
  315.             browserWindow.isAutoScroll() )
  316.           browserWindow.container()
  317.              .scrollToObject((IContainerObject*)(void*)event.parameter1());
  318.        return true;
  319.      }
  320.      case START_QUEUE:
  321.      {
  322.        // Start Reader in a separate thread.
  323.        browserWindow.readerThread()
  324.           .start(new IThreadMemberFn<QueueReader>
  325.                  (browserWindow.queueReader(),
  326.                   QueueReader::run));
  327.        return true;
  328.      }
  329.      case DELETE_ALL :
  330.        // Delete all objects.
  331.        browserWindow.container()
  332.           .setRefreshOff()
  333.           .deleteAllObjects()
  334.           .setRefreshOn()
  335.           .refresh();
  336.        break;
  337.  
  338.      default:
  339.         break;
  340.   } // endswitch
  341.   return false;
  342. }
  343.  
  344.  
  345. /*------------------------------------------------------------------------------
  346. | IBase::Boolean  MyContainerFilter::isMemberOf                                |
  347. ------------------------------------------------------------------------------*/
  348. IBase::Boolean  MyContainerFilter::isMemberOf  ( IContainerObject* object,
  349.                                                  IContainerControl* container) const
  350. {
  351.    Boolean result = true;
  352.    FilterSet::Cursor cursor( fsIncludedSet );
  353.    for (cursor.setToFirst(); (result && cursor.isValid()); cursor.setToNext() )
  354.       {
  355.       if ( object->iconText().indexOf( cursor.element() ) )
  356.          result = false;
  357.       }
  358.    return fsIncludedSet.isExcludeList ? result : !result ;
  359. }
  360.