home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Examples / NEXTIME / SimplePlayer / DocumentView.m < prev    next >
Text File  |  1996-06-24  |  5KB  |  200 lines

  1. /*
  2.  *  DocumentView.m
  3.  *    
  4.  */
  5. #import "DocumentView.h"
  6. #import "Controller.h"
  7. #import "SimplePlayer_Globals.h"
  8. #import <NEXTIME/NTMovieScreenCell.h>
  9.  
  10. @implementation DocumentView
  11.  
  12. #define CONTROL_Y_MARGIN    (1.0)
  13. #define CONTROL_Y_OFFSET    (0.0)
  14.  
  15. - initWithFrame:(NSRect)frameRect
  16. {
  17.     NSRect frame;
  18.         
  19.     self = [super initWithFrame:(NSRect)frameRect];
  20.     if ( self == nil )
  21.         return nil;
  22.  
  23.         
  24.     // Get a NTControlView.  The control view will bump the height up to
  25.     // the minimum it needs.
  26.     frame.size.width = frameRect.size.width;
  27.     frame.size.height = 0.0;    // Adjusted by control
  28.     frame.origin.x = 0.0;
  29.         frame.origin.y = CONTROL_Y_OFFSET;
  30.     control = [[NTMovieControlView alloc] initWithFrame:frame];
  31.     [control setAutoresizingMask:NSViewWidthSizable];
  32.     [self addSubview:control];
  33.     
  34.     // Get a NTVideoWell, framed above the NTControlView.
  35.     frame = [control frame];        // Get the control size.
  36.     frame.origin.y += (frame.size.height + CONTROL_Y_MARGIN);
  37.     frame.size.height = frameRect.size.height - frame.origin.y;
  38.     if ( frame.size.height < 0.0 )
  39.         frame.size.height = 0.0;
  40.     frame.origin.x = 0.0;
  41.     frame.size.width = frameRect.size.width;
  42.  
  43.         videoWell = [[NTMovieScreen alloc] initWithFrame:frame];
  44.     [videoWell setAutoresizingMask:
  45.             (NSViewWidthSizable | NSViewHeightSizable)];
  46.         // Set sizing policy via defaults database
  47.     [[videoWell cell] setResizeMode:[Controller sizingPolicy]];
  48.     [[videoWell cell] setBezeled:NO];
  49.     [[videoWell cell] setBordered:NO];
  50.     [self addSubview:videoWell];
  51.  
  52.         // Listen for changes in the defaults database regarding sizing
  53.         // policy.
  54.         [[NSNotificationCenter defaultCenter]
  55.         addObserver:self
  56.             selector:@selector(_resizePolicyChanged:)
  57.             name:NTResizePolicyChangeNotification
  58.             object:nil];
  59.         
  60.         return self;
  61. }
  62.  
  63. - (void)dealloc
  64. {
  65.     [control release];
  66.     [videoWell release];
  67.     [super dealloc];
  68. }
  69.  
  70. - (BOOL)setMovieFile:(NSString *)file
  71. {
  72.     NSRect frame;
  73.     NSRect controlFrame;
  74.         
  75.     if ( [videoWell setMovieFile:file] == NO )
  76.         return NO;
  77.  
  78.         // The videoWell cell is configured for the 'normal' size
  79.         // of the movie.  Save this for use in resizing the movie.
  80.         frame.origin.x = frame.origin.y = 0.0;
  81.         frame.size = [[videoWell cell] cellSize];
  82.         frame = [[videoWell cell] drawingRectForBounds:frame];
  83.         movieSize = frame.size;
  84.         
  85.         // Hook our control to the new media document created by the
  86.         // NTVideoWell and represented by the well's NTVideoCell.
  87.         // This will raise if the represented object doesn't conform to
  88.         // the NTMediaDocument protocol!
  89.         [control setMovieDocument:[[videoWell cell] representedObject]];
  90.  
  91.         // Adjust the videoWell to just hold the movie at normal size.
  92.     [videoWell sizeToFit];
  93.  
  94.         // Adjust the control to match the videoWell width
  95.     frame = [videoWell frame];
  96.     controlFrame = [control frame];
  97.     controlFrame.size.width = frame.size.width;
  98.     [control setFrameSize:controlFrame.size];
  99.  
  100.         // Set a frame size just big enough to hold the videoWell and
  101.         // the control.
  102.     frame.size.height += (controlFrame.size.height + CONTROL_Y_MARGIN);
  103.  
  104.         // Disable subview resize, and wrap this view
  105.         // snugly about our subviews.
  106.         [self setAutoresizesSubviews:NO];
  107.     [self setFrameSize:frame.size];
  108.         
  109.         // Restore normal resize behavior for our view.
  110.         [self setAutoresizesSubviews:YES];
  111.  
  112.     return YES;
  113. }
  114.  
  115. - (id <NTMovieDocument>)document
  116. {
  117.     return [[videoWell cell] representedObject];
  118. }
  119.  
  120. - (NTMovieControlView *)control
  121. {
  122.     return control;
  123. }
  124.  
  125. - (NTMovieScreen *)videoWell
  126. {
  127.     return videoWell;
  128. }
  129.  
  130. // Put a little black stripe over the NTControlView
  131. - (void)drawRect:(NSRect)rect
  132. {
  133.     NSRect controlFrame;
  134.     NSRect marginFrame;
  135.  
  136.         controlFrame = [control frame];
  137.         marginFrame.origin.x = controlFrame.origin.x;
  138.         marginFrame.size.width = controlFrame.size.width;
  139.         marginFrame.origin.y =
  140.             controlFrame.origin.y + controlFrame.size.height;
  141.         marginFrame.size.height = CONTROL_Y_MARGIN;
  142.  
  143.         // Fill in the gap above the NSControlView
  144.     PSsetgray(NSBlack);
  145.     NSRectFill(marginFrame);
  146.  
  147.         // And the gap below the NSControlView
  148.         marginFrame.origin.y = 0.0;
  149.         marginFrame.size.height = CONTROL_Y_OFFSET;
  150.     NSRectFill(marginFrame);
  151. }
  152.  
  153. // Change in resize policy.
  154. - (void)_resizePolicyChanged:(NSNotification *)note
  155. {
  156.     [[videoWell cell] setResizeMode:[Controller sizingPolicy]];
  157. }
  158.  
  159. - (NSSize)normalSize
  160. {
  161.     NSSize size;
  162.     NSRect frame;
  163.         NSRect controlFrame;
  164.  
  165.         frame.origin.x = frame.origin.y = 0.0;
  166.         frame.size = movieSize;
  167.         size = [[videoWell cell] cellSizeForBounds:frame];
  168.  
  169.         // Size is now appropriate for the videoWell.
  170.         // Add in the controlView.
  171.     controlFrame = [control frame];
  172.     size.height +=      CONTROL_Y_OFFSET
  173.                 + controlFrame.size.height
  174.                 + CONTROL_Y_MARGIN;
  175.     return size;
  176. }
  177.  
  178. - (NSSize)doubleSize
  179. {
  180.     NSSize size;
  181.     NSRect frame;
  182.         NSRect controlFrame;
  183.  
  184.         frame.origin.x = frame.origin.y = 0.0;
  185.         frame.size = movieSize;
  186.         frame.size.width *= 2.0;
  187.         frame.size.height *= 2.0;
  188.         size = [[videoWell cell] cellSizeForBounds:frame];
  189.  
  190.         // Size is now appropriate for the videoWell.
  191.         // Add in the controlView.
  192.     controlFrame = [control frame];
  193.     size.height +=      CONTROL_Y_OFFSET
  194.                 + controlFrame.size.height
  195.                 + CONTROL_Y_MARGIN;
  196.     return size;
  197. }
  198.  
  199. @end
  200.