1///////////////////////////////////////////////////////////////////////////// 2// Name: src/cocoa/checkbox.mm 3// Purpose: wxCheckBox 4// Author: David Elliott 5// Modified by: 6// Created: 2003/03/16 7// Copyright: (c) 2003 David Elliott 8// Licence: wxWindows licence 9///////////////////////////////////////////////////////////////////////////// 10 11#include "wx/wxprec.h" 12 13#if wxUSE_CHECKBOX 14 15#include "wx/checkbox.h" 16 17#ifndef WX_PRECOMP 18 #include "wx/log.h" 19 #include "wx/app.h" 20#endif //WX_PRECOMP 21 22#include "wx/cocoa/autorelease.h" 23#include "wx/cocoa/string.h" 24 25#import <AppKit/NSButton.h> 26#import <Foundation/NSString.h> 27 28BEGIN_EVENT_TABLE(wxCheckBox, wxCheckBoxBase) 29END_EVENT_TABLE() 30WX_IMPLEMENT_COCOA_OWNER(wxCheckBox,NSButton,NSControl,NSView) 31 32bool wxCheckBox::Create(wxWindow *parent, wxWindowID winid, 33 const wxString& label, 34 const wxPoint& pos, 35 const wxSize& size, 36 long style, 37 const wxValidator& validator, 38 const wxString& name) 39{ 40 wxAutoNSAutoreleasePool pool; 41 if(!CreateControl(parent,winid,pos,size,style,validator,name)) 42 return false; 43 m_cocoaNSView = NULL; 44 SetNSButton([[NSButton alloc] initWithFrame: MakeDefaultNSRect(size)]); 45 [m_cocoaNSView release]; 46 [GetNSButton() setButtonType: NSSwitchButton]; 47 [GetNSButton() setAllowsMixedState: Is3State()]; 48 CocoaSetLabelForObject(label, GetNSButton()); 49 [GetNSControl() sizeToFit]; 50 51 if(m_parent) 52 m_parent->CocoaAddChild(this); 53 SetInitialFrameRect(pos,size); 54 55 return true; 56} 57 58wxCheckBox::~wxCheckBox() 59{ 60 DisassociateNSButton(GetNSButton()); 61} 62 63void wxCheckBox::SetValue(bool value) 64{ 65 [GetNSButton() setState: value?NSOnState:NSOffState]; 66} 67 68void wxCheckBox::DoSet3StateValue(wxCheckBoxState state) 69{ 70 int cocoaState; 71 switch(state) 72 { 73 case wxCHK_UNCHECKED: 74 cocoaState = NSOffState; 75 break; 76 case wxCHK_CHECKED: 77 cocoaState = NSOnState; 78 break; 79 case wxCHK_UNDETERMINED: 80 // Base class would have already set state to wxCHK_UNCHECKED 81// wxASSERT_MSG(Is3State(),"Use the wxCHK_3STATE style flag"); 82 cocoaState = NSMixedState; 83 break; 84 default: 85 wxFAIL_MSG(wxT("Invalid state in wxCheckBox::DoSet3StateValue")); 86 return; 87 } 88 [GetNSButton() setState:cocoaState]; 89} 90 91bool wxCheckBox::GetValue() const 92{ 93 int state = [GetNSButton() state]; 94 wxASSERT_MSG(state!=NSMixedState || Is3State(), 95 wxT("NSMixedState returned from a 2-state checkbox")); 96 return state!=NSOffState; 97} 98 99wxCheckBoxState wxCheckBox::DoGet3StateValue() const 100{ 101 switch([GetNSButton() state]) 102 { 103 case NSOffState: 104 return wxCHK_UNCHECKED; 105 case NSOnState: 106 return wxCHK_CHECKED; 107 default: 108 wxFAIL_MSG(wxT("[NSButton -state] returned an invalid state!")); 109 case NSMixedState: 110 // Base class handles this assertion for us 111// wxASSERT_MSG(Is3State(),wxT("NSMixedState returned from a 2-state checkbox")); 112 return wxCHK_UNDETERMINED; 113 } 114} 115 116void wxCheckBox::Cocoa_wxNSButtonAction(void) 117{ 118 wxLogTrace(wxTRACE_COCOA,wxT("Checkbox")); 119 // What we really want to do is override [NSCell -nextState] to return 120 // NSOnState in lieu of NSMixedState but this works (aside from the 121 // very slightly noticeable drawing of - and then a check) -DE 122 123 // Cocoa always allows a 3-state button to transition into 124 // the mixed/undetermined state by clicking, we don't 125 if ( !Is3rdStateAllowedForUser() 126 && [GetNSButton() state] == NSMixedState ) 127 { 128 // Cocoa's sequence is on/off/mixed 129 // skip mixed, go right back to on 130 [GetNSButton() setState: NSOnState]; 131 } 132 wxCommandEvent event(wxEVT_CHECKBOX, GetId()); 133 InitCommandEvent(event); // event.SetEventObject(this); 134 event.SetInt(Get3StateValue()); 135 Command(event); 136} 137 138void wxCheckBox::SetLabel(const wxString& s) 139{ 140 wxAutoNSAutoreleasePool pool; 141 CocoaSetLabelForObject(s, GetNSButton()); 142} 143 144wxString wxCheckBox::GetLabel() const 145{ 146 wxAutoNSAutoreleasePool pool; 147 return wxStringWithNSString([GetNSButton() title]); 148 149} 150 151#endif // wxUSE_CHECKBOX 152