#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"
/* 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 */
/* our focus advance override routine */
EventHandlerUPP handlerUPP;
EventHandlerRef handlerRef;
+ bool fMultiline ;
} STPTextPaneVars;
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. */
varsp->fTEActive = setActive;
TXNActivate(varsp->fTXNRec, varsp->fTXNFrame, varsp->fTEActive);
-
+
if (varsp->fInFocus)
TXNFocus( varsp->fTXNRec, varsp->fTEActive);
}
char state;
Rect bounds;
/* set up our globals */
+
tpvars = (STPTextPaneVars **) GetControlReference(theControl);
if (tpvars != NULL) {
state = HGetState((Handle) tpvars);
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) ,
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;
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.
/* 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,
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);
// 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 ;
}
{
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) ;
}
}
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 ;
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 )
{
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() ;
else
{
actualsize = GetHandleSize( theText ) ;
- strncpy( wxBuffer , *theText , actualsize ) ;
+ if (actualsize != 0)
+ strncpy( wxBuffer , *theText , actualsize ) ;
DisposeHandle( theText ) ;
}
}
{
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());
*/
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);
}
}
if (content[i] == '\r') count++;
}
+ return "" ;
}
/*
}
}
+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
// ----------------------------------------------------------------------------