1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/cocoa/NSSlider.mm
3 // Purpose: wxCocoaNSSlider class
4 // Author: Mark Oxenham
8 // Copyright: (c) 2007 Software 2000 Ltd. All rights reserved.
9 // Licence: wxWidgets licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
18 #include "wx/cocoa/ObjcPose.h"
19 #include "wx/cocoa/NSSlider.h"
21 #import <Foundation/NSNotification.h>
22 #import <Foundation/NSString.h>
23 #import <AppKit/NSEvent.h>
24 #import <AppKit/NSSlider.h>
26 WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSSlider)
28 // ============================================================================
29 // @class wxNSSliderTarget
30 // ============================================================================
31 @interface wxNSSliderTarget : NSObject
35 - (void)wxNSSliderUpArrowKeyDown: (id)sender;
36 - (void)wxNSSliderDownArrowKeyDown: (id)sender;
37 - (void)wxNSSliderLeftArrowKeyDown: (id)sender;
38 - (void)wxNSSliderRightArrowKeyDown: (id)sender;
39 - (void)wxNSSliderPageUpKeyDown: (id)sender;
40 - (void)wxNSSliderPageDownKeyDown: (id)sender;
41 - (void)wxNSSliderMoveUp: (id)sender;
42 - (void)wxNSSliderMoveDown: (id)sender;
43 - (void)wxNSSliderMoveLeft: (id)sender;
44 - (void)wxNSSliderMoveRight: (id)sender;
45 - (void)wxNSSliderPageUp: (id)sender;
46 - (void)wxNSSliderPageDown: (id)sender;
47 @end // wxNSSliderTarget
49 @implementation wxNSSliderTarget : NSObject
51 - (void)wxNSSliderUpArrowKeyDown: (id)sender
53 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(sender);
54 wxCHECK_RET(slider,wxT("wxNSSliderUpArrowKeyDown received without associated wx object"));
55 slider->Cocoa_wxNSSliderUpArrowKeyDown();
58 - (void)wxNSSliderDownArrowKeyDown: (id)sender
60 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(sender);
61 wxCHECK_RET(slider,wxT("wxNSSliderDownArrowKeyDown received without associated wx object"));
62 slider->Cocoa_wxNSSliderDownArrowKeyDown();
65 - (void)wxNSSliderLeftArrowKeyDown: (id)sender
67 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(sender);
68 wxCHECK_RET(slider,wxT("wxNSSliderLeftArrowKeyDown received without associated wx object"));
69 slider->Cocoa_wxNSSliderLeftArrowKeyDown();
72 - (void)wxNSSliderRightArrowKeyDown: (id)sender
74 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(sender);
75 wxCHECK_RET(slider,wxT("wxNSSliderRightArrowKeyDown received without associated wx object"));
76 slider->Cocoa_wxNSSliderRightArrowKeyDown();
79 - (void)wxNSSliderPageUpKeyDown: (id)sender
81 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(sender);
82 wxCHECK_RET(slider,wxT("wxNSSliderPageUpKeyDown received without associated wx object"));
83 slider->Cocoa_wxNSSliderPageUpKeyDown();
86 - (void)wxNSSliderPageDownKeyDown: (id)sender
88 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(sender);
89 wxCHECK_RET(slider,wxT("wxNSSliderPageDownKeyDown received without associated wx object"));
90 slider->Cocoa_wxNSSliderPageDownKeyDown();
93 - (void)wxNSSliderMoveUp: (id)sender
95 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(sender);
96 wxCHECK_RET(slider,wxT("wxNSSliderMoveUp received without associated wx object"));
97 slider->Cocoa_wxNSSliderMoveUp();
100 - (void)wxNSSliderMoveDown: (id)sender
102 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(sender);
103 wxCHECK_RET(slider,wxT("wxNSSliderMoveDown received without associated wx object"));
104 slider->Cocoa_wxNSSliderMoveDown();
107 - (void)wxNSSliderMoveLeft: (id)sender
109 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(sender);
110 wxCHECK_RET(slider,wxT("wxNSSliderMoveLeft received without associated wx object"));
111 slider->Cocoa_wxNSSliderMoveLeft();
114 - (void)wxNSSliderMoveRight: (id)sender
116 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(sender);
117 wxCHECK_RET(slider,wxT("wxNSSliderMoveRight received without associated wx object"));
118 slider->Cocoa_wxNSSliderMoveRight();
121 - (void)wxNSSliderPageUp: (id)sender
123 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(sender);
124 wxCHECK_RET(slider,wxT("wxNSSliderPageUp received without associated wx object"));
125 slider->Cocoa_wxNSSliderPageUp();
128 - (void)wxNSSliderPageDown: (id)sender
130 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(sender);
131 wxCHECK_RET(slider,wxT("wxNSSliderPageDown received without associated wx object"));
132 slider->Cocoa_wxNSSliderPageDown();
135 @end // implementation wxNSSliderTarget
137 // ============================================================================
138 // @class wxPoserNSSlider
139 // ============================================================================
141 @interface wxPoserNSSlider : NSSlider
144 WX_IMPLEMENT_POSER(wxPoserNSSlider);
145 @implementation wxPoserNSSlider : NSSlider
147 - (void)keyDown:(NSEvent *)theEvent
149 SEL originalAction = [self action];
150 SEL newAction = originalAction;
151 NSString *theEventCharacters = [theEvent charactersIgnoringModifiers];
153 if ([theEventCharacters length] == 1)
155 switch ([theEventCharacters characterAtIndex:0])
157 case NSUpArrowFunctionKey: newAction = @selector(wxNSSliderUpArrowKeyDown:); break;
158 case NSDownArrowFunctionKey: newAction = @selector(wxNSSliderDownArrowKeyDown:); break;
159 case NSLeftArrowFunctionKey: newAction = @selector(wxNSSliderLeftArrowKeyDown:); break;
160 case NSRightArrowFunctionKey: newAction = @selector(wxNSSliderRightArrowKeyDown:); break;
161 case NSPageUpFunctionKey: newAction = @selector(wxNSSliderPageUpKeyDown:); break;
162 case NSPageDownFunctionKey: newAction = @selector(wxNSSliderPageDownKeyDown:); break;
167 [self setAction:newAction];
168 [super keyDown:theEvent];
169 [self setAction:originalAction];
172 - (void)moveUp:(id)sender
174 SEL originalAction = [self action];
176 [self setAction:@selector(wxNSSliderMoveUp:)];
177 [super moveUp:sender];
178 [self setAction:originalAction];
181 - (void)moveDown:(id)sender
183 SEL originalAction = [self action];
185 [self setAction:@selector(wxNSSliderMoveDown:)];
186 [super moveDown:sender];
187 [self setAction:originalAction];
190 - (void)moveLeft:(id)sender
192 SEL originalAction = [self action];
194 [self setAction:@selector(wxNSSliderMoveLeft:)];
195 [super moveLeft:sender];
196 [self setAction:originalAction];
199 - (void)moveRight:(id)sender
201 SEL originalAction = [self action];
203 [self setAction:@selector(wxNSSliderMoveRight:)];
204 [super moveRight:sender];
205 [self setAction:originalAction];
208 - (void)pageUp:(id)sender
210 SEL originalAction = [self action];
212 [self setAction:@selector(wxNSSliderPageUp:)];
213 [super pageUp:sender];
214 [self setAction:originalAction];
217 - (void)pageDown:(id)sender
219 SEL originalAction = [self action];
221 [self setAction:@selector(wxNSSliderPageDown:)];
222 [super pageDown:sender];
223 [self setAction:originalAction];
228 // ============================================================================
229 // @class wxPoserNSSliderCell
230 // ============================================================================
232 #define kwxNSSliderStartTracking @"wxNSSliderStartTracking"
233 #define kwxNSSliderContinueTracking @"wxNSSliderContinueTracking"
234 #define kwxNSSliderStopTracking @"wxNSSliderStopTracking"
236 @interface wxPoserNSSliderCell : NSSliderCell
239 WX_IMPLEMENT_POSER(wxPoserNSSliderCell);
240 @implementation wxPoserNSSliderCell : NSSliderCell
241 - (BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView
243 BOOL result = [super startTrackingAt:startPoint inView:controlView];
244 [[NSNotificationCenter defaultCenter] postNotificationName:kwxNSSliderStartTracking object:controlView];
248 - (BOOL)continueTracking:(NSPoint)lastPoint at:(NSPoint)currentPoint inView:(NSView *)controlView
250 BOOL result = [super continueTracking:lastPoint at:currentPoint inView:controlView];
251 [[NSNotificationCenter defaultCenter] postNotificationName:kwxNSSliderContinueTracking object:controlView];
255 - (void)stopTracking:(NSPoint)lastPoint at:(NSPoint)stopPoint inView:(NSView *)controlView mouseIsUp:(BOOL)flag
257 [super stopTracking:lastPoint at:stopPoint inView:controlView mouseIsUp:flag];
258 [[NSNotificationCenter defaultCenter] postNotificationName:kwxNSSliderStopTracking object:controlView];
262 // ============================================================================
263 // @class wxNSSliderNotificationObserver
264 // ============================================================================
265 @interface wxNSSliderNotificationObserver : NSObject
269 struct objc_object *wxCocoaNSSlider::sm_cocoaObserver = [[wxNSSliderNotificationObserver alloc] init];
271 - (void)startTracking: (NSNotification *)notification;
272 - (void)continueTracking: (NSNotification *)notification;
273 - (void)stopTracking: (NSNotification *)notification;
274 @end // interface wxNSSliderNotificationObserver
276 @implementation wxNSSliderNotificationObserver : NSObject
278 - (void)startTracking: (NSNotification *)notification;
280 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa([notification object]);
281 wxCHECK_RET(slider,wxT("startTracking received but no wxSlider exists"));
282 slider->CocoaNotification_startTracking(notification);
285 - (void)continueTracking: (NSNotification *)notification;
287 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa([notification object]);
288 wxCHECK_RET(slider,wxT("continueTracking received but no wxSlider exists"));
289 slider->CocoaNotification_continueTracking(notification);
292 - (void)stopTracking: (NSNotification *)notification;
294 wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa([notification object]);
295 wxCHECK_RET(slider,wxT("stopTracking received but no wxSlider exists"));
296 slider->CocoaNotification_stopTracking(notification);
299 @end // implementation wxNSSliderNotificationObserver
301 // ============================================================================
302 // class wxCocoaNSSlider
303 // ============================================================================
304 const wxObjcAutoRefFromAlloc<struct objc_object*> wxCocoaNSSlider::sm_cocoaTarget = [[wxNSSliderTarget alloc] init];
307 void wxCocoaNSSlider::AssociateNSSlider(WX_NSSlider cocoaNSSlider)
311 sm_cocoaHash.insert(wxCocoaNSSliderHash::value_type(cocoaNSSlider,this));
312 [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(startTracking:) name:kwxNSSliderStartTracking object:cocoaNSSlider];
313 [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(continueTracking:) name:kwxNSSliderContinueTracking object:cocoaNSSlider];
314 [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(stopTracking:) name:kwxNSSliderStopTracking object:cocoaNSSlider];
315 [cocoaNSSlider setTarget:sm_cocoaTarget];
319 void wxCocoaNSSlider::DisassociateNSSlider(WX_NSSlider cocoaNSSlider)
323 sm_cocoaHash.erase(cocoaNSSlider);
324 [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:kwxNSSliderStartTracking object:cocoaNSSlider];
325 [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:kwxNSSliderContinueTracking object:cocoaNSSlider];
326 [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:kwxNSSliderStopTracking object:cocoaNSSlider];