]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/textctrl.cpp
wxButtons no longer leave junk on dialogs when moved.
[wxWidgets.git] / src / mac / textctrl.cpp
index 451754201301468189c279c21bf26609448a61a2..3af794db3546dcce20df4798947a4fbaaf65d8a7 100644 (file)
 #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 )
@@ -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(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 ) ;
        }
      }
@@ -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
 // ----------------------------------------------------------------------------