home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powerGUI_sampleCode.zip / SLIDER / SLIDDRAW / TASKVIEW.CPP < prev    next >
Text File  |  1996-10-29  |  5KB  |  177 lines

  1. //*********************************************************
  2. // Sliders - Progress Indicator Custom Painting 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 <icconst.h>
  9. #include <icolor.hpp>
  10. #include <igbitmap.hpp>
  11. #include <igbundle.hpp>
  12. #include <iglist.hpp>
  13. #include <igrafctx.hpp>
  14. #include <igrect.hpp>
  15. #include <ipoint.hpp>
  16. #include <irect.hpp>
  17. #include <irefcnt.hpp>
  18. #include <istring.hpp>
  19. #include <ithread.hpp>
  20. #include "taskview.hpp"
  21.  
  22. // Status View definition.
  23. TaskStatusView :: TaskStatusView ( const char* title )
  24.   : IFrameWindow( title ),
  25.     canvas( IC_FRAME_CLIENT_ID, this, this ),
  26.     indicatorTitle( 100, &canvas, &canvas ),
  27.     taskIndicator( 200, &canvas, &canvas,
  28.                    IRectangle(), 101 ),
  29.     taskTimer(),
  30.     drawHandler()
  31. {
  32.   // Make the canvas the client window, and set controls into it.
  33.   this->setClient( &canvas );
  34.   canvas
  35.    .addToCell( &indicatorTitle, 2, 2 )
  36.    .addToCell( &taskIndicator,  2, 4 );
  37.   unsigned long
  38.     defaultRowHeight = IMultiCellCanvas::defaultCell().height(),
  39.     defaultColumnWidth = IMultiCellCanvas::defaultCell().width();
  40.   canvas
  41.    .setRowHeight( 1, defaultRowHeight, true )
  42.    .setRowHeight( 3, defaultRowHeight, true )
  43.    .setRowHeight( 5, defaultRowHeight, true )
  44.    .setColumnWidth( 2, 0, true )
  45.    .setColumnWidth( 3, defaultColumnWidth );
  46.   canvas
  47.    .setForegroundColor( IColor( IColor::blue ) )
  48.    .setBackgroundColor( IColor( IColor::cyan ) );
  49.  
  50.   // Allow for custom painting of the progress indicator.
  51.   taskIndicator
  52.    .enableDrawItem();
  53.   drawHandler
  54.    .handleEventsFor( &taskIndicator );
  55.  
  56.   // Fix-up to allow color changes up the owner chain to properly
  57.   // percolate down, since we will be painting the background.
  58.   taskIndicator
  59.    .resetBackgroundColor();   // Shouldn't be necessary!
  60.  
  61.   // Set the size of the progress indicator shaft.
  62.   taskIndicator
  63.    .setShaftBreadth( 50 )
  64.    .setMinimumSize( ISize( 200, 200 ) );
  65.  
  66.   // Set the length and text for the indicator's ticks.
  67.   taskIndicator
  68.    .setTickLength( 2 );
  69.   for ( int i = 0; i <= 100; i += 5 )
  70.   {
  71.      if ( i % 10 )
  72.      {         // Not multiple of 10.
  73.         taskIndicator
  74.          .setTickLength( i, 5 );
  75.      }
  76.      else
  77.      {         // Multiple of 10.
  78.         taskIndicator
  79.          .setTickLength( i, 10 )
  80.          .setTickText( i, IString( i ) );
  81.      }
  82.   }
  83.  
  84.   // Set up the static text control.
  85.   indicatorTitle
  86.    .setText( "Percentage of Task Completed" )
  87.    .setAlignment( IStaticText::centerCenter );
  88.  
  89.   // Start the timer to simulate a running task.
  90.   taskTimer
  91.    .setInterval( 500 )          // .5 seconds.
  92.    .start( new ITimerMemberFn< TaskStatusView >
  93.                   ( *this, TaskStatusView::taskPortionComplete ) );
  94. }
  95.  
  96. //  Move the indicator arm when the timer expires.
  97. void TaskStatusView::taskPortionComplete ( unsigned long )
  98. {
  99.   #define PERCENT  15
  100.   unsigned long
  101.     currentPercent = taskIndicator.armTickOffset();
  102.   if ( currentPercent < 100 )
  103.   {
  104.      unsigned long
  105.        newPercent = currentPercent + PERCENT;
  106.      if ( newPercent > 100 )
  107.      {
  108.         newPercent = 100;
  109.      }
  110.      taskIndicator.moveArmToTick( newPercent );
  111.   }
  112. }
  113.  
  114. // Function to properly paint the background color of a
  115. // progress indicator.
  116. IBase::Boolean
  117.   DrawHandler::drawBackground ( IDrawItemEvent& event )
  118. {
  119.   IGraphicContext
  120.     gc( event.itemPresSpaceHandle() );
  121.   IGraphicBundle
  122.     bundle( gc );
  123.   bundle
  124.    .setDrawOperation( IGraphicBundle::fill )
  125.    .setBackgroundMixMode( IGraphicBundle::backOverPaint )
  126.    .setFillColor( event.controlWindow()->backgroundColor() );
  127.   IGRectangle
  128.     background( event.itemRect() );
  129.   background
  130.    .setGraphicBundle( bundle )
  131.    .drawOn( gc );
  132.   return true;
  133. }
  134.  
  135. // Function to paint the ribbon strip of the progress indicator.
  136. IBase::Boolean
  137.   DrawHandler::drawRibbonStrip ( IDrawItemEvent& event )
  138. {
  139.   // Draw the ribbon strip using information from the draw
  140.   // item event.
  141.   IGraphicContext
  142.     gc( event.itemPresSpaceHandle() );
  143.   IGraphicBundle
  144.     bundle( gc );
  145.   bundle
  146.    .setDrawOperation( IGraphicBundle::fill )
  147.    .setBackgroundMixMode( IGraphicBundle::backOverPaint )
  148.    .setFillPattern( IGraphicBundle::forewardDiag2 )
  149.    .setFillColor( IColor( IColor::blue ) );
  150.   IGRectangle
  151.     ribbon( event.itemRect() );
  152.   ribbon
  153.    .setGraphicBundle( bundle )
  154.    .drawOn( gc );
  155.   return true;
  156. }
  157.  
  158. // Function to paint the shaft of the progress indicator.
  159. IBase::Boolean DrawHandler::drawShaft ( IDrawItemEvent& event )
  160. {
  161.   // Draw the shaft using information from the draw item event.
  162.   IGraphicContext
  163.     gc( event.itemPresSpaceHandle() );
  164.   IGraphicBundle
  165.     bundle( gc );
  166.   bundle
  167.    .setDrawOperation( IGraphicBundle::fill )
  168.    .setBackgroundMixMode( IGraphicBundle::backOverPaint )
  169.    .setFillColor( IColor( IColor::yellow ) );
  170.   IGRectangle
  171.     shaft( event.itemRect() );
  172.   shaft
  173.    .setGraphicBundle( bundle )
  174.    .drawOn( gc );
  175.   return true;
  176. }
  177.