/////////////////////////////////////////////////////////////////////////////
-// Name: cocoa/checkbox.mm
+// Name: src/cocoa/checkbox.mm
// Purpose: wxCheckBox
// Author: David Elliott
// Modified by:
// Created: 2003/03/16
-// RCS-ID: $Id:
// Copyright: (c) 2003 David Elliott
-// Licence: wxWindows license
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
+
+#if wxUSE_CHECKBOX
+
+#include "wx/checkbox.h"
+
#ifndef WX_PRECOMP
#include "wx/log.h"
#include "wx/app.h"
- #include "wx/checkbox.h"
#endif //WX_PRECOMP
#include "wx/cocoa/autorelease.h"
+#include "wx/cocoa/string.h"
#import <AppKit/NSButton.h>
#import <Foundation/NSString.h>
-IMPLEMENT_DYNAMIC_CLASS(wxCheckBox, wxControl)
BEGIN_EVENT_TABLE(wxCheckBox, wxCheckBoxBase)
END_EVENT_TABLE()
WX_IMPLEMENT_COCOA_OWNER(wxCheckBox,NSButton,NSControl,NSView)
SetNSButton([[NSButton alloc] initWithFrame: MakeDefaultNSRect(size)]);
[m_cocoaNSView release];
[GetNSButton() setButtonType: NSSwitchButton];
- [GetNSButton() setTitle:[NSString stringWithCString: label.c_str()]];
+ [GetNSButton() setAllowsMixedState: Is3State()];
+ CocoaSetLabelForObject(label, GetNSButton());
[GetNSControl() sizeToFit];
if(m_parent)
void wxCheckBox::SetValue(bool value)
{
- if(value)
- [GetNSButton() setState: NSOnState];
- else
- [GetNSButton() setState: NSOffState];
+ [GetNSButton() setState: value?NSOnState:NSOffState];
+}
+
+void wxCheckBox::DoSet3StateValue(wxCheckBoxState state)
+{
+ int cocoaState;
+ switch(state)
+ {
+ case wxCHK_UNCHECKED:
+ cocoaState = NSOffState;
+ break;
+ case wxCHK_CHECKED:
+ cocoaState = NSOnState;
+ break;
+ case wxCHK_UNDETERMINED:
+ // Base class would have already set state to wxCHK_UNCHECKED
+// wxASSERT_MSG(Is3State(),"Use the wxCHK_3STATE style flag");
+ cocoaState = NSMixedState;
+ break;
+ default:
+ wxFAIL_MSG(wxT("Invalid state in wxCheckBox::DoSet3StateValue"));
+ return;
+ }
+ [GetNSButton() setState:cocoaState];
}
bool wxCheckBox::GetValue() const
{
int state = [GetNSButton() state];
- wxASSERT(state!=NSMixedState);
- return state==NSOnState;
+ wxASSERT_MSG(state!=NSMixedState || Is3State(),
+ wxT("NSMixedState returned from a 2-state checkbox"));
+ return state!=NSOffState;
+}
+
+wxCheckBoxState wxCheckBox::DoGet3StateValue() const
+{
+ switch([GetNSButton() state])
+ {
+ case NSOffState:
+ return wxCHK_UNCHECKED;
+ case NSOnState:
+ return wxCHK_CHECKED;
+ default:
+ wxFAIL_MSG(wxT("[NSButton -state] returned an invalid state!"));
+ case NSMixedState:
+ // Base class handles this assertion for us
+// wxASSERT_MSG(Is3State(),wxT("NSMixedState returned from a 2-state checkbox"));
+ return wxCHK_UNDETERMINED;
+ }
}
void wxCheckBox::Cocoa_wxNSButtonAction(void)
{
- wxLogDebug("Checkbox");
- wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, GetId());
+ wxLogTrace(wxTRACE_COCOA,wxT("Checkbox"));
+ // What we really want to do is override [NSCell -nextState] to return
+ // NSOnState in lieu of NSMixedState but this works (aside from the
+ // very slightly noticeable drawing of - and then a check) -DE
+
+ // Cocoa always allows a 3-state button to transition into
+ // the mixed/undetermined state by clicking, we don't
+ if ( !Is3rdStateAllowedForUser()
+ && [GetNSButton() state] == NSMixedState )
+ {
+ // Cocoa's sequence is on/off/mixed
+ // skip mixed, go right back to on
+ [GetNSButton() setState: NSOnState];
+ }
+ wxCommandEvent event(wxEVT_CHECKBOX, GetId());
InitCommandEvent(event); // event.SetEventObject(this);
- event.SetInt(GetValue());
+ event.SetInt(Get3StateValue());
Command(event);
}
+void wxCheckBox::SetLabel(const wxString& s)
+{
+ wxAutoNSAutoreleasePool pool;
+ CocoaSetLabelForObject(s, GetNSButton());
+}
+
+wxString wxCheckBox::GetLabel() const
+{
+ wxAutoNSAutoreleasePool pool;
+ return wxStringWithNSString([GetNSButton() title]);
+
+}
+
+#endif // wxUSE_CHECKBOX