• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
NSPanel mimic menu behavior
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

NSPanel mimic menu behavior


  • Subject: NSPanel mimic menu behavior
  • From: "cai qin" <email@hidden>
  • Date: Mon, 17 Mar 2008 10:23:48 -0700

Hi All,

I'm using a NSPanel to mimic menu in Tiger these days. I think most of the
job has been done except one small problem.
What I want to do is that implementing something just behaves like a
popUpButton.
OK let's get into the point.
I got a popUpButton, and I override its cell

@implementation MyPopUpButtonCell
 //setting panel frame which makes the panel attach to the popUpButton and
makes the panel on the Screen, then panel orderFrontRegardless
- (void) attachPopUpPanelMenu:(MyMenuPanel *)menuPanel inView:(NSView*)cv;
// panel orderOut
- (void) dismissPanelMenu;

@end


@implementation MyMenuPanel //subclass of NSPanel

- (id)initWithContentRect:(NSRect)contentRect
styleMask:(int)windowStyle backing:(NSBackingStoreType)bufferingType
defer:(BOOL)deferCreation

{

 self = [super initWithContentRect:contentRect

       styleMask:windowStyle

         backing:bufferingType

        defer:deferCreation];

 if(self)

 {

  [self setLevel:NSPopUpMenuWindowLevel];

  [self setHasShadow:YES];

  [self setWorksWhenModal:YES];

 }

 return self;

}
/**
* tracking Mouse Event . In my custom loop , to get every event in the
queue. * check the event position , if happened in myMenuPanel dispatch the
event , finish loop , popUpButtonCell dismiss the panel
 * if event happened outside window , finish loop , popUpButtonCell dismiss
the panel
* I don't need the menu highlight staff , so I don't start or handling
the NSPeriodic
event.
 *     So everything works good . But if I switch the App to others . My
menuPanel will be hided . because the NSPanel
 *     hideOnDeactivate. The problem is , my App ,still is on active . I
think the reason is event tracking loop is still on
 *     It hasn't quit. So , I need find something when myPanelMenu be hidden
to stop the loop.
 *     Is there any suggestion on this?
*/

- (void) trackingMouseEvent:(NSEvent *) theEvent

{

 unsigned eventMask = NSLeftMouseDownMask|NSLeftMouseUpMask|NSLeftMouseDragged;

 eventMask |= NSRightMouseDraggedMask|NSRightMouseDownMask|NSRightMouseUpMask;

 eventMask |= NSOtherMouseUpMask||NSOtherMouseDraggedMask||NSOtherMouseDownMask;

 eventMask |= NSPeriodicMask;

 NSDate *date = [NSDate distantFuture];

 BOOL keepOn = YES;

 NSEvent *nextEvent;

 while(keepOn)

 {

  nextEvent = [NSApp nextEventMatchingMask:eventMask untilDate:date
inMode:NSEventTrackingRunLoopMode dequeue:YES];

  NSLog(@"%d %d %d %d %d %d %@ %d",

     [self isKeyWindow],

     [self isOpaque],

     [self isVisible],

     [NSApp isHidden],

     [NSApp isActive],

     [self canBecomeKeyWindow],

     [NSApp keyWindow],

     [[NSApp keyWindow] isMainWindow]);



  switch([nextEvent type])

  {

   case NSLeftMouseDown:

   case NSRightMouseDown:

   case NSOtherMouseDown:

    //ToDo dispatch to mouseDown method

    if(![nextEvent isEqual:theEvent])

    {

     NSPoint location = [[self window] mouseLocationOutsideOfEventStream];

     NSPoint viewLocation = [self convertPoint:location fromView:nil];

     if([self mouse:viewLocation inRect:[self bounds]])

     {

      [self mouseDown:theEvent];

     }

     else

      keepOn = NO;

    }



    break;

   case NSLeftMouseUp:

   case NSRightMouseUp:

   case NSOtherMouseUp:

    //ToDo dispatch to mouseUp method

    if([nextEvent timestamp] - [theEvent timestamp] > 0.25)

    {

     NSPoint location = [[self window] mouseLocationOutsideOfEventStream];

     NSPoint viewLocation = [self convertPoint:location fromView:nil];

     if([self mouse:viewLocation inRect:[self bounds]])

     {

      [self mouseUp:theEvent];

     }

     keepOn = NO;

    }

    break;

   case NSLeftMouseDragged:

   case NSRightMouseDragged:

   case NSOtherMouseDragged:

    [self mouseDragged:theEvent];

    break;

   default:

    break;

  }





 }

}
@end
_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Prev by Date: Re: In receiver application, getting file passed in from NSWorkspace openFile:withApplication:
  • Next by Date: Re: Prevent application activation after dragging items to the Dock icon?
  • Previous by thread: Re: In receiver application, getting file passed in from NSWorkspace openFile:withApplication:
  • Next by thread: NSTreeController & NSOutlineView bindings w/ Core Data
  • Index(es):
    • Date
    • Thread