home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powergui.iso / powergui / genhdrs / mouseclk / mouseclk.cpp < prev   
Text File  |  1996-10-29  |  8KB  |  311 lines

  1. //*********************************************************
  2. // Resuable Handlers - Processing Mouse Clicks
  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 <icolor.hpp>
  9. #include <ientryfd.hpp>
  10. #include <ifont.hpp>
  11. #include <iframe.hpp>
  12. #include <iapp.hpp>
  13. #include <igroupbx.hpp>
  14. #include <ilistbox.hpp>
  15. #include <imoushdr.hpp>
  16. #include <imcelcv.hpp>
  17. #include <ipoint.hpp>
  18. #include <iradiobt.hpp>
  19. #include <isetcv.hpp>
  20. #include <istattxt.hpp>
  21. #include <istring.hpp>
  22. #include <icconst.h>
  23.  
  24. #define ID_HEADING               1
  25. #define ID_LIST_BOX              2
  26. #define ID_CANVAS                3
  27. #define ID_STATIC_TEXT           4
  28. #define ID_RADIO_BUTTON          5
  29. #define ID_GROUP_BOX             6
  30. #define ID_ENTRY_FIELD           7
  31. #define ID_DISABLED_ENTRY_FIELD  8
  32.  
  33. class MouseClickWindow : public IVBase {
  34. public:
  35.   MouseClickWindow ( );
  36. MouseClickWindow
  37.  &showClickInfo    ( const IWindow* eventWindow,
  38.                      const IWindowHandle& clicked,
  39.                      IString button,
  40.                      IString stateChange,
  41.                      const IPoint& mousePosition );
  42. protected:
  43. IString
  44.   nameForId        ( unsigned long id );
  45. private:
  46. MouseClickWindow   ( const MouseClickWindow& );
  47. MouseClickWindow
  48.  &operator=        ( const MouseClickWindow& );
  49. IFrameWindow
  50.   frame;
  51. IMultiCellCanvas
  52.   clientWindow;
  53. IStaticText
  54.   heading;
  55. IListBox
  56.   listBox;
  57. ISetCanvas
  58.   canvas;
  59. IStaticText
  60.   staticText;
  61. IRadioButton
  62.   radioButton;
  63. IGroupBox
  64.   groupBox;
  65. IEntryField
  66.   entryField,
  67.   disabledEntryField;
  68. unsigned long
  69.   clickEntries,
  70.   maxClickEntries;
  71. class MouseClickHandler : public IMouseHandler {
  72.   public:
  73.   MouseClickHandler ( MouseClickWindow* window )
  74.     : clickWindow( window )
  75.     { }
  76.   protected:
  77.   virtual Boolean
  78.     mouseClicked    ( IMouseClickEvent& event );
  79.   private:
  80.   IString
  81.     textForButton   ( IMouseClickEvent::MouseButton button );
  82.   IString
  83.     textForAction   ( IMouseClickEvent::MouseAction action );
  84.   MouseClickWindow
  85.    *clickWindow;
  86.   };
  87. MouseClickHandler
  88.   mouseHdr;
  89. };
  90.  
  91. void main ( )
  92. {
  93.   MouseClickWindow window;
  94.   IApplication::current().run();
  95. }
  96.  
  97. MouseClickWindow :: MouseClickWindow ( )
  98.   : frame( "Mouse-Click Example" ),
  99.     clientWindow( IC_FRAME_CLIENT_ID, &frame, &frame ),
  100.     heading( ID_HEADING, &clientWindow, &clientWindow ),
  101.     listBox( ID_LIST_BOX, &clientWindow, &clientWindow ),
  102.     canvas( ID_CANVAS, &clientWindow, &clientWindow ),
  103.     staticText( ID_STATIC_TEXT, &canvas, &canvas ),
  104.     radioButton( ID_RADIO_BUTTON, &canvas, &canvas ),
  105.     groupBox( ID_GROUP_BOX, &canvas, &canvas ),
  106.     entryField( ID_ENTRY_FIELD, &canvas, &canvas ),
  107.     disabledEntryField( ID_DISABLED_ENTRY_FIELD, &canvas, &canvas ),
  108.     clickEntries( 0 ),
  109.     maxClickEntries( 100 ),
  110.     mouseHdr( this )
  111. {
  112.   heading
  113.    .setText( "      window() windowUnderPointer()"
  114.              " mouseButton() mouseAction() mousePosition()" );
  115.  
  116.   staticText
  117.    .setText( "Static Text" )
  118.    .setForegroundColor( IColor::red )
  119.    .setBackgroundColor( IColor::yellow );
  120.  
  121.   radioButton
  122.    .setText( "Radio Button" )
  123.    .setForegroundColor( IColor::darkGreen )
  124.    .setBackgroundColor( IColor::yellow );
  125.  
  126.   groupBox.setText( "Group Box  " );  // Adjust for calcMinimumSize.
  127.  
  128.   entryField
  129.    .setLimit( 16 )
  130.    .setText( "Entry Field" );
  131.  
  132.   disabledEntryField
  133.    .setLimit( 16 )
  134.    .setText( "Disabled" )
  135.    .disable();
  136.  
  137.   clientWindow
  138.    .addToCell( &heading, 2, 2 )
  139.    .addToCell( &listBox, 2, 3 )
  140.    .addToCell( &canvas, 2, 5 )
  141.    .setColumnWidth( 2, 0, true )
  142.    .setColumnWidth( 3, IMultiCellCanvas::defaultCell().width() )
  143.    .setRowHeight( 3, 0, true )
  144.    .setRowHeight( 6, IMultiCellCanvas::defaultCell().height() );
  145.  
  146.   IFont fixedFont( "Courier", 8 );  // For alignment.
  147.   clientWindow.setFont( fixedFont );
  148.  
  149.   canvas.setBackgroundColor( IColor::green );
  150.  
  151.   mouseHdr              // Attach to all windows.
  152.    .handleEventsFor( &frame )
  153.    .handleEventsFor( &clientWindow )
  154.    .handleEventsFor( &heading )
  155.    .handleEventsFor( &listBox )
  156.    .handleEventsFor( &canvas )
  157.    .handleEventsFor( &staticText )
  158.    .handleEventsFor( &radioButton )
  159.    .handleEventsFor( &groupBox )
  160.    .handleEventsFor( &entryField )
  161.    .handleEventsFor( &disabledEntryField );
  162.  
  163.   frame
  164.    .setClient( &clientWindow )
  165.    .setFocus()
  166.    .show();
  167. }
  168.  
  169. MouseClickWindow&
  170.   MouseClickWindow::showClickInfo ( const IWindow* eventWindow,
  171.                                     const IWindowHandle& clicked,
  172.                                     IString button,
  173.                                     IString stateChange,
  174.                                     const IPoint& mousePosition )
  175. {
  176.   if ( listBox.count() > maxClickEntries )
  177.   {                     // Don't let the list box grow too big.
  178.      listBox.remove( 0 );  // Remove top entry.
  179.   }
  180.  
  181.   IString
  182.     handlerWindow = nameForId( eventWindow->id() );
  183.   IWindow
  184.    *window = IWindow::windowWithHandle( clicked );
  185.   IString
  186.     clickedWindow( this->nameForId( window ? window->id() : 0 ) ),
  187.     match( eventWindow == window ? "*" : " " );
  188.  
  189.   listBox
  190.    .addAsLast( IString( ++clickEntries ) + ": "
  191.                  + match + handlerWindow + "  "
  192.                  + clickedWindow + "  "
  193.                  + button + "   "
  194.                  + stateChange + "  "
  195.                  + mousePosition.asString() );
  196.   listBox
  197.    .setTop( listBox.count() );
  198.  
  199.   return *this;
  200. }
  201.  
  202. IString MouseClickWindow::nameForId ( unsigned long id )
  203. {
  204.   IString
  205.     name;
  206.   switch ( id )
  207.   {
  208.     case IC_DEFAULT_FRAME_ID:
  209.        name = "Frame window ";
  210.        break;
  211.     case IC_FRAME_CLIENT_ID:
  212.        name = "Client window";
  213.        break;
  214.     case ID_HEADING:
  215.        name = "Heading text ";
  216.        break;
  217.     case ID_LIST_BOX:
  218.        name = "List Box     ";
  219.        break;
  220.     case ID_CANVAS:
  221.        name = "Green canvas ";
  222.        break;
  223.     case ID_STATIC_TEXT:
  224.        name = "Static Text  ";
  225.        break;
  226.     case ID_RADIO_BUTTON:
  227.        name = "Radio Button ";
  228.        break;
  229.     case ID_GROUP_BOX:
  230.        name = "Group Box    ";
  231.        break;
  232.     case ID_ENTRY_FIELD:
  233.        name = "Entry Field  ";
  234.        break;
  235.     case ID_DISABLED_ENTRY_FIELD:
  236.        name = "Disabled Entry Field ";
  237.        break;
  238.     default:
  239.        name = "Other        ";
  240.        break;
  241.   } /* endswitch */
  242.  
  243.   return name;
  244. }
  245.  
  246. Boolean MouseClickWindow::MouseClickHandler::mouseClicked
  247.                                  ( IMouseClickEvent& event )
  248. {
  249.   IString
  250.     button = this->textForButton( event.mouseButton() ),
  251.     action = this->textForAction( event.mouseAction() );
  252.   clickWindow->showClickInfo( event.dispatchingWindow(),
  253.                               event.windowUnderPointer(),
  254.                               button,
  255.                               action,
  256.                               event.mousePosition() );
  257.   return false;         // Allow someone else to also process.
  258. }
  259.  
  260. IString MouseClickWindow::MouseClickHandler::textForButton
  261.                         ( IMouseClickEvent::MouseButton button )
  262. {
  263.   IString
  264.     buttonText;
  265.   switch ( button )
  266.   {
  267.     case ( IMouseClickEvent::button1 ):
  268.        buttonText = "Button 1   ";
  269.        break;
  270.     case ( IMouseClickEvent::button2 ):
  271.        buttonText = "Button 2   ";
  272.        break;
  273.     case ( IMouseClickEvent::button3 ):
  274.        buttonText = "Button 3   ";
  275.        break;
  276.     case ( IMouseClickEvent::buttonChord ):
  277.        buttonText = "Buttons 1&2";
  278.        break;
  279.     default:
  280.        buttonText = "Unknown    ";
  281.        break;
  282.   }
  283.   return buttonText;
  284. }
  285.  
  286. IString MouseClickWindow::MouseClickHandler :: textForAction
  287.                         ( IMouseClickEvent::MouseAction action )
  288. {
  289.   IString
  290.     actionText;
  291.   switch ( action )
  292.   {
  293.     case ( IMouseClickEvent::click ):
  294.        actionText = "Single click";
  295.        break;
  296.     case ( IMouseClickEvent::doubleClick ):
  297.        actionText = "Double click";
  298.        break;
  299.     case ( IMouseClickEvent::down ):
  300.        actionText = "Down        ";
  301.        break;
  302.     case ( IMouseClickEvent::up ):
  303.        actionText = "Up          ";
  304.        break;
  305.     default:
  306.        actionText = "Unknown     ";
  307.        break;
  308.   }
  309.   return actionText;
  310. }
  311.