X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1b2b1638a203ea88439e07d967aaa2c95373729a..6d6da89ccb7a6aae5cfefe66147a7055ab0854d6:/src/mac/textctrl.cpp diff --git a/src/mac/textctrl.cpp b/src/mac/textctrl.cpp index 3b7918178b..3af794db35 100644 --- a/src/mac/textctrl.cpp +++ b/src/mac/textctrl.cpp @@ -52,56 +52,11 @@ #include "wx/mac/uma.h" extern wxApp *wxTheApp ; -// CS:We will replace the TextEdit by using the MultiLanguageTextEngine based on the following code written by apple -/* - File: mUPControl.c - - Description: - mUPControl implementation. - - Copyright: - © Copyright 2000 Apple Computer, Inc. All rights reserved. - - Disclaimer: - IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. - ("Apple") in consideration of your agreement to the following terms, and your - use, installation, modification or redistribution of this Apple software - constitutes acceptance of these terms. If you do not agree with these terms, - please do not use, install, modify or redistribute this Apple software. - - In consideration of your agreement to abide by the following terms, and subject - to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs - copyrights in this original Apple software (the "Apple Software"), to use, - reproduce, modify and redistribute the Apple Software, with or without - modifications, in source and/or binary forms; provided that if you redistribute - the Apple Software in its entirety and without modifications, you must retain - this notice and the following text and disclaimers in all such redistributions of - the Apple Software. Neither the name, trademarks, service marks or logos of - Apple Computer, Inc. may be used to endorse or promote products derived from the - Apple Software without specific prior written permission from Apple. Except as - expressly stated in this notice, no other rights or licenses, express or implied, - are granted by Apple herein, including but not limited to any patent rights that - may be infringed by your derivative works or by other works in which the Apple - Software may be incorporated. - - The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO - WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED - WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN - COMBINATION WITH YOUR PRODUCTS. - - IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION - OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT - (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Change History (most recent first): - Fri, Jan 28, 2000 -- created -*/ +// CS:TODO we still have a problem getting properly at the text events of a control because under Carbon +// the MLTE engine registers itself for the key events thus the normal flow never occurs, the only measure for the +// moment is to avoid setting the true focus on the control, the proper solution at the end would be to have +// an alternate path for carbon key events that routes automatically into the same wx flow of events #include "MacTextEditor.h" @@ -159,7 +114,6 @@ typedef struct { /* OS records referenced */ TXNObject fTXNRec; /* the txn record */ TXNFrameID fTXNFrame; /* the txn frame ID */ - bool fMultiline ; ControlHandle fUserPaneRec; /* handle to the user pane control */ WindowPtr fOwner; /* window containing control */ GrafPtr fDrawingEnvironment; /* grafport where control is drawn */ @@ -176,6 +130,7 @@ typedef struct { /* our focus advance override routine */ EventHandlerUPP handlerUPP; EventHandlerRef handlerRef; + bool fMultiline ; } STPTextPaneVars; @@ -192,13 +147,6 @@ ControlUserPaneKeyDownUPP gTPKeyProc = NULL; ControlUserPaneActivateUPP gTPActivateProc = NULL; ControlUserPaneFocusUPP gTPFocusProc = NULL; - /* events handled by our focus advance override routine */ -#if TARGET_CARBON -//static const EventTypeSpec gMLTEEvents[] = { { kEventClassTextInput, kEventUnicodeForKeyEvent } }; -//#define kMLTEEventCount (sizeof( gMLTEEvents ) / sizeof( EventTypeSpec )) -#endif - - /* TPActivatePaneText activates or deactivates the text edit record according to the value of setActive. The primary purpose of this routine is to ensure each call is only made once. */ @@ -210,7 +158,7 @@ static void TPActivatePaneText(STPTextPaneVars **tpvars, Boolean setActive) { varsp->fTEActive = setActive; TXNActivate(varsp->fTXNRec, varsp->fTXNFrame, varsp->fTEActive); - + if (varsp->fInFocus) TXNFocus( varsp->fTXNRec, varsp->fTEActive); } @@ -237,6 +185,7 @@ static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart char state; Rect bounds; /* set up our globals */ + tpvars = (STPTextPaneVars **) GetControlReference(theControl); if (tpvars != NULL) { state = HGetState((Handle) tpvars); @@ -252,7 +201,7 @@ static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart Rect oldbounds = varsp->fRFocusOutline ; InsetRect( &oldbounds , -1 , -1 ) ; -// InvalWindowRect( GetControlOwner( theControl ) , &oldbounds ) ; + InvalWindowRect( GetControlOwner( theControl ) , &oldbounds ) ; SetRect(&varsp->fRFocusOutline, bounds.left, bounds.top, bounds.right, bounds.bottom); SetRect(&varsp->fRTextOutline, bounds.left, bounds.top, bounds.right, bounds.bottom); SetRect(&varsp->fRTextArea, bounds.left + 2 , bounds.top + (varsp->fMultiline ? 0 : 2) , @@ -400,7 +349,12 @@ static pascal ControlPartCode TPPaneKeyDownProc(ControlHandle theControl, if ((**tpvars).fInFocus) { /* turn autoscrolling on and send the key event to text edit */ SetPort((**tpvars).fDrawingEnvironment); - TXNKeyDown( (**tpvars).fTXNRec, (const EventRecord*) wxTheApp->MacGetCurrentEvent()); + EventRecord ev ; + memset( &ev , 0 , sizeof( ev ) ) ; + ev.what = keyDown ; + ev.modifiers = modifiers ; + ev.message = (( keyCode & keyCodeMask ) << 8 ) + ( charCode & charCodeMask ) ; + TXNKeyDown( (**tpvars).fTXNRec, &ev); } } return kControlEntireControl; @@ -495,39 +449,6 @@ static pascal ControlPartCode TPPaneFocusProc(ControlHandle theControl, ControlF return focusResult; } -//This our carbon event handler for unicode key downs -#if TARGET_CARBON -static pascal OSStatus FocusAdvanceOverride(EventHandlerCallRef myHandler, EventRef event, void* userData) { - WindowRef window; - STPTextPaneVars **tpvars; - OSStatus err; - unsigned short mUnicodeText; - ByteCount charCounts=0; - /* get our window pointer */ - tpvars = (STPTextPaneVars **) userData; - window = (**tpvars).fOwner; - //find out how many bytes are needed - err = GetEventParameter(event, kEventParamTextInputSendText, - typeUnicodeText, NULL, 0, &charCounts, NULL); - if (err != noErr) goto bail; - /* we're only looking at single characters */ - if (charCounts != 2) { err = eventNotHandledErr; goto bail; } - /* get the character */ - err = GetEventParameter(event, kEventParamTextInputSendText, - typeUnicodeText, NULL, sizeof(mUnicodeText), - &charCounts, (char*) &mUnicodeText); - if (err != noErr) goto bail; - /* if it's not the tab key, forget it... */ - if ((mUnicodeText != '\t')) { err = eventNotHandledErr; goto bail; } - /* advance the keyboard focus */ - AdvanceKeyboardFocus(window); - /* noErr lets the CEM know we handled the event */ - return noErr; -bail: - return eventNotHandledErr; -} -#endif - /* mUPOpenControl initializes a user pane control so it will be drawn and will behave as a scrolling text edit field inside of a window. @@ -594,28 +515,27 @@ OSStatus mUPOpenControl(ControlHandle theControl, bool multiline) /* create the new edit field */ TXNNewObject(NULL, varsp->fOwner, &varsp->fRTextArea, - ( multiline ? kTXNWantVScrollBarMask : 0 ) - | kTXNAlwaysWrapAtViewEdgeMask, + ( multiline ? kTXNWantVScrollBarMask : 0 ) | + kTXNDontDrawCaretWhenInactiveMask | + kTXNDontDrawSelectionWhenInactiveMask | + kTXNAlwaysWrapAtViewEdgeMask, kTXNTextEditStyleFrameType, kTXNTextensionFile, kTXNSystemDefaultEncoding, &varsp->fTXNRec, &varsp->fTXNFrame, (TXNObjectRefcon) tpvars); - /* set the field's font and style */ - TXNTypeAttributes typeAttr[2]; - typeAttr[0].tag = kTXNQDFontSizeAttribute; - typeAttr[0].size = kTXNFontSizeAttributeSize; - typeAttr[0].data.dataValue = 10 << 16; - - typeAttr[1].tag = kTXNQDFontStyleAttribute; - typeAttr[1].size = kTXNQDFontStyleAttributeSize; - typeAttr[1].data.dataValue = normal ; + Str255 fontName ; + SInt16 fontSize ; + Style fontStyle ; + + GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ; - /* this does not seem to get the font id through - typeAttr[2].tag = kTXNQDFontFamilyIDAttribute ; // NameAttribute; - typeAttr[2].size = kTXNQDFontFamilyIDAttributeSize ; // kTXNQDFontNameAttributeSize; - typeAttr[2].data.dataValue = kFontIDTimes ; // (void*) "\pGeneva" ; - */ + TXNTypeAttributes typeAttr[] = + { + { kTXNQDFontNameAttribute , kTXNQDFontNameAttributeSize , { (void*) fontName } } , + { kTXNQDFontSizeAttribute , kTXNFontSizeAttributeSize , { (void*) (fontSize << 16) } } , + { kTXNQDFontStyleAttribute , kTXNQDFontStyleAttributeSize , { (void*) normal } } , + } ; OSStatus status = TXNSetTypeAttributes (varsp->fTXNRec, sizeof( typeAttr ) / sizeof(TXNTypeAttributes) , typeAttr, kTXNStartOffset, @@ -624,13 +544,6 @@ OSStatus mUPOpenControl(ControlHandle theControl, bool multiline) tback.bgType = kTXNBackgroundTypeRGB; tback.bg.color = rgbWhite; TXNSetBackground( varsp->fTXNRec, &tback); - - /* install our focus advance override routine */ -#if TARGET_CARBON -// varsp->handlerUPP = NewEventHandlerUPP(FocusAdvanceOverride); -// err = InstallWindowEventHandler( varsp->fOwner, varsp->handlerUPP, -// kMLTEEventCount, gMLTEEvents, tpvars, &varsp->handlerRef ); -#endif /* unlock our storage */ HUnlock((Handle) tpvars); @@ -667,8 +580,9 @@ END_EVENT_TABLE() // Text item wxTextCtrl::wxTextCtrl() { - ((TEHandle) m_macTE) = NULL ; - ((TXNObject) m_macTXN) = NULL ; + m_macTE = NULL ; + m_macTXN = NULL ; + m_macTXNvars = NULL ; m_macUsesTXN = false ; m_editable = true ; } @@ -677,16 +591,11 @@ wxTextCtrl::~wxTextCtrl() { if ( m_macUsesTXN ) { + SetControlReference((ControlHandle)m_macControl, 0) ; TXNDeleteObject((TXNObject)m_macTXN); - #if TARGET_CARBON - /* remove our focus advance override */ - // RemoveEventHandler((**tpvars).handlerRef); - // DisposeEventHandlerUPP((**tpvars).handlerUPP); - #endif /* delete our private storage */ DisposeHandle((Handle) m_macTXNvars); /* zero the control reference */ - SetControlReference((ControlHandle)m_macControl, 0) ; } } @@ -700,8 +609,9 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString& name) { - ((TEHandle) m_macTE) = NULL ; - ((TXNObject) m_macTXN) = NULL ; + m_macTE = NULL ; + m_macTXN = NULL ; + m_macTXNvars = NULL ; m_macUsesTXN = false ; m_editable = true ; @@ -728,17 +638,16 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, Rect bounds ; Str255 title ; - + /* if ( mySize.y == -1 ) { - if ( !m_macUsesTXN ) - mySize.y = 13 ; - else - mySize.y = 16 ; + mySize.y = 13 ; + if ( m_windowStyle & wxTE_MULTILINE ) + mySize.y *= 5 ; mySize.y += 2 * m_macVerticalBorder ; } - + */ MacPreControlCreate( parent , id , "" , pos , mySize ,style, validator , name , &bounds , title ) ; if ( m_windowStyle & wxTE_MULTILINE ) @@ -752,7 +661,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, if ( !m_macUsesTXN ) { - m_macControl = ::NewControl( (GrafPtr) parent->MacGetRootWindow() , &bounds , "\p" , true , 0 , 0 , 1, + m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , "\p" , true , 0 , 0 , 1, (style & wxTE_PASSWORD) ? kControlEditTextPasswordProc : kControlEditTextProc , (long) this ) ; long size ; ::GetControlData((ControlHandle) m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &((TEHandle) m_macTE) , &size ) ; @@ -762,13 +671,17 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, { short featurSet; - featurSet = kControlSupportsEmbedding | kControlSupportsFocus | kControlWantsIdle + featurSet = kControlSupportsEmbedding | kControlSupportsFocus // | kControlWantsIdle | kControlWantsActivate | kControlHandlesTracking | kControlHasSpecialBackground | kControlGetsFocusOnClick | kControlSupportsLiveFeedback; /* create the control */ - m_macControl = NewControl((GrafPtr) parent->MacGetRootWindow(), &bounds, "\p", true, featurSet, 0, featurSet, kControlUserPaneProc, 0); + m_macControl = NewControl(MAC_WXHWND(parent->MacGetRootWindow()), &bounds, "\p", true, featurSet, 0, featurSet, kControlUserPaneProc, 0); /* set up the mUP specific features and data */ mUPOpenControl((ControlHandle) m_macControl, m_windowStyle & wxTE_MULTILINE ); + if ( parent ) + { + parent->MacGetTopLevelWindow()->MacInstallEventHandler() ; + } } MacPostControlCreate() ; @@ -818,7 +731,8 @@ wxString wxTextCtrl::GetValue() const else { actualsize = GetHandleSize( theText ) ; - strncpy( wxBuffer , *theText , actualsize ) ; + if (actualsize != 0) + strncpy( wxBuffer , *theText , actualsize ) ; DisposeHandle( theText ) ; } } @@ -1129,7 +1043,7 @@ void wxTextCtrl::WriteText(const wxString& text) } else { - TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (const char*)value, value.Length(), + TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*) (const char*)value, value.Length(), kTXNUseCurrentSelection, kTXNUseCurrentSelection); } MacRedrawControl() ; @@ -1179,12 +1093,15 @@ wxSize wxTextCtrl::DoGetBestSize() const { int wText = 100 ; - int hText ; - if ( UMAHasAppearance() ) - hText = 13 ; - else - hText = 24 ; - hText += 2 * m_macHorizontalBorder ; + int hText; + if ( m_macUsesTXN ) + { + hText = 17 ; + } + else + { + hText = 13 ; + } /* int cx, cy; wxGetCharSize(GetHWND(), &cx, &cy, &GetFont()); @@ -1197,8 +1114,10 @@ wxSize wxTextCtrl::DoGetBestSize() const */ if ( m_windowStyle & wxTE_MULTILINE ) { - hText *= wxMin(GetNumberOfLines(), 5); + hText *= 5 ; } + hText += 2 * m_macVerticalBorder ; + wText += 2 * m_macHorizontalBorder ; //else: for single line control everything is ok return wxSize(wText, hText); } @@ -1319,6 +1238,7 @@ wxString wxTextCtrl::GetLineText(long lineNo) const } if (content[i] == '\r') count++; } + return "" ; } /* @@ -1430,6 +1350,40 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) } } +void wxTextCtrl::MacSuperShown( bool show ) +{ + bool former = m_macControlIsShown ; + wxControl::MacSuperShown( show ) ; + if ( (former != m_macControlIsShown) && m_macUsesTXN ) + { + if ( m_macControlIsShown ) + TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, + (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.bottom,(**(STPTextPaneVars **)m_macTXNvars).fRTextArea.right, (**(STPTextPaneVars **)m_macTXNvars).fTXNFrame); + else + TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, + (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.bottom + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.right, (**(STPTextPaneVars **)m_macTXNvars).fTXNFrame); + } +} + +bool wxTextCtrl::Show(bool show) +{ + bool former = m_macControlIsShown ; + + bool retval = wxControl::Show( show ) ; + + if ( former != m_macControlIsShown ) + { + if ( m_macControlIsShown ) + TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, + (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.bottom,(**(STPTextPaneVars **)m_macTXNvars).fRTextArea.right, (**(STPTextPaneVars **)m_macTXNvars).fTXNFrame); + else + TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, + (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.bottom + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.right, (**(STPTextPaneVars **)m_macTXNvars).fTXNFrame); + } + + return retval ; +} + // ---------------------------------------------------------------------------- // standard handlers for standard edit menu events // ----------------------------------------------------------------------------