NSSlider.mm 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name: src/cocoa/NSSlider.mm
  3. // Purpose: wxCocoaNSSlider class
  4. // Author: Mark Oxenham
  5. // Modified by: David Elliott
  6. // Created: 2007/08/10
  7. // Copyright: (c) 2007 Software 2000 Ltd. All rights reserved.
  8. // Licence: wxWindows licence
  9. /////////////////////////////////////////////////////////////////////////////
  10. #include "wx/wxprec.h"
  11. #ifndef WX_PRECOMP
  12. #include "wx/log.h"
  13. #endif // WX_PRECOMP
  14. #include "wx/cocoa/NSSlider.h"
  15. #import <Foundation/NSNotification.h>
  16. #import <Foundation/NSString.h>
  17. #import <AppKit/NSEvent.h>
  18. #include "wx/cocoa/objc/NSSlider.h"
  19. WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSSlider)
  20. class wxCocoaNSSliderLastSelectorChanger
  21. {
  22. public:
  23. wxCocoaNSSliderLastSelectorChanger(SEL newSelector)
  24. {
  25. m_savedResponderSelector = wxCocoaNSSlider::sm_lastResponderSelector;
  26. wxCocoaNSSlider::sm_lastResponderSelector = newSelector;
  27. }
  28. ~wxCocoaNSSliderLastSelectorChanger()
  29. {
  30. wxCocoaNSSlider::sm_lastResponderSelector = m_savedResponderSelector;
  31. }
  32. private:
  33. SEL m_savedResponderSelector;
  34. // Don't allow any default or copy construction
  35. wxCocoaNSSliderLastSelectorChanger();
  36. wxCocoaNSSliderLastSelectorChanger(const wxCocoaNSSliderLastSelectorChanger&);
  37. void operator=(const wxCocoaNSSliderLastSelectorChanger&);
  38. };
  39. // ============================================================================
  40. // @class WXNSSlider
  41. // ============================================================================
  42. @implementation WXNSSlider : NSSlider
  43. // Override to ensure that WXNSSlider gets created with a WXNSSliderCell
  44. + (Class)cellClass
  45. {
  46. return [WX_GET_OBJC_CLASS(WXNSSliderCell) class];
  47. }
  48. // The following methods are all NSResponder methods which NSSlider responds
  49. // to in order to change its state and send the action message. We override
  50. // them simply to record which one was called. This allows code listening
  51. // only for the action message to determine what caused the action.
  52. // Note that this is perfectly fine being a global because Cocoa processes
  53. // events synchronously and only in the main thread.
  54. - (void)keyDown:(NSEvent *)theEvent
  55. {
  56. wxCocoaNSSliderLastSelectorChanger savedSelector(_cmd);
  57. [super keyDown:theEvent];
  58. }
  59. - (void)moveUp:(id)sender
  60. {
  61. wxCocoaNSSliderLastSelectorChanger savedSelector(_cmd);
  62. [super moveUp:sender];
  63. }
  64. - (void)moveDown:(id)sender
  65. {
  66. wxCocoaNSSliderLastSelectorChanger savedSelector(_cmd);
  67. [super moveDown:sender];
  68. }
  69. - (void)moveLeft:(id)sender
  70. {
  71. wxCocoaNSSliderLastSelectorChanger savedSelector(_cmd);
  72. [super moveLeft:sender];
  73. }
  74. - (void)moveRight:(id)sender
  75. {
  76. wxCocoaNSSliderLastSelectorChanger savedSelector(_cmd);
  77. [super moveRight:sender];
  78. }
  79. - (void)pageUp:(id)sender
  80. {
  81. wxCocoaNSSliderLastSelectorChanger savedSelector(_cmd);
  82. [super pageUp:sender];
  83. }
  84. - (void)pageDown:(id)sender
  85. {
  86. wxCocoaNSSliderLastSelectorChanger savedSelector(_cmd);
  87. [super pageDown:sender];
  88. }
  89. @end
  90. WX_IMPLEMENT_GET_OBJC_CLASS(WXNSSlider,NSSlider)
  91. // ============================================================================
  92. // @class WXNSSliderCell
  93. // ============================================================================
  94. @implementation WXNSSliderCell : NSSliderCell
  95. - (BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView
  96. {
  97. BOOL result = [super startTrackingAt:startPoint inView:controlView];
  98. wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(controlView);
  99. if(slider)
  100. slider->CocoaNotification_startTracking(NULL);
  101. return result;
  102. }
  103. - (BOOL)continueTracking:(NSPoint)lastPoint at:(NSPoint)currentPoint inView:(NSView *)controlView
  104. {
  105. BOOL result = [super continueTracking:lastPoint at:currentPoint inView:controlView];
  106. wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(controlView);
  107. if(slider)
  108. slider->CocoaNotification_continueTracking(NULL);
  109. return result;
  110. }
  111. - (void)stopTracking:(NSPoint)lastPoint at:(NSPoint)stopPoint inView:(NSView *)controlView mouseIsUp:(BOOL)flag
  112. {
  113. [super stopTracking:lastPoint at:stopPoint inView:controlView mouseIsUp:flag];
  114. wxCocoaNSSlider *slider = wxCocoaNSSlider::GetFromCocoa(controlView);
  115. if(slider)
  116. slider->CocoaNotification_stopTracking(NULL);
  117. }
  118. @end
  119. WX_IMPLEMENT_GET_OBJC_CLASS(WXNSSliderCell,NSSliderCell)
  120. // ============================================================================
  121. // class wxCocoaNSSlider
  122. // ============================================================================
  123. SEL wxCocoaNSSlider::sm_lastResponderSelector;
  124. void wxCocoaNSSlider::AssociateNSSlider(WX_NSSlider cocoaNSSlider)
  125. {
  126. if(cocoaNSSlider)
  127. {
  128. sm_cocoaHash.insert(wxCocoaNSSliderHash::value_type(cocoaNSSlider,this));
  129. }
  130. }
  131. void wxCocoaNSSlider::DisassociateNSSlider(WX_NSSlider cocoaNSSlider)
  132. {
  133. if(cocoaNSSlider)
  134. {
  135. sm_cocoaHash.erase(cocoaNSSlider);
  136. }
  137. }