📄 textctrl.cpp
字号:
return (from != to);
}
bool wxTextCtrl::CanPaste() const
{
if (!IsEditable())
return false;
#if TARGET_CARBON
OSStatus err = noErr;
ScrapRef scrapRef;
err = GetCurrentScrap( &scrapRef );
if ( err != noTypeErr && err != memFullErr )
{
ScrapFlavorFlags flavorFlags;
Size byteCount;
if (( err = GetScrapFlavorFlags( scrapRef, 'TEXT', &flavorFlags )) == noErr)
{
if (( err = GetScrapFlavorSize( scrapRef, 'TEXT', &byteCount )) == noErr)
{
return true ;
}
}
}
return false;
#else
long offset ;
if ( GetScrap( NULL , 'TEXT' , &offset ) > 0 )
{
return true ;
}
#endif
return false ;
}
void wxTextCtrl::SetEditable(bool editable)
{
if ( editable != m_editable )
{
m_editable = editable ;
if ( !m_macUsesTXN )
{
if ( editable )
UMAActivateControl( (ControlHandle) m_macControl ) ;
else
UMADeactivateControl((ControlHandle) m_macControl ) ;
}
else
{
TXNControlTag tag[] = { kTXNIOPrivilegesTag } ;
TXNControlData data[] = { { editable ? kTXNReadWrite : kTXNReadOnly } } ;
TXNSetTXNObjectControls( (TXNObject) m_macTXN , false , sizeof(tag) / sizeof (TXNControlTag) , tag , data ) ;
}
}
}
void wxTextCtrl::SetInsertionPoint(long pos)
{
SetSelection( pos , pos ) ;
}
void wxTextCtrl::SetInsertionPointEnd()
{
wxTextPos pos = GetLastPosition();
SetInsertionPoint(pos);
}
long wxTextCtrl::GetInsertionPoint() const
{
long begin,end ;
GetSelection( &begin , &end ) ;
return begin ;
}
wxTextPos 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 ;
}
else
{
actualsize = GetHandleSize( theText ) ;
DisposeHandle( theText ) ;
}
return actualsize ;
}
}
void wxTextCtrl::Replace(long from, long to, const wxString& str)
{
wxString value = str ;
wxMacConvertNewlines13To10( &value ) ;
if ( !m_macUsesTXN )
{
ControlEditTextSelectionRec selection ;
selection.selStart = from ;
selection.selEnd = to ;
::SetControlData((ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
TESetSelect( from , to , ((TEHandle) m_macTE) ) ;
TEDelete( ((TEHandle) m_macTE) ) ;
TEInsert( value , value.length() , ((TEHandle) m_macTE) ) ;
}
else
{
bool formerEditable = m_editable ;
if ( !formerEditable )
SetEditable(true) ;
TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
TXNClear( ((TXNObject) m_macTXN) ) ;
SetTXNData( (TXNObject) m_macTXN , str , kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ;
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
{
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 ( !m_macUsesTXN )
{
ControlEditTextSelectionRec selection ;
if ((from == -1) && (to == -1))
{
selection.selStart = 0 ;
selection.selEnd = 32767 ;
}
else
{
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);
/* and our drawing environment as the operation
may force a redraw in the text area. */
SetPort((**tpvars).fDrawingEnvironment);
/* change the selection */
if ((from == -1) && (to == -1))
TXNSelectAll((TXNObject) m_macTXN);
else
TXNSetSelection( (**tpvars).fTXNRec, from, to);
TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
}
}
bool wxTextCtrl::LoadFile(const wxString& file)
{
if ( wxTextCtrlBase::LoadFile(file) )
{
return true;
}
return false;
}
void wxTextCtrl::WriteText(const wxString& str)
{
wxString st = str ;
wxMacConvertNewlines13To10( &st ) ;
if ( !m_macUsesTXN )
{
wxCharBuffer text = st.mb_str(wxConvLocal) ;
TEInsert( text , strlen(text) , ((TEHandle) m_macTE) ) ;
}
else
{
bool formerEditable = m_editable ;
if ( !formerEditable )
SetEditable(true) ;
long start , end , dummy ;
GetSelection( &start , &dummy ) ;
SetTXNData( (TXNObject) m_macTXN , st , kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ;
GetSelection( &dummy , &end ) ;
SetStyle( start , end , GetDefaultStyle() ) ;
if ( !formerEditable )
SetEditable( formerEditable ) ;
}
MacRedrawControl() ;
}
void wxTextCtrl::AppendText(const wxString& text)
{
SetInsertionPointEnd();
WriteText(text);
}
void wxTextCtrl::Clear()
{
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() ;
}
bool wxTextCtrl::IsModified() const
{
return m_dirty;
}
bool wxTextCtrl::IsEditable() const
{
return IsEnabled() && m_editable ;
}
bool wxTextCtrl::AcceptsFocus() const
{
// we don't want focus if we can't be edited
return /*IsEditable() && */ wxControl::AcceptsFocus();
}
wxSize wxTextCtrl::DoGetBestSize() const
{
int wText = 100 ;
int hText;
if ( m_macUsesTXN )
{
hText = 17 ;
}
else
{
hText = 13 ;
}
/*
int cx, cy;
wxGetCharSize(GetHWND(), &cx, &cy, &GetFont());
int wText = DEFAULT_ITEM_WIDTH;
int hText = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy);
return wxSize(wText, hText);
*/
if ( m_windowStyle & wxTE_MULTILINE )
{
hText *= 5 ;
}
hText += 2 * m_macVerticalBorder ;
wText += 2 * m_macHorizontalBorder ;
//else: for single line control everything is ok
return wxSize(wText, hText);
}
// ----------------------------------------------------------------------------
// Undo/redo
// ----------------------------------------------------------------------------
void wxTextCtrl::Undo()
{
if (CanUndo())
{
if ( m_macUsesTXN )
{
TXNUndo((TXNObject)m_macTXN);
}
}
}
void wxTextCtrl::Redo()
{
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 ;
}
// Makes modifie or unmodified
void wxTextCtrl::MarkDirty()
{
m_dirty = true;
}
void wxTextCtrl::DiscardEdits()
{
m_dirty = false;
}
int wxTextCtrl::GetNumberOfLines() const
{
if ( m_macUsesTXN )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -