/////////////////////////////////////////////////////////////////////////////
// Name: textctrl.cpp
// Purpose: wxTextCtrl
-// Author: AUTHOR
+// Author: Stefan Csomor
// Modified by:
-// Created: ??/??/98
+// Created: 1998-01-01
// RCS-ID: $Id$
-// Copyright: (c) AUTHOR
+// Copyright: (c) Stefan Csomor
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#else
#include <stat.h>
#endif
-#include <fstream.h>
+
+#if wxUSE_STD_IOSTREAM
+ #if wxUSE_IOSTREAMH
+ #include <fstream.h>
+ #else
+ #include <fstream>
+ #endif
+#endif
#include "wx/app.h"
#include "wx/dc.h"
#include "TextEncodingConverter.h"
#include "wx/mac/uma.h"
-extern wxApp *wxTheApp ;
+#define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
+
+extern wxControl *wxFindControlFromMacControl(ControlHandle inControl ) ;
// 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
These routines are useful for cases where you would like to use an
existing user pane control in, say, a dialog window as a scrolling
text edit field.*/
-
+
/* mUPOpenControl initializes a user pane control so it will be drawn
and will behave as a scrolling text edit field inside of a window.
This routine performs all of the initialization steps necessary,
should refer to a user pane control that you have either created
yourself or extracted from a dialog's control heirarchy using
the GetDialogItemAsControl routine. */
-OSStatus mUPOpenControl(ControlHandle theControl, bool multiline);
+OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle);
/* Utility Routines */
/* flags */
Boolean fInFocus; /* true while the focus rect is drawn around the control */
Boolean fIsActive; /* true while the control is drawn in the active state */
- Boolean fTEActive; /* reflects the activation state of the text edit record */
- Boolean fInDialogWindow; /* true if displayed in a dialog window */
+ Boolean fTEActive; /* reflects the activation state of the text edit record */
+ Boolean fInDialogWindow; /* true if displayed in a dialog window */
/* calculated locations */
Rect fRTextArea; /* area where the text is drawn */
Rect fRFocusOutline; /* rectangle used to draw the focus box */
STPTextPaneVars *varsp;
varsp = *tpvars;
if (varsp->fTEActive != setActive) {
-
+
varsp->fTEActive = setActive;
-
+
TXNActivate(varsp->fTXNRec, varsp->fTXNFrame, varsp->fTEActive);
if (varsp->fInFocus)
char state;
Rect bounds;
/* set up our globals */
-
+
tpvars = (STPTextPaneVars **) GetControlReference(theControl);
if (tpvars != NULL) {
state = HGetState((Handle) tpvars);
HLock((Handle) tpvars);
varsp = *tpvars;
-
+
/* save the drawing state */
SetPort((**tpvars).fDrawingEnvironment);
- /* verify our boundary */
+ /* verify our boundary */
GetControlBounds(theControl, &bounds);
+
+ wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
if ( ! EqualRect(&bounds, &varsp->fRFocusOutline) ) {
// scrollbar is on the border, we add one
Rect oldbounds = varsp->fRFocusOutline ;
InsetRect( &oldbounds , -1 , -1 ) ;
-
+
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) ,
+ SetRect(&varsp->fRTextArea, bounds.left + 2 , bounds.top + (varsp->fMultiline ? 0 : 2) ,
bounds.right - (varsp->fMultiline ? 0 : 2), bounds.bottom - (varsp->fMultiline ? 0 : 2));
RectRgn(varsp->fTextBackgroundRgn, &varsp->fRTextOutline);
- TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top, varsp->fRTextArea.left,
+ TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top, varsp->fRTextArea.left,
varsp->fRTextArea.bottom, varsp->fRTextArea.right, varsp->fTXNFrame);
}
if ((**tpvars).fIsActive && varsp->fInFocus) DrawThemeFocusRect(&varsp->fRFocusOutline, true);
/* release our globals */
HSetState((Handle) tpvars, state);
+
}
}
}
/* find the location for the click */
switch (TPPaneHitTestProc(theControl, startPt)) {
-
+
/* handle clicks in the text part */
case kmUPTextPart:
{ SetPort((**tpvars).fDrawingEnvironment);
+ wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
+#if !TARGET_CARBON
TXNClick( varsp->fTXNRec, (const EventRecord*) wxTheApp->MacGetCurrentEvent());
+#else
+ EventRecord rec ;
+ ConvertEventRefToEventRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ;
+ TXNClick( varsp->fTXNRec, &rec );
+#endif
}
break;
-
+
}
-
+
HSetState((Handle) tpvars, state);
}
return partCodeResult;
varsp = *tpvars;
/* get the current mouse coordinates (in our window) */
SetPortWindowPort(GetControlOwner(theControl));
+ wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
GetMouse(&mousep);
/* there's a 'focus thing' and an 'unfocused thing' */
if (varsp->fInFocus) {
RectRgn((theRgn = NewRgn()), &varsp->fRTextArea);
TXNAdjustCursor(varsp->fTXNRec, theRgn);
DisposeRgn(theRgn);
- } else SetThemeCursor(kThemeArrowCursor);
+ }
+ else
+ {
+ // SetThemeCursor(kThemeArrowCursor);
+ }
} else {
/* if it's in our bounds, set the cursor */
GetControlBounds(theControl, &bounds);
if (PtInRect(mousep, &bounds))
- SetThemeCursor(kThemeArrowCursor);
+ {
+ // SetThemeCursor(kThemeArrowCursor);
+ }
}
-
+
HSetState((Handle) tpvars, state);
}
}
if ((**tpvars).fInFocus) {
/* turn autoscrolling on and send the key event to text edit */
SetPort((**tpvars).fDrawingEnvironment);
+ wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
EventRecord ev ;
memset( &ev , 0 , sizeof( ev ) ) ;
ev.what = keyDown ;
varsp = *tpvars;
/* de/activate the text edit record */
SetPort((**tpvars).fDrawingEnvironment);
+ wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
GetControlBounds(theControl, &bounds);
varsp->fIsActive = activating;
TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus);
define your own value for handling click-to-focus type events. */
/* save the drawing state */
SetPort((**tpvars).fDrawingEnvironment);
+ wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
/* calculate the next highlight state */
switch (action) {
default:
should refer to a user pane control that you have either created
yourself or extracted from a dialog's control heirarchy using
the GetDialogItemAsControl routine. */
-OSStatus mUPOpenControl(ControlHandle theControl, bool multiline)
+OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle )
{
Rect bounds;
WindowRef theWindow;
STPTextPaneVars **tpvars, *varsp;
- OSStatus err;
+ OSStatus err = noErr ;
RGBColor rgbWhite = {0xFFFF, 0xFFFF, 0xFFFF};
TXNBackground tback;
-
+
/* set up our globals */
if (gTPDrawProc == NULL) gTPDrawProc = NewControlUserPaneDrawUPP(TPPaneDrawProc);
if (gTPHitProc == NULL) gTPHitProc = NewControlUserPaneHitTestUPP(TPPaneHitTestProc);
if (gTPKeyProc == NULL) gTPKeyProc = NewControlUserPaneKeyDownUPP(TPPaneKeyDownProc);
if (gTPActivateProc == NULL) gTPActivateProc = NewControlUserPaneActivateUPP(TPPaneActivateProc);
if (gTPFocusProc == NULL) gTPFocusProc = NewControlUserPaneFocusUPP(TPPaneFocusProc);
-
+
/* allocate our private storage */
tpvars = (STPTextPaneVars **) NewHandleClear(sizeof(STPTextPaneVars));
SetControlReference(theControl, (long) tpvars);
HLock((Handle) tpvars);
varsp = *tpvars;
/* set the initial settings for our private data */
- varsp->fMultiline = multiline ;
+ varsp->fMultiline = wxStyle & wxTE_MULTILINE ;
varsp->fInFocus = false;
varsp->fIsActive = true;
varsp->fTEActive = true; // in order to get a deactivate
GetControlBounds(theControl, &bounds);
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) ,
+ SetRect(&varsp->fRTextArea, bounds.left + 2 , bounds.top + (varsp->fMultiline ? 0 : 2) ,
bounds.right - (varsp->fMultiline ? 0 : 2), bounds.bottom - (varsp->fMultiline ? 0 : 2));
/* calculate the background region for the text. In this case, it's kindof
and irregular region because we're setting the scroll bar a little ways inside
SetPort(varsp->fDrawingEnvironment);
/* create the new edit field */
+
+ TXNFrameOptions frameOptions =
+ kTXNDontDrawCaretWhenInactiveMask ;
+ if ( ! ( wxStyle & wxTE_NOHIDESEL ) )
+ frameOptions |= kTXNDontDrawSelectionWhenInactiveMask ;
+
+ if ( wxStyle & wxTE_MULTILINE )
+ {
+ if ( ! ( wxStyle & wxTE_DONTWRAP ) )
+ frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
+ else
+ {
+ frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
+ frameOptions |= kTXNWantHScrollBarMask ;
+ }
+
+ if ( !(wxStyle & wxTE_NO_VSCROLL ) )
+ frameOptions |= kTXNWantVScrollBarMask ;
+ }
+ else
+ frameOptions |= kTXNSingleLineOnlyMask ;
+
+ if ( wxStyle & wxTE_READONLY )
+ frameOptions |= kTXNReadOnlyMask ;
+
TXNNewObject(NULL, varsp->fOwner, &varsp->fRTextArea,
- ( multiline ? kTXNWantVScrollBarMask : 0 ) |
- kTXNDontDrawCaretWhenInactiveMask |
- kTXNDontDrawSelectionWhenInactiveMask |
- kTXNAlwaysWrapAtViewEdgeMask ,
+ frameOptions ,
kTXNTextEditStyleFrameType,
kTXNTextensionFile,
- kTXNSystemDefaultEncoding,
+ kTXNSystemDefaultEncoding,
&varsp->fTXNRec, &varsp->fTXNFrame, (TXNObjectRefcon) tpvars);
Str255 fontName ;
SInt16 fontSize ;
Style fontStyle ;
-
+
GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
TXNTypeAttributes typeAttr[] =
{ kTXNQDFontStyleAttribute , kTXNQDFontStyleAttributeSize , { (void*) normal } } ,
} ;
- OSStatus status = TXNSetTypeAttributes (varsp->fTXNRec, sizeof( typeAttr ) / sizeof(TXNTypeAttributes) , typeAttr,
- kTXNStartOffset,
- kTXNEndOffset);
+ err = TXNSetTypeAttributes (varsp->fTXNRec, sizeof( typeAttr ) / sizeof(TXNTypeAttributes) , typeAttr,
+ kTXNStartOffset,
+ kTXNEndOffset);
/* set the field's background */
+
tback.bgType = kTXNBackgroundTypeRGB;
tback.bg.color = rgbWhite;
TXNSetBackground( varsp->fTXNRec, &tback);
-
+
/* unlock our storage */
HUnlock((Handle) tpvars);
/* perform final activations and setup for our text field. Here,
we assume that the window is going to be the 'active' window. */
TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus);
/* all done */
- return noErr;
+ return err;
}
m_macTXNvars = NULL ;
m_macUsesTXN = false ;
m_editable = true ;
+ m_maxLength = TE_UNLIMITED_LENGTH ;
}
wxTextCtrl::~wxTextCtrl()
const wxValidator& validator,
const wxString& name)
{
- m_macTE = NULL ;
- m_macTXN = NULL ;
- m_macTXNvars = NULL ;
- m_macUsesTXN = false ;
- m_editable = true ;
+ m_macTE = NULL ;
+ m_macTXN = NULL ;
+ m_macTXNvars = NULL ;
+ m_macUsesTXN = false ;
+ m_editable = true ;
+
+ m_macUsesTXN = ! (style & wxTE_PASSWORD ) ;
- m_macUsesTXN = ! (style & wxTE_PASSWORD ) ;
+ m_macUsesTXN &= (TXNInitTextension != (void*) kUnresolvedCFragSymbolAddress) ;
- m_macUsesTXN &= (TXNInitTextension != (void*) kUnresolvedCFragSymbolAddress) ;
-
// base initialization
if ( !CreateBase(parent, id, pos, size, style, validator, name) )
return FALSE;
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 ) ;
+ MacPreControlCreate( parent , id , wxEmptyString , pos , mySize ,style, validator , name , &bounds , title ) ;
if ( m_windowStyle & wxTE_MULTILINE )
{
m_windowStyle |= wxTE_PROCESS_ENTER;
}
+ if ( m_windowStyle & wxTE_READONLY)
+ {
+ m_editable = FALSE ;
+ }
if ( !m_macUsesTXN )
{
- m_macControl = ::NewControl( MAC_WXHWND(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 ) ;
+ ::GetControlData((ControlHandle) m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*)((TEHandle *)&m_macTE) , &size ) ;
}
else
{
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() ;
- }
+ mUPOpenControl((ControlHandle) m_macControl, m_windowStyle );
}
MacPostControlCreate() ;
- wxString value ;
-
- if( wxApp::s_macDefaultEncodingIsPC )
- value = wxMacMakeMacStringFromPC( st ) ;
- else
- value = st ;
-
if ( !m_macUsesTXN )
{
- ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ;
+ wxCharBuffer text = wxMacStringToCString( st ) ;
+ ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , strlen(text) , text ) ;
}
else
{
/* set up locals */
tpvars = (STPTextPaneVars **) GetControlReference((ControlHandle) m_macControl);
/* set the text in the record */
- TXNSetData( (**tpvars).fTXNRec, kTXNTextData, (void*)value.c_str(), value.Length(),
- kTXNStartOffset, kTXNEndOffset);
m_macTXN = (**tpvars).fTXNRec ;
+#if wxUSE_UNICODE
+ TXNSetData( ((TXNObject) m_macTXN) , kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2,
+ kTXNStartOffset, kTXNEndOffset);
+#else
+ wxCharBuffer text = wxMacStringToCString( st ) ;
+ TXNSetData( ((TXNObject) m_macTXN) , kTXNTextData, (void*)text.data(), strlen( text ) ,
+ kTXNStartOffset, kTXNEndOffset);
+#endif
m_macTXNvars = tpvars ;
m_macUsesTXN = true ;
+ TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
+ TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
}
-
- return TRUE;
+
+ return TRUE;
}
wxString wxTextCtrl::GetValue() const
{
- Size actualsize;
-
+ Size actualSize = 0;
+ wxString result ;
+ OSStatus err ;
if ( !m_macUsesTXN )
{
- ::GetControlData( (ControlHandle) m_macControl, 0,
- ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag,
- 32767 , wxBuffer , &actualsize ) ;
+ err = ::GetControlDataSize((ControlHandle) m_macControl, 0,
+ ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, &actualSize ) ;
+
+ if ( err )
+ return wxEmptyString ;
+
+ if ( actualSize > 0 )
+ {
+ wxCharBuffer buf(actualSize) ;
+ ::GetControlData( (ControlHandle) m_macControl, 0,
+ ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag,
+ actualSize , buf.data() , &actualSize ) ;
+ result = wxMacMakeStringFromCString( buf ) ;
+ }
}
else
{
+#if wxUSE_UNICODE
Handle theText ;
- OSStatus err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
+ err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNUnicodeTextData );
// all done
if ( err )
{
- actualsize = 0 ;
+ actualSize = 0 ;
}
else
{
- actualsize = GetHandleSize( theText ) ;
- if (actualsize != 0)
- strncpy( wxBuffer , *theText , actualsize ) ;
+ actualSize = GetHandleSize( theText ) ;
+ if ( actualSize > 0 )
+ {
+ wxChar *ptr = result.GetWriteBuf(actualSize*sizeof(wxChar)) ;
+ wxStrncpy( ptr , (wxChar*) *theText , actualSize ) ;
+ ptr[actualSize] = 0 ;
+ result.UngetWriteBuf( actualSize ) ;
+ }
+ DisposeHandle( theText ) ;
+ }
+#else
+ Handle theText ;
+ err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
+ // all done
+ if ( err )
+ {
+ actualSize = 0 ;
+ }
+ else
+ {
+ actualSize = GetHandleSize( theText ) ;
+ if ( actualSize > 0 )
+ {
+ HLock( theText ) ;
+ result = wxMacMakeStringFromCString( *theText , actualSize ) ;
+ HUnlock( theText ) ;
+ }
DisposeHandle( theText ) ;
}
+#endif
}
-
- wxBuffer[actualsize] = 0 ;
-
- wxString value;
- if( wxApp::s_macDefaultEncodingIsPC )
- value = wxMacMakePCStringFromMac( wxBuffer ) ;
- else
- value = wxBuffer;
-
- value.Replace( "\r", "\n" );
-
- return value;
+ return result ;
}
void wxTextCtrl::GetSelection(long* from, long* to) const
void wxTextCtrl::SetValue(const wxString& st)
{
- wxString value;
-
- if( wxApp::s_macDefaultEncodingIsPC )
- value = wxMacMakeMacStringFromPC( st ) ;
- else
- value = st;
-
- value.Replace( "\n", "\r" );
-
if ( !m_macUsesTXN )
{
- ::SetControlData((ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ;
+ wxCharBuffer text = wxMacStringToCString( st ) ;
+ ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , strlen(text) , text ) ;
}
else
{
- TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(),
- kTXNStartOffset, kTXNEndOffset);
+ bool formerEditable = m_editable ;
+ if ( !formerEditable )
+ SetEditable(true) ;
+#if wxUSE_UNICODE
+ TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2 ,
+ kTXNStartOffset, kTXNEndOffset);
+#else
+ wxCharBuffer text = wxMacStringToCString( st ) ;
+ TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)text.data(), strlen( text ) ,
+ kTXNStartOffset, kTXNEndOffset);
+#endif
+ TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
+ TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
+ if ( !formerEditable )
+ SetEditable(formerEditable) ;
}
-
MacRedrawControl() ;
}
+void wxTextCtrl::SetMaxLength(unsigned long len)
+{
+ m_maxLength = len ;
+}
+
+bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
+{
+ if ( m_macUsesTXN )
+ {
+ bool formerEditable = m_editable ;
+ if ( !formerEditable )
+ SetEditable(true) ;
+ TXNTypeAttributes typeAttr[4] ;
+ Str255 fontName = "\pMonaco" ;
+ SInt16 fontSize = 12 ;
+ Style fontStyle = normal ;
+ RGBColor color ;
+ int attrCounter = 0 ;
+ if ( style.HasFont() )
+ {
+ const wxFont &font = style.GetFont() ;
+ wxMacStringToPascal( font.GetFaceName() , fontName ) ;
+ fontSize = font.GetPointSize() ;
+ if ( font.GetUnderlined() )
+ fontStyle |= underline ;
+ if ( font.GetWeight() == wxBOLD )
+ fontStyle |= bold ;
+ if ( font.GetStyle() == wxITALIC )
+ fontStyle |= italic ;
+
+ typeAttr[attrCounter].tag = kTXNQDFontNameAttribute ;
+ typeAttr[attrCounter].size = kTXNQDFontNameAttributeSize ;
+ typeAttr[attrCounter].data.dataPtr = (void*) fontName ;
+ typeAttr[attrCounter+1].tag = kTXNQDFontSizeAttribute ;
+ typeAttr[attrCounter+1].size = kTXNFontSizeAttributeSize ;
+ typeAttr[attrCounter+1].data.dataValue = (fontSize << 16) ;
+ typeAttr[attrCounter+2].tag = kTXNQDFontStyleAttribute ;
+ typeAttr[attrCounter+2].size = kTXNQDFontStyleAttributeSize ;
+ typeAttr[attrCounter+2].data.dataValue = fontStyle ;
+ attrCounter += 3 ;
+
+ }
+ if ( style.HasTextColour() )
+ {
+ typeAttr[attrCounter].tag = kTXNQDFontColorAttribute ;
+ typeAttr[attrCounter].size = kTXNQDFontColorAttributeSize ;
+ typeAttr[attrCounter].data.dataPtr = (void*) &color ;
+ color = MAC_WXCOLORREF(style.GetTextColour().GetPixel()) ;
+ attrCounter += 1 ;
+ }
+
+ if ( attrCounter > 0 )
+ {
+#ifdef __WXDEBUG__
+ OSStatus status =
+#endif // __WXDEBUG__
+ TXNSetTypeAttributes ((TXNObject)m_macTXN, attrCounter , typeAttr, start,end);
+ wxASSERT_MSG( status == noErr , wxT("Couldn't set text attributes") ) ;
+ }
+ if ( !formerEditable )
+ SetEditable(formerEditable) ;
+ }
+ return TRUE ;
+}
+
+bool wxTextCtrl::SetDefaultStyle(const wxTextAttr& style)
+{
+ wxTextCtrlBase::SetDefaultStyle( style ) ;
+ SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ;
+ return TRUE ;
+}
+
// Clipboard operations
void wxTextCtrl::Copy()
{
else
{
ClearCurrentScrap();
- TXNCopy((TXNObject)m_macTXN);
+ TXNCopy((TXNObject)m_macTXN);
TXNConvertToPublicScrap();
}
}
else
{
ClearCurrentScrap();
- TXNCut((TXNObject)m_macTXN);
+ TXNCut((TXNObject)m_macTXN);
TXNConvertToPublicScrap();
}
wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
else
{
TXNConvertFromPublicScrap();
- TXNPaste((TXNObject)m_macTXN);
+ TXNPaste((TXNObject)m_macTXN);
+ SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ;
}
wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
event.SetString( GetValue() ) ;
if (!IsEditable())
return FALSE;
- long offset ;
#if TARGET_CARBON
OSStatus err = noErr;
ScrapRef scrapRef;
-
+
err = GetCurrentScrap( &scrapRef );
- if ( err != noTypeErr && err != memFullErr )
+ if ( err != noTypeErr && err != memFullErr )
{
ScrapFlavorFlags flavorFlags;
Size byteCount;
-
+
if (( err = GetScrapFlavorFlags( scrapRef, 'TEXT', &flavorFlags )) == noErr)
{
if (( err = GetScrapFlavorSize( scrapRef, 'TEXT', &byteCount )) == noErr)
}
}
return FALSE;
-
+
#else
+ long offset ;
if ( GetScrap( NULL , 'TEXT' , &offset ) > 0 )
{
return TRUE ;
if ( editable != m_editable )
{
m_editable = editable ;
- if ( editable )
- UMAActivateControl( (ControlHandle) m_macControl ) ;
+ if ( !m_macUsesTXN )
+ {
+ if ( editable )
+ UMAActivateControl( (ControlHandle) m_macControl ) ;
+ else
+ UMADeactivateControl((ControlHandle) m_macControl ) ;
+ }
else
- UMADeactivateControl((ControlHandle) m_macControl ) ;
+ {
+ TXNControlTag tag[] = { kTXNIOPrivilegesTag } ;
+ TXNControlData data[] = { { editable ? kTXNReadWrite : kTXNReadOnly } } ;
+ TXNSetTXNObjectControls( (TXNObject) m_macTXN , false , sizeof(tag) / sizeof (TXNControlTag) , tag , data ) ;
+ }
}
}
long wxTextCtrl::GetInsertionPoint() const
{
- long begin,end ;
- GetSelection( &begin , &end ) ;
- return begin ;
+ long begin,end ;
+ GetSelection( &begin , &end ) ;
+ return begin ;
}
long wxTextCtrl::GetLastPosition() const
{
if ( !m_macUsesTXN )
- {
- return (**((TEHandle) m_macTE)).teLength ;
- }
- else
- {
- Handle theText ;
- long actualsize ;
- OSErr err = TXNGetDataEncoded( (TXNObject) m_macTXN, kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
- /* all done */
- if ( err )
{
- actualsize = 0 ;
+ return (**((TEHandle) m_macTE)).teLength ;
}
else
{
- actualsize = GetHandleSize( theText ) ;
- DisposeHandle( theText ) ;
+ Handle theText ;
+ long actualsize ;
+ OSErr err = TXNGetDataEncoded( (TXNObject) m_macTXN, kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
+ /* all done */
+ if ( err )
+ {
+ actualsize = 0 ;
+ }
+ else
+ {
+ actualsize = GetHandleSize( theText ) ;
+ DisposeHandle( theText ) ;
+ }
+ return actualsize ;
}
- return actualsize ;
- }
}
void wxTextCtrl::Replace(long from, long to, const wxString& value)
{
- if ( !m_macUsesTXN )
- {
+ if ( !m_macUsesTXN )
+ {
ControlEditTextSelectionRec selection ;
-
+
selection.selStart = from ;
selection.selEnd = to ;
::SetControlData((ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
}
else
{
- TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
- TXNClear( ((TXNObject) m_macTXN) ) ;
- TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(),
- kTXNUseCurrentSelection, kTXNUseCurrentSelection);
+ bool formerEditable = m_editable ;
+ if ( !formerEditable )
+ SetEditable(true) ;
+ TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
+ TXNClear( ((TXNObject) m_macTXN) ) ;
+#if wxUSE_UNICODE
+ TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData, (void*)value.wc_str(), value.Length() * 2 ,
+ kTXNUseCurrentSelection, kTXNUseCurrentSelection);
+#else
+ TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(),
+ kTXNUseCurrentSelection, kTXNUseCurrentSelection);
+#endif
+ if ( !formerEditable )
+ SetEditable( formerEditable ) ;
}
Refresh() ;
}
void wxTextCtrl::Remove(long from, long to)
{
- if ( !m_macUsesTXN )
- {
- ControlEditTextSelectionRec selection ;
-
- selection.selStart = from ;
- selection.selEnd = to ;
- ::SetControlData( (ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
- TEDelete( ((TEHandle) m_macTE) ) ;
- }
- else
- {
- TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
- TXNClear( ((TXNObject) m_macTXN) ) ;
- }
+ if ( !m_macUsesTXN )
+ {
+ ControlEditTextSelectionRec selection ;
+
+ selection.selStart = from ;
+ selection.selEnd = to ;
+ ::SetControlData( (ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+ TEDelete( ((TEHandle) m_macTE) ) ;
+ }
+ else
+ {
+ bool formerEditable = m_editable ;
+ if ( !formerEditable )
+ SetEditable(true) ;
+ TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
+ TXNClear( ((TXNObject) m_macTXN) ) ;
+ if ( !formerEditable )
+ SetEditable( formerEditable ) ;
+ }
Refresh() ;
}
void wxTextCtrl::SetSelection(long from, long to)
{
+ if ( from == -1 )
+ from = 0;
- if ( !m_macUsesTXN )
- {
- ControlEditTextSelectionRec selection ;
- selection.selStart = from ;
- selection.selEnd = to ;
-
- TESetSelect( selection.selStart , selection.selEnd , ((TEHandle) m_macTE) ) ;
- ::SetControlData((ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
- }
- else
- {
- STPTextPaneVars **tpvars;
+ if ( to == -1 )
+ to = GetLastPosition();
+
+ if ( !m_macUsesTXN )
+ {
+ ControlEditTextSelectionRec selection ;
+ selection.selStart = from ;
+ selection.selEnd = to ;
+
+ TESetSelect( selection.selStart , selection.selEnd , ((TEHandle) m_macTE) ) ;
+ ::SetControlData((ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+ }
+ else
+ {
+ STPTextPaneVars **tpvars;
/* set up our locals */
- tpvars = (STPTextPaneVars **) GetControlReference((ControlHandle) m_macControl);
+ tpvars = (STPTextPaneVars **) GetControlReference((ControlHandle) m_macControl);
/* and our drawing environment as the operation
may force a redraw in the text area. */
- SetPort((**tpvars).fDrawingEnvironment);
+ SetPort((**tpvars).fDrawingEnvironment);
/* change the selection */
- TXNSetSelection( (**tpvars).fTXNRec, from, to);
- }
+ TXNSetSelection( (**tpvars).fTXNRec, from, to);
+ TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
+ }
}
bool wxTextCtrl::LoadFile(const wxString& file)
return FALSE;
}
-void wxTextCtrl::WriteText(const wxString& text)
+void wxTextCtrl::WriteText(const wxString& st)
{
- wxString value ;
- if( wxApp::s_macDefaultEncodingIsPC )
- value = wxMacMakeMacStringFromPC( text ) ;
- else
- value = text ;
if ( !m_macUsesTXN )
{
- TEInsert( value , value.Length() , ((TEHandle) m_macTE) ) ;
+ wxCharBuffer text = wxMacStringToCString( st ) ;
+ TEInsert( text , strlen(text) , ((TEHandle) m_macTE) ) ;
}
else
{
- TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*) (const char*)value, value.Length(),
+ bool formerEditable = m_editable ;
+ if ( !formerEditable )
+ SetEditable(true) ;
+ long start , end , dummy ;
+ GetSelection( &start , &dummy ) ;
+#if wxUSE_UNICODE
+ TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2 ,
kTXNUseCurrentSelection, kTXNUseCurrentSelection);
+#else
+ wxCharBuffer text = wxMacStringToCString( st ) ;
+ TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)text.data(), strlen( text ) ,
+ kTXNUseCurrentSelection, kTXNUseCurrentSelection);
+#endif
+ GetSelection( &dummy , &end ) ;
+ SetStyle( start , end , GetDefaultStyle() ) ;
+ if ( !formerEditable )
+ SetEditable( formerEditable ) ;
}
MacRedrawControl() ;
}
{
return ;
}
- if ( !m_macUsesTXN )
- {
- ::SetControlData((ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , 0 , (char*) ((const char*)NULL) ) ;
- }
- else
- {
- ClearCurrentScrap();
- TXNClear((TXNObject)m_macTXN);
- }
+ if ( !m_macUsesTXN )
+ {
+ ::SetControlData((ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , 0 , (char*) ((const char*)NULL) ) ;
+ }
+ else
+ {
+ TXNSetSelection( (TXNObject)m_macTXN , kTXNStartOffset , kTXNEndOffset ) ;
+ TXNClear((TXNObject)m_macTXN);
+ }
Refresh() ;
}
wxSize wxTextCtrl::DoGetBestSize() const
{
int wText = 100 ;
-
+
int hText;
if ( m_macUsesTXN )
{
{
if (CanUndo())
{
+ if ( m_macUsesTXN )
+ {
+ TXNUndo((TXNObject)m_macTXN);
+ }
}
}
{
if (CanRedo())
{
+ if ( m_macUsesTXN )
+ {
+ TXNRedo((TXNObject)m_macTXN);
+ }
}
}
bool wxTextCtrl::CanUndo() const
{
+ if ( !IsEditable() )
+ {
+ return false ;
+ }
+ if ( m_macUsesTXN )
+ {
+ return TXNCanUndo((TXNObject)m_macTXN,NULL);
+ }
return FALSE ;
}
bool wxTextCtrl::CanRedo() const
{
+ if ( !IsEditable() )
+ {
+ return false ;
+ }
+ if ( m_macUsesTXN )
+ {
+ return TXNCanRedo((TXNObject)m_macTXN,NULL);
+ }
return FALSE ;
}
int wxTextCtrl::GetNumberOfLines() const
{
- // TODO change this if possible to reflect real lines
- wxString content = GetValue() ;
-
+ // TODO change this if possible to reflect real lines
+ wxString content = GetValue() ;
+
int count = 1;
- for (int i = 0; i < content.Length() ; i++)
+ for (size_t i = 0; i < content.Length() ; i++)
{
if (content[i] == '\r') count++;
}
-
+
return count;
}
int wxTextCtrl::GetLineLength(long lineNo) const
{
- // TODO change this if possible to reflect real lines
- wxString content = GetValue() ;
-
+ // TODO change this if possible to reflect real lines
+ wxString content = GetValue() ;
+
// Find line first
int count = 0;
- for (int i = 0; i < content.Length() ; i++)
+ for (size_t i = 0; i < content.Length() ; i++)
{
if (count == lineNo)
{
// Count chars in line then
count = 0;
- for (int j = i; j < content.Length(); j++)
+ for (size_t j = i; j < content.Length(); j++)
{
count++;
if (content[j] == '\r') return count;
}
-
+
return count;
}
if (content[i] == '\r') count++;
wxString wxTextCtrl::GetLineText(long lineNo) const
{
- // TODO change this if possible to reflect real lines
- wxString content = GetValue() ;
+ // TODO change this if possible to reflect real lines
+ wxString content = GetValue() ;
// Find line first
int count = 0;
- for (int i = 0; i < content.Length() ; i++)
+ for (size_t i = 0; i < content.Length() ; i++)
{
if (count == lineNo)
{
// Add chars in line then
- wxString tmp("");
-
- for (int j = i; j < content.Length(); j++)
+ wxString tmp;
+
+ for (size_t j = i; j < content.Length(); j++)
{
if (content[j] == '\r')
return tmp;
-
+
tmp += content[j];
}
-
+
return tmp;
}
if (content[i] == '\r') count++;
}
- return "" ;
+ return wxEmptyString ;
}
/*
* Text item
*/
-
+
void wxTextCtrl::Command(wxCommandEvent & event)
{
SetValue (event.GetString());
{
int key = event.GetKeyCode() ;
bool eat_key = false ;
-
- if ( !IsEditable() && key != WXK_LEFT && key != WXK_RIGHT && key != WXK_DOWN && key != WXK_UP && key != WXK_TAB &&
- !( key == WXK_RETURN && ( (m_windowStyle & wxPROCESS_ENTER) || (m_windowStyle & wxTE_MULTILINE) ) )
+
+ if ( key == 'c' && event.MetaDown() )
+ {
+ if ( CanCopy() )
+ Copy() ;
+ return ;
+ }
+
+ if ( !IsEditable() && key != WXK_LEFT && key != WXK_RIGHT && key != WXK_DOWN && key != WXK_UP && key != WXK_TAB &&
+ !( key == WXK_RETURN && ( (m_windowStyle & wxPROCESS_ENTER) || (m_windowStyle & wxTE_MULTILINE) ) )
/* && key != WXK_PRIOR && key != WXK_NEXT && key != WXK_HOME && key != WXK_END */
)
{
// eat it
return ;
}
+ if ( key == 'v' && event.MetaDown() )
+ {
+ if ( CanPaste() )
+ Paste() ;
+ return ;
+ }
+ if ( key == 'x' && event.MetaDown() )
+ {
+ if ( CanCut() )
+ Cut() ;
+ return ;
+ }
switch ( key )
{
case WXK_RETURN:
event.SetString( GetValue() );
if ( GetEventHandler()->ProcessEvent(event) )
return;
- }
+ }
if ( !(m_windowStyle & wxTE_MULTILINE) )
{
wxWindow *parent = GetParent();
return ;
}
}
-
+
// this will make wxWindows eat the ENTER key so that
// we actually prevent line wrapping in a single line
// text control
}
break;
}
-
+
if (!eat_key)
{
// default handling
event.Skip() ;
}
- if ( key >= 0x20 ||
+ if ( ( key >= 0x20 && key < WXK_START ) ||
key == WXK_RETURN ||
- key == WXK_DELETE ||
+ key == WXK_DELETE ||
key == WXK_BACK)
{
wxCommandEvent event1(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
}
}
-void wxTextCtrl::MacSuperShown( bool show )
+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,
+ 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,
+ 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 wxTextCtrl::Show(bool show)
{
bool former = m_macControlIsShown ;
-
+
bool retval = wxControl::Show( show ) ;
-
- if ( former != m_macControlIsShown )
+
+ if ( former != m_macControlIsShown && m_macUsesTXN )
{
if ( m_macControlIsShown )
- TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left,
+ 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,
+ 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
// ----------------------------------------------------------------------------
-void wxTextCtrl::OnCut(wxCommandEvent& event)
+void wxTextCtrl::OnCut(wxCommandEvent& WXUNUSED(event))
{
Cut();
}
-void wxTextCtrl::OnCopy(wxCommandEvent& event)
+void wxTextCtrl::OnCopy(wxCommandEvent& WXUNUSED(event))
{
Copy();
}
-void wxTextCtrl::OnPaste(wxCommandEvent& event)
+void wxTextCtrl::OnPaste(wxCommandEvent& WXUNUSED(event))
{
Paste();
}
-void wxTextCtrl::OnUndo(wxCommandEvent& event)
+void wxTextCtrl::OnUndo(wxCommandEvent& WXUNUSED(event))
{
Undo();
}
-void wxTextCtrl::OnRedo(wxCommandEvent& event)
+void wxTextCtrl::OnRedo(wxCommandEvent& WXUNUSED(event))
{
Redo();
}
event.Enable( CanRedo() );
}
-
+bool wxTextCtrl::MacSetupCursor( const wxPoint& pt )
+{
+ if ( m_macUsesTXN )
+ return true ;
+ else
+ return wxWindow::MacSetupCursor( pt ) ;
+}
#endif
// wxUSE_TEXTCTRL