home *** CD-ROM | disk | FTP | other *** search
/ Nebula / nebula.bin / SourceCode / MiniExamples / ScrollingText / PageScrollView.m < prev    next >
Text File  |  1991-04-21  |  5KB  |  181 lines

  1. /* PageScrollView.m
  2. *  Purpose: A subclass of ScrollView which adds controls to the scroller area.
  3. *
  4. *  You may freely copy, distribute, and reuse the code in this example.
  5. *  NeXT disclaims any warranty of any kind, expressed or  implied, as to its fitness
  6. *  for any particular use.
  7. *
  8. */
  9.  
  10. #import <appkit/Application.h>
  11. #import <appkit/Button.h>
  12. #import <appkit/ButtonCell.h>
  13. #import <dpsclient/psops.h>
  14. #import "PageScrollView.h"
  15.  
  16. #define GADGET_HEIGHT        16.0
  17.  
  18. @implementation PageScrollView : ScrollView
  19.  
  20. /* We need the popup list to be smaller than IB will allow to fit comfortably */
  21. /* into the scroller. */
  22. - setZoomPopUpList: anObject
  23. {
  24.     NXRect    aRect;
  25.     
  26.     zoomPopUpList = anObject;
  27.     [zoomPopUpList getFrame: &aRect];
  28.     aRect.size.height = GADGET_HEIGHT;
  29.     [zoomPopUpList setFrame: &aRect];
  30.     return self;
  31. }
  32.  
  33. /* We need the page form cell to be smaller than IB will allow to fit comfortably */
  34. /* into the scroller */
  35. - setPageForm: anObject
  36. {
  37.     NXRect    aRect;
  38.     
  39.     pageForm = anObject;
  40.     [pageForm getFrame: &aRect];
  41.     aRect.size.height = GADGET_HEIGHT + 4.0;
  42.     [pageForm setFrame: &aRect];
  43.     return self;
  44. }
  45.  
  46. /* We need the page label to be smaller than IB will allow to fit comfortably */
  47. /* into the scroller. */
  48. - setPageLabel: anObject
  49. {
  50.     NXRect    aRect;
  51.     
  52.     pageLabel = anObject;
  53.     [pageForm getFrame: &aRect];
  54.     aRect.size.height = GADGET_HEIGHT + 2.0;
  55.     [pageForm setFrame: &aRect];
  56.     return self;
  57. }
  58.  
  59.  
  60. - initFrame: (const NXRect *)frameRect
  61. {
  62.     [super initFrame: frameRect];
  63.     
  64.     /* load our gadgets in */
  65.     [NXApp loadNibSection: "ScrollerGadgets.nib"  owner:self];
  66.  
  67.     /* Add the page up button at the bottom of the vertical scroller */
  68.     [self addSubview:pageUpButton];
  69.  
  70.     /* Add the page down button at the bottom of the vertical scroller, */
  71.     /* below the page up button */
  72.     [self addSubview:pageDownButton];
  73.     
  74.     /* Add the page number cell and it's label */
  75.     [self addSubview:pageLabel];
  76.     [self addSubview:pageForm];
  77.     
  78.     /* Add the zoom list */
  79.     [self addSubview: zoomPopUpList];
  80.     
  81.     /* Now that I've added all my subviews to my ScrollView, free the window */
  82.     [[pageUpButton window] free];
  83.     
  84.     return self;
  85. }
  86.  
  87. /* - tile 
  88.  *     Override the tile method to draw the subviews in the scroll bars correctly.
  89.  *
  90.  * From the ScrollView spec sheet:
  91.  *    Tiles the subviews of the ScrollView.  You never send a tile message directly, 
  92.  * but you may override it if you need to have the ScrollView manage additional views.  
  93.  * When tile is invoked, it's responsible for sizing each of the subviews of the ScrollView, 
  94.  * including the content view.  This is accomplished by sending each of its subviews a 
  95.  * setFrame: message.  The width of the vertical scroller and the height of the horizontal 
  96.  * scroller (if present) are set to NX_SCROLLERWIDTH.  A tile message is sent whenever 
  97.  * the ScrollView is resized, or a vertical or horizontal scroller is added or removed.  
  98.  * The method invoking tile should then send a  display message to the ScrollView.  
  99.  * Returns self.
  100.  */
  101. - tile
  102. {
  103.     NXRect    aRect, ctlRect;
  104.     float zoom_width, page_label_width, page_cell_width;
  105.     
  106.     [super tile];
  107.     
  108.     /* take the zoom popup list & page display into account on the horizontal scroller */
  109.     [hScroller getFrame: &aRect];
  110.     [zoomPopUpList getFrame: &ctlRect];
  111.     zoom_width = ctlRect.size.width;
  112.     [pageLabel getFrame: &ctlRect];
  113.     page_label_width = ctlRect.size.width;
  114.     [pageForm getFrame: &ctlRect];
  115.     page_cell_width = ctlRect.size.width;
  116.     aRect.size.width -= zoom_width + page_label_width + page_cell_width;
  117.     [hScroller setFrame: &aRect];
  118.     
  119.     /* position the zoom popup list in the correct place */
  120.     aRect.origin.x += aRect.size.width;
  121.     aRect.size.width = zoom_width;
  122.     horzScrollerArea = aRect;
  123.     horzScrollerArea.size.width += page_label_width + page_cell_width;
  124.     [zoomPopUpList moveTo: aRect.origin.x : aRect.origin.y +1.0];
  125.     
  126.     /* position the page display after the popuplist in the horizontal scroller */
  127.     aRect.origin.x += zoom_width;
  128.     aRect.size.width = page_label_width;
  129.     [pageLabel moveTo:aRect.origin.x :aRect.origin.y];
  130.     aRect.origin.x += page_label_width;
  131.     aRect.size.width = page_cell_width;
  132.     [pageForm moveTo: aRect.origin.x :aRect.origin.y];
  133.     
  134.     /* take the page up/down buttons into account on the vertical scroller */
  135.     [vScroller getFrame: &aRect];
  136.     aRect.size.height -= (2.0 * GADGET_HEIGHT) + 2.0;
  137.     [vScroller setFrame: &aRect];
  138.     
  139.     /* position the buttons in the correct place */
  140.     aRect.origin.y += aRect.size.height;
  141.     vertScrollerArea = aRect;
  142.     aRect.size.height = (2.0 * GADGET_HEIGHT) + 2.0;
  143.     [pageUpButton moveTo:1.0 :aRect.origin.y];
  144.     [pageDownButton moveTo:1.0 :aRect.origin.y + GADGET_HEIGHT + 1.0];
  145.     return self;
  146. }
  147.  
  148. /* We need to override drawSelf to make the background behind the new gadgets */
  149. /* grey instead of the default white */
  150. - drawSelf:(const NXRect *)rects :(int)rectCount
  151. {
  152.     PSsetgray(NX_LTGRAY);
  153.     NXRectFill(&vertScrollerArea);
  154.     NXRectFill(&horzScrollerArea);
  155.     [super drawSelf:rects:rectCount];
  156.     return self;
  157. }
  158.  
  159. /* This action is connected to the page up/down buttons in the vertical scroller */
  160. - pageButton:sender
  161. {
  162.     fprintf(stderr,"page up/down!\n");
  163.     return self;
  164. }
  165.  
  166. /* This action is connected to the page formCell in the horizontal scroller */
  167. - pageTo:sender
  168. {
  169.     fprintf(stderr,"move to page!\n");
  170.     return self;
  171. }
  172.  
  173. /* This action is connected to the zoom popup list in the horizontal scroller */
  174. - zoomTo:sender
  175. {
  176.     fprintf(stderr,"zoom in/out!\n");
  177.     return self;
  178. }
  179.  
  180. @end
  181.