X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/570aaadf1ff3f8c3f8ecfea44dbeae64532c82c4..c40fd721e4fb645c97368d0492ddb1a7a8922c53:/src/cocoa/textctrl.mm?ds=sidebyside diff --git a/src/cocoa/textctrl.mm b/src/cocoa/textctrl.mm index e062ea4f42..d33626cd18 100644 --- a/src/cocoa/textctrl.mm +++ b/src/cocoa/textctrl.mm @@ -1,24 +1,36 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: cocoa/textctrl.mm +// Name: src/cocoa/textctrl.mm // Purpose: wxTextCtrl // Author: David Elliott -// Modified by: +// Modified by: Mark Oxenham // Created: 2003/03/16 -// RCS-ID: $Id: +// RCS-ID: $Id$ // Copyright: (c) 2003 David Elliott -// Licence: wxWindows license +// Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// -#include "wx/app.h" +#include "wx/wxprec.h" + #include "wx/textctrl.h" +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/log.h" +#endif //WX_PRECOMP + #include "wx/cocoa/string.h" +#include "wx/cocoa/autorelease.h" + #import #import +#import +#import -IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl) -BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) +#include + +IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxTextCtrlBase) +BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase) END_EVENT_TABLE() WX_IMPLEMENT_COCOA_OWNER(wxTextCtrl,NSTextField,NSControl,NSView) @@ -30,32 +42,88 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID winid, const wxValidator& validator, const wxString& name) { + wxAutoNSAutoreleasePool pool; if(!CreateControl(parent,winid,pos,size,style,validator,name)) return false; m_cocoaNSView = NULL; - SetNSTextField([[NSTextField alloc] initWithFrame:NSMakeRect(0,0,30,30)]); + SetNSTextField([(style & wxTE_PASSWORD)?[NSSecureTextField alloc]:[NSTextField alloc] initWithFrame:MakeDefaultNSRect(size)]); [m_cocoaNSView release]; - [GetNSTextField() setStringValue:[NSString stringWithCString:value.c_str()]]; + [GetNSTextField() setStringValue:wxNSStringWithWxString(value)]; + [GetNSControl() sizeToFit]; + NSRect currentFrame = [m_cocoaNSView frame]; + if(currentFrame.size.width < 70) + { + currentFrame.size.width = 70; + [m_cocoaNSView setFrame:currentFrame]; + } if(m_parent) m_parent->CocoaAddChild(this); + SetInitialFrameRect(pos,size); + + [(NSTextField*)m_cocoaNSView setTarget: sm_cocoaTarget]; + [(NSTextField*)m_cocoaNSView setAction:@selector(wxNSControlAction:)]; + + // set the text alignment option + NSTextAlignment alignStyle; + if (style & wxTE_RIGHT) + alignStyle = NSRightTextAlignment; + else if (style & wxTE_CENTRE) + alignStyle = NSCenterTextAlignment; + else // default to wxTE_LEFT because it is 0 and can't be tested + alignStyle = NSLeftTextAlignment; + [GetNSControl() setAlignment:alignStyle]; + + // if Read-only then set as such, this flag is overwritable by wxTextCtrl::SetEditable(TRUE) + if (style & wxTE_READONLY) + { + SetEditable(FALSE); + } + return true; } wxTextCtrl::~wxTextCtrl() { - DisassociateNSTextField(m_cocoaNSView); + DisassociateNSTextField(GetNSTextField()); } void wxTextCtrl::Cocoa_didChangeText(void) { } +void wxTextCtrl::CocoaTarget_action(void) +{ + // NSTextField only sends the action message on enter key press and thus + // we send the appropriate event type. + wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, GetId()); + + // See wxTextCtrlBase::SendTextUpdatedEvent for why we don't set the string. + //event.SetString(GetValue()); + + event.SetEventObject(this); + HandleWindowEvent(event); +} + void wxTextCtrl::AppendText(wxString const&) { } -void wxTextCtrl::SetEditable(bool) +void wxTextCtrl::SetEditable(bool editable) +{ + // first ensure that the current value is stored (in case the user had not finished editing + // before SetEditable(FALSE) was called) + DoSetValue(GetValue(),1); + + [GetNSTextField() setEditable: editable]; + + // forces the focus on the textctrl to be lost - while focus is still maintained + // after SetEditable(FALSE) the user may still edit the control + // (might not the best way to do this..) + [GetNSTextField() abortEditing]; +} + +void wxTextCtrl::MarkDirty() { } @@ -111,9 +179,13 @@ void wxTextCtrl::Replace(long, long, wxString const&) { } -void wxTextCtrl::SetValue(wxString const& value) +void wxTextCtrl::DoSetValue(wxString const& value, int flags) { + wxAutoNSAutoreleasePool pool; [GetNSTextField() setStringValue: wxNSStringWithWxString(value)]; + + if ( flags & SetValue_SendEvent ) + SendTextUpdatedEvent(); } void wxTextCtrl::WriteText(wxString const&) @@ -122,7 +194,7 @@ void wxTextCtrl::WriteText(wxString const&) bool wxTextCtrl::IsEditable() const { - return true; + return [GetNSTextField() isEditable]; } bool wxTextCtrl::IsModified() const @@ -154,9 +226,10 @@ int wxTextCtrl::GetLineLength(long) const return 0; } -long wxTextCtrl::GetLastPosition() const +wxTextPos wxTextCtrl::GetLastPosition() const { - return 0; + // working - returns the size of the wxString + return (long)(GetValue().Len()); } int wxTextCtrl::GetNumberOfLines() const @@ -181,6 +254,19 @@ bool wxTextCtrl::CanUndo() const wxString wxTextCtrl::GetValue() const { - return wxString([[GetNSTextField() stringValue] lossyCString]); + wxAutoNSAutoreleasePool pool; + return wxStringWithNSString([GetNSTextField() stringValue]); } +wxSize wxTextCtrl::DoGetBestSize() const +{ + wxAutoNSAutoreleasePool pool; + wxASSERT(GetNSControl()); + NSCell *cell = [GetNSControl() cell]; + wxASSERT(cell); + NSSize cellSize = [cell cellSize]; + wxSize size(100,(int)ceil(cellSize.height)); + + wxLogTrace(wxTRACE_COCOA_Window_Size,wxT("wxTextCtrl=%p::DoGetBestSize()==(%d,%d)"),this,size.x,size.y); + return size; +}