📄 textctrl.cpp
字号:
m_macUsesTXN = ! (style & wxTE_PASSWORD ) ;
m_macUsesTXN &= (TXNInitTextension != (void*) kUnresolvedCFragSymbolAddress) ;
// base initialization
if ( !wxTextCtrlBase::Create(parent, id, pos, size, style & ~(wxHSCROLL|wxVSCROLL), validator, name) )
return false;
wxSize mySize = size ;
if ( m_macUsesTXN )
{
m_macHorizontalBorder = 5 ; // additional pixels around the real control
m_macVerticalBorder = 3 ;
}
else
{
m_macHorizontalBorder = 5 ; // additional pixels around the real control
m_macVerticalBorder = 5 ;
}
Rect bounds ;
Str255 title ;
/*
if ( mySize.y == -1 )
{
mySize.y = 13 ;
if ( m_windowStyle & wxTE_MULTILINE )
mySize.y *= 5 ;
mySize.y += 2 * m_macVerticalBorder ;
}
*/
MacPreControlCreate( parent , id , wxEmptyString , pos , mySize ,style, validator , name , &bounds , title ) ;
if ( m_windowStyle & wxTE_MULTILINE )
{
wxASSERT_MSG( !(m_windowStyle & wxTE_PROCESS_ENTER),
wxT("wxTE_PROCESS_ENTER style is ignored for multiline text controls (they always process it)") );
m_windowStyle |= wxTE_PROCESS_ENTER;
}
if ( m_windowStyle & wxTE_READONLY)
{
m_editable = false ;
}
wxString st = str ;
wxMacConvertNewlines13To10( &st ) ;
if ( !m_macUsesTXN )
{
m_macControl = (WXWidget) ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , "\p" , false , 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 ) ;
}
else
{
short featurSet;
featurSet = kControlSupportsEmbedding | kControlSupportsFocus | kControlWantsIdle
| kControlWantsActivate | kControlHandlesTracking | kControlHasSpecialBackground
| kControlGetsFocusOnClick | kControlSupportsLiveFeedback;
/* create the control */
m_macControl = (WXWidget) ::NewControl(MAC_WXHWND(parent->MacGetRootWindow()), &bounds, "\p", false , featurSet, 0, featurSet, kControlUserPaneProc, 0);
/* set up the mUP specific features and data */
mUPOpenControl((ControlHandle) m_macControl, m_windowStyle );
}
MacPostControlCreate() ;
if ( !m_macUsesTXN )
{
wxCharBuffer text = st.mb_str(wxConvLocal) ;
::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , strlen(text) , text ) ;
}
else
{
STPTextPaneVars **tpvars;
/* set up locals */
tpvars = (STPTextPaneVars **) GetControlReference((ControlHandle) m_macControl);
/* set the text in the record */
m_macTXN = (**tpvars).fTXNRec ;
SetTXNData( (TXNObject) m_macTXN , st , kTXNStartOffset, kTXNEndOffset ) ;
m_macTXNvars = tpvars ;
m_macUsesTXN = true ;
TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
}
return true;
}
wxString wxTextCtrl::GetValue() const
{
Size actualSize = 0;
wxString result ;
OSStatus err ;
if ( !m_macUsesTXN )
{
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 = wxString( buf , wxConvLocal) ;
}
}
else
{
#if wxUSE_UNICODE
Handle theText ;
err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNUnicodeTextData );
// all done
if ( err )
{
actualSize = 0 ;
}
else
{
actualSize = GetHandleSize( theText ) / sizeof( UniChar) ;
if ( actualSize > 0 )
{
wxChar *ptr = result.GetWriteBuf(actualSize*sizeof(wxChar)) ;
#if SIZEOF_WCHAR_T == 2
wxStrncpy( ptr , (wxChar*) *theText , actualSize ) ;
#else
wxMBConvUTF16BE converter ;
HLock( theText ) ;
converter.MB2WC( ptr , (const char*)*theText , actualSize ) ;
HUnlock( theText ) ;
#endif
ptr[actualSize] = 0 ;
result.UngetWriteBuf( actualSize *sizeof(wxChar) ) ;
}
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 = wxString( *theText , wxConvLocal , actualSize ) ;
HUnlock( theText ) ;
}
DisposeHandle( theText ) ;
}
#endif
}
wxMacConvertNewlines10To13( &result ) ;
return result ;
}
void wxTextCtrl::GetSelection(long* from, long* to) const
{
if ( !m_macUsesTXN )
{
*from = (**((TEHandle) m_macTE)).selStart;
*to = (**((TEHandle) m_macTE)).selEnd;
}
else
{
TXNGetSelection( (TXNObject) m_macTXN , (TXNOffset*) from , (TXNOffset*) to ) ;
}
}
void wxTextCtrl::SetValue(const wxString& str)
{
wxString st = str ;
wxMacConvertNewlines13To10( &st ) ;
if ( !m_macUsesTXN )
{
wxCharBuffer text = st.mb_str(wxConvLocal) ;
::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , strlen(text) , text ) ;
}
else
{
bool formerEditable = m_editable ;
if ( !formerEditable )
SetEditable(true) ;
SetTXNData( (TXNObject) m_macTXN , st , kTXNStartOffset, kTXNEndOffset ) ;
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()
{
if (CanCopy())
{
if ( !m_macUsesTXN )
{
TECopy( ((TEHandle) m_macTE) ) ;
ClearCurrentScrap();
TEToScrap() ;
MacRedrawControl() ;
}
else
{
ClearCurrentScrap();
TXNCopy((TXNObject)m_macTXN);
TXNConvertToPublicScrap();
}
}
}
void wxTextCtrl::Cut()
{
if (CanCut())
{
if ( !m_macUsesTXN )
{
TECut( ((TEHandle) m_macTE) ) ;
ClearCurrentScrap();
TEToScrap() ;
MacRedrawControl() ;
}
else
{
ClearCurrentScrap();
TXNCut((TXNObject)m_macTXN);
TXNConvertToPublicScrap();
}
wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
event.SetEventObject( this );
GetEventHandler()->ProcessEvent(event);
}
}
void wxTextCtrl::Paste()
{
if (CanPaste())
{
if ( !m_macUsesTXN )
{
TEFromScrap() ;
TEPaste( (TEHandle) m_macTE ) ;
MacRedrawControl() ;
}
else
{
TXNConvertFromPublicScrap();
TXNPaste((TXNObject)m_macTXN);
SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ;
}
wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
event.SetEventObject( this );
GetEventHandler()->ProcessEvent(event);
}
}
bool wxTextCtrl::CanCopy() const
{
// Can copy if there's a selection
long from, to;
GetSelection(& from, & to);
return (from != to);
}
bool wxTextCtrl::CanCut() const
{
if ( !IsEditable() )
{
return false ;
}
// Can cut if there's a selection
long from, to;
GetSelection(& from, & to);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -