// Created: 2003/03/16
// RCS-ID: $Id:
// Copyright: (c) 2003 David Elliott
-// Licence: wxWindows license
+// Licence: wxWidgets licence
/////////////////////////////////////////////////////////////////////////////
-#include "wx/app.h"
-#include "wx/checkbox.h"
-#include "wx/log.h"
+#include "wx/wxprec.h"
+
+#if wxUSE_CHECKBOX
+
+#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>
const wxValidator& validator,
const wxString& name)
{
+ wxAutoNSAutoreleasePool pool;
if(!CreateControl(parent,winid,pos,size,style,validator,name))
return false;
m_cocoaNSView = NULL;
- NSRect cocoaRect = NSMakeRect(10,10,20,20);
- SetNSButton([[NSButton alloc] initWithFrame: cocoaRect]);
+ SetNSButton([[NSButton alloc] initWithFrame: MakeDefaultNSRect(size)]);
[m_cocoaNSView release];
[GetNSButton() setButtonType: NSSwitchButton];
- [GetNSButton() setTitle:[NSString stringWithCString: label.c_str()]];
+ [GetNSButton() setAllowsMixedState: Is3State()];
+ [GetNSButton() setTitle:wxNSStringWithWxString(wxStripMenuCodes(label))];
[GetNSControl() sizeToFit];
if(m_parent)
m_parent->CocoaAddChild(this);
+ SetInitialFrameRect(pos,size);
+
return true;
}
wxCheckBox::~wxCheckBox()
{
- DisassociateNSButton(m_cocoaNSView);
+ DisassociateNSButton(GetNSButton());
}
-void wxCheckBox::SetValue(bool)
+void wxCheckBox::SetValue(bool value)
{
+ [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
{
- return false;
+ int state = [GetNSButton() state];
+ 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");
+ 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_COMMAND_CHECKBOX_CLICKED, GetId());
+ InitCommandEvent(event); // event.SetEventObject(this);
+ event.SetInt(Get3StateValue());
+ Command(event);
}
+#endif