Logo Search packages:      
Sourcecode: affiche version File versions  Download package

NoteView.m

/*
**  NoteView.m
**
**  Copyright (c) 2001
**
**  Author: Ludovic Marcotte <ludovic@Sophos.ca>
**
**  This program is free software; you can redistribute it and/or modify
**  it under the terms of the GNU General Public License as published by
**  the Free Software Foundation; either version 2 of the License, or
**  (at your option) any later version.
**
**  This program is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**  GNU General Public License for more details.
**
**  You should have received a copy of the GNU General Public License
**  along with this program; if not, write to the Free Software
**  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#import "NoteView.h"

#import "Constants.h"

@implementation NoteView

- (id) init
{
  self = [super init];
  
  buttons = nil;
  resize = nil;
  titleBarColor = nil;
  noteColor = nil;
  
  [self setColorCode: YELLOW];
  
  return self;
}

- (void) dealloc
{
  RELEASE(buttons);
  RELEASE(resize);
  RELEASE(titleBarColor);
  RELEASE(noteColor);

  [super dealloc];
}

- (BOOL) acceptsFirstResponder
{
  return YES;
}

- (BOOL) acceptsFirstMouse: (NSEvent *) theEvent
{
  return YES;
}


- (void) drawRect: (NSRect) theRect
{
  NSMutableAttributedString *title;
  NSFont *aFont;

  // We fill our rect with the color of our title bar's image for the buttons
  [titleBarColor set];
  NSRectFill(theRect);
  
  // Our top image is 36x11
  [buttons compositeToPoint: NSMakePoint(theRect.size.width - 36, theRect.size.height - 11)
         operation: NSCompositeSourceAtop];
  
  
  // We now fill it with the color of the content of the note
  [noteColor set];
  NSRectFill( NSMakeRect(0,0,theRect.size.width, theRect.size.height - 11) );

  // Our bottom image is 8x8
  [resize compositeToPoint: NSMakePoint(theRect.size.width - 8, 0)
        operation: NSCompositeSourceAtop];

  // We draw the title
  aFont = [NSFont boldSystemFontOfSize: 8];
  title = [[NSMutableAttributedString alloc]
          initWithString: [window title]];
  
  [title addAttribute: NSFontAttributeName
       value: aFont
       range: NSMakeRange(0, [[title string] length])];

  // FIXME - more intelligent replace
  if ( [title size].width > (theRect.size.width - 50) )
    {
      [title replaceCharactersInRange: NSMakeRange(10, [[title string] length] - 10)
           withString: @"..."];
    }

#ifdef MACOSX
  [title drawAtPoint: NSMakePoint(10, theRect.size.height - 10)];
#else
  [title drawAtPoint: NSMakePoint(10, theRect.size.height)];
#endif
}


- (void) mouseDown: (NSEvent *) theEvent
{
  NSRect windowRect, resizeRect;
  NSPoint bottomRightOrigin;
  
  NSEvent *nextEvent;
  BOOL resizing;

  lastLocationOfWindow = [theEvent locationInWindow];

  windowRect = [window frame];

  // We get the point corresponding to the origin of our bottom right corner
  bottomRightOrigin = [window convertBaseToScreen: lastLocationOfWindow];

  //NSLog(@"%@", NSStringFromRect(windowRect));

  resizeRect = NSMakeRect(windowRect.size.width - 8, 0, 8, 8);
  resizing = NSMouseInRect(lastLocationOfWindow, resizeRect, NO);

  //NSLog(@"Resizing = %d", resizing);

  while (YES) 
    {
      nextEvent = [window nextEventMatchingMask: NSLeftMouseUpMask | NSLeftMouseDraggedMask];
     
      if ( [nextEvent type] == NSLeftMouseUp )
      {
        [self mouseUp: theEvent];
        break;
      }
      else if ( [nextEvent type] == NSLeftMouseDragged )
      {
        NSPoint aPoint;
        
        aPoint = [window mouseLocationOutsideOfEventStream];

        if (! resizing )
          {
            NSPoint origin;
            
            
            origin = [window frame].origin;
            origin.x += (aPoint.x - lastLocationOfWindow.x);
            origin.y += (aPoint.y - lastLocationOfWindow.y);
            
            [window setFrameOrigin: origin];
          }
        else
          {
            NSRect aRect;
            float dx, dy;

            aPoint = [window convertBaseToScreen: aPoint];
        
            dx = (aPoint.x - bottomRightOrigin.x);
            dy = (aPoint.y - bottomRightOrigin.y);
            
            aRect = NSMakeRect(windowRect.origin.x,
                         windowRect.origin.y + dy,
                         windowRect.size.width + dx,
                         windowRect.size.height - dy);
            
            // We don't resize if we reached our minimum size...
            if (aRect.size.width < [window minSize].width)
            {
              aRect.size.width = [window minSize].width;
            }

            if (aRect.size.height < [window minSize].height)
            {
              aRect.origin.y -= [window minSize].height - aRect.size.height;
              aRect.size.height = [window minSize].height;
            }

            if ( aRect.size.width >= [window minSize].width &&
               aRect.size.height >= [window minSize].height )
            {
              [window setFrame: aRect
                    display: YES];
            }
          }
      }
    }
}


//
// Method used to detect when the user release the left mouse button 
// in order to know if we must minimize, maximize or close the window.
//
- (void) mouseUp: (NSEvent *) theEvent
{
  NSRect minimizeRect, maximizeRect, closeRect, windowRect;
  NSPoint aPoint;

  aPoint = [theEvent locationInWindow];
  windowRect = [window frame];
 
  minimizeRect = NSMakeRect(windowRect.size.width - 33, windowRect.size.height - 10, 7, 7);
  maximizeRect = NSMakeRect(windowRect.size.width - 21, windowRect.size.height - 10, 7, 7);
  closeRect = NSMakeRect(windowRect.size.width - 8, windowRect.size.height - 10, 7, 7);
  
  //NSLog(@"Location = %f %f", aPoint.x, aPoint.y);
  
  // We verify if we must minimize, maximize or close the window
  if ( NSMouseInRect(aPoint, minimizeRect, NO) )
    {
      [window setFrame: NSMakeRect([window frame].origin.x,
                           [window frame].origin.y,
                           [window minSize].width,
                           [window minSize].height)
            display: YES];
    }
  else if (NSMouseInRect(aPoint, maximizeRect, NO) )
    {      
      [window setFrame: NSMakeRect(70,
                           70,
                           [window maxSize].width,
                           [window maxSize].height)
            display: YES];
    }
  else if (NSMouseInRect(aPoint, closeRect, NO) )
    {
      if ( [[window windowController] windowShouldClose: nil] )
      {
        [window close];
      }
    }
}

//
// access/mutation methods
//

- (void) setColorCode: (int) theColorCode
{
  TEST_RELEASE(buttons);
  TEST_RELEASE(resize);
  TEST_RELEASE(titleBarColor);
  TEST_RELEASE(noteColor);
  
  //NSLog(@"Setting color code = %d", theColorCode);

  switch (theColorCode)
    {
    case BLUE:
      buttons = [NSImage imageNamed: @"buttons_blue.tiff"];
      resize = [NSImage imageNamed: @"resize_blue.tiff"];
      titleBarColor = [NSColor colorWithDeviceRed: 0.24
                         green: 0.90
                         blue: 1.0
                         alpha: 1.0];
      noteColor = [NSColor colorWithDeviceRed: 0.44
                     green: 1.0
                     blue: 1.0
                     alpha: 1.0];
      break;

    case GRAY:
      buttons = [NSImage imageNamed: @"buttons_gray.tiff"];
      resize = [NSImage imageNamed: @"resize_gray.tiff"];
      titleBarColor = [NSColor colorWithDeviceRed: 0.83
                         green: 0.83
                         blue: 0.83
                         alpha: 1.0];
      noteColor = [NSColor colorWithDeviceRed: 0.93
                     green: 0.93
                     blue: 0.93
                     alpha: 1.0];
      break;

    case GREEN:
      buttons = [NSImage imageNamed: @"buttons_green.tiff"];
      resize = [NSImage imageNamed: @"resize_green.tiff"];
      titleBarColor = [NSColor colorWithDeviceRed: 0.58
                         green: 1.0
                         blue: 0.58
                         alpha: 1.0];
      noteColor = [NSColor colorWithDeviceRed: 0.70
                     green: 1.0
                     blue: 0.63
                     alpha: 1.0];
      break;
      
    case PURPLE:
      buttons = [NSImage imageNamed: @"buttons_purple.tiff"];
      resize = [NSImage imageNamed: @"resize_purple.tiff"];
      titleBarColor = [NSColor colorWithDeviceRed: 0.57
                         green: 0.72
                         blue: 1.0
                         alpha: 1.0];
      noteColor = [NSColor colorWithDeviceRed: 0.70
                     green: 0.78
                     blue: 1.0
                     alpha: 1.0];
      break;
      
    case YELLOW:
    default:
      buttons = [NSImage imageNamed: @"buttons_yellow.tiff"];
      resize = [NSImage imageNamed: @"resize_yellow.tiff"];
      titleBarColor = [NSColor colorWithDeviceRed: 1.0
                         green: 0.9
                         blue: 0.24
                         alpha: 1.0];
      noteColor = [NSColor colorWithDeviceRed: 1.0
                     green: 1.0
                     blue: 0.63
                     alpha: 1.0];
    }
  
  RETAIN(buttons);
  RETAIN(resize);
  RETAIN(titleBarColor);
  RETAIN(noteColor);
  
  [self setNeedsDisplay: YES];
}

- (void) setWindow: (NSWindow *) theWindow
{
  window = theWindow;
}


@end

Generated by  Doxygen 1.6.0   Back to index