📄 textctrl.cpp
字号:
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 unmodifiedvoid wxTextCtrl::MarkDirty(){ m_dirty = true;}void wxTextCtrl::DiscardEdits(){ m_dirty = false;}int wxTextCtrl::GetNumberOfLines() const{ if ( m_macUsesTXN ) { ItemCount lines ; TXNGetLineCount((TXNObject)m_macTXN, &lines ) ; return lines ; } else { wxString content = GetValue() ; int count = 1; for (size_t i = 0; i < content.length() ; i++) { if (content[i] == '\r') count++; } return count; }}long wxTextCtrl::XYToPosition(long x, long y) const{ // TODO return 0;}bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const{ return false ;}void wxTextCtrl::ShowPosition(long pos){#if TARGET_RT_MAC_MACHO && defined(AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER) if ( m_macUsesTXN ) { Point current ; Point desired ; TXNOffset selstart , selend ; TXNGetSelection( (TXNObject) m_macTXN , &selstart , &selend) ; TXNOffsetToPoint( (TXNObject) m_macTXN, selstart , ¤t); TXNOffsetToPoint( (TXNObject) m_macTXN, pos , &desired); //TODO use HIPoints for 10.3 and above if ( (UInt32) TXNScroll != (UInt32) kUnresolvedCFragSymbolAddress ) { OSErr theErr = noErr; SInt32 dv = desired.v - current.v ; SInt32 dh = desired.h - current.h ; TXNShowSelection( (TXNObject) m_macTXN , true ) ; theErr = TXNScroll( (TXNObject) m_macTXN, kTXNScrollUnitsInPixels , kTXNScrollUnitsInPixels , &dv , &dh ); wxASSERT_MSG( theErr == noErr, _T("TXNScroll returned an error!") ); } }#endif}int wxTextCtrl::GetLineLength(long lineNo) const{ // TODO change this if possible to reflect real lines wxString content = GetValue() ; // Find line first int count = 0; for (size_t i = 0; i < content.length() ; i++) { if (count == lineNo) { // Count chars in line then count = 0; for (size_t j = i; j < content.length(); j++) { count++; if (content[j] == '\n') return count; } return count; } if (content[i] == '\n') count++; } return 0;}wxString wxTextCtrl::GetLineText(long lineNo) const{ // TODO change this if possible to reflect real lines wxString content = GetValue() ; // Find line first int count = 0; for (size_t i = 0; i < content.length() ; i++) { if (count == lineNo) { // Add chars in line then wxString tmp; for (size_t j = i; j < content.length(); j++) { if (content[j] == '\n') return tmp; tmp += content[j]; } return tmp; } if (content[i] == '\n') count++; } return wxEmptyString ;}/* * Text item */void wxTextCtrl::Command(wxCommandEvent & event){ SetValue (event.GetString()); ProcessCommand (event);}void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event){ // By default, load the first file into the text window. if (event.GetNumberOfFiles() > 0) { LoadFile(event.GetFiles()[0]); }}void wxTextCtrl::OnChar(wxKeyEvent& event){ int key = event.GetKeyCode() ; bool eat_key = false ; 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 & wxTE_PROCESS_ENTER) || (m_windowStyle & wxTE_MULTILINE) ) )/* && key != WXK_PAGEUP && key != WXK_PAGEDOWN && key != WXK_HOME && key != WXK_END */ ) { // eat it return ; } // assume that any key not processed yet is going to modify the control m_dirty = true; if ( key == 'v' && event.MetaDown() ) { if ( CanPaste() ) Paste() ; return ; } if ( key == 'x' && event.MetaDown() ) { if ( CanCut() ) Cut() ; return ; } switch ( key ) { case WXK_RETURN: if (m_windowStyle & wxTE_PROCESS_ENTER) { wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId); event.SetEventObject( this ); event.SetString( GetValue() ); if ( GetEventHandler()->ProcessEvent(event) ) return; } if ( !(m_windowStyle & wxTE_MULTILINE) ) { wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow); if ( tlw && tlw->GetDefaultItem() ) { wxButton *def = wxDynamicCast(tlw->GetDefaultItem(), wxButton); if ( def && def->IsEnabled() ) { wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, def->GetId() ); event.SetEventObject(def); def->Command(event); return ; } } // this will make wxWidgets eat the ENTER key so that // we actually prevent line wrapping in a single line // text control eat_key = true; } break; case WXK_TAB: if ( !(m_windowStyle & wxTE_PROCESS_TAB)) { int flags = 0; if (!event.ShiftDown()) flags |= wxNavigationKeyEvent::IsForward ; if (event.ControlDown()) flags |= wxNavigationKeyEvent::WinChange ; Navigate(flags); return; } else { // This is necessary (don't know why) or the tab will not // be inserted. WriteText(wxT("\t")); } break; } if (!eat_key) { // perform keystroke handling#if TARGET_CARBON if ( m_macUsesTXN && wxTheApp->MacGetCurrentEvent() != NULL && wxTheApp->MacGetCurrentEventHandlerCallRef() != NULL ) CallNextEventHandler((EventHandlerCallRef)wxTheApp->MacGetCurrentEventHandlerCallRef() , (EventRef) wxTheApp->MacGetCurrentEvent() ) ; else { EventRecord rec ; if ( wxMacConvertEventToRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ) { EventRecord *ev = &rec ; short keycode ; short keychar ; keychar = short(ev->message & charCodeMask); keycode = short(ev->message & keyCodeMask) >> 8 ; ::HandleControlKey( (ControlHandle) m_macControl , keycode , keychar , ev->modifiers ) ; } }#else EventRecord *ev = (EventRecord*) wxTheApp->MacGetCurrentEvent() ; short keycode ; short keychar ; keychar = short(ev->message & charCodeMask); keycode = short(ev->message & keyCodeMask) >> 8 ; ::HandleControlKey( (ControlHandle) m_macControl , keycode , keychar , ev->modifiers ) ;#endif } if ( ( key >= 0x20 && key < WXK_START ) || key == WXK_RETURN || key == WXK_DELETE || key == WXK_BACK) { wxCommandEvent event1(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); event1.SetEventObject( this ); wxPostEvent(GetEventHandler(),event1); }}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 && 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); } return retval ;}// ----------------------------------------------------------------------------// standard handlers for standard edit menu events// ----------------------------------------------------------------------------void wxTextCtrl::OnCut(wxCommandEvent& WXUNUSED(event)){ Cut();}void wxTextCtrl::OnCopy(wxCommandEvent& WXUNUSED(event)){ Copy();}void wxTextCtrl::OnPaste(wxCommandEvent& WXUNUSED(event)){ Paste();}void wxTextCtrl::OnUndo(wxCommandEvent& WXUNUSED(event)){ Undo();}void wxTextCtrl::OnRedo(wxCommandEvent& WXUNUSED(event)){ Redo();}void wxTextCtrl::OnUpdateCut(wxUpdateUIEvent& event){ event.Enable( CanCut() );}void wxTextCtrl::OnUpdateCopy(wxUpdateUIEvent& event){ event.Enable( CanCopy() );}void wxTextCtrl::OnUpdatePaste(wxUpdateUIEvent& event){ event.Enable( CanPaste() );}void wxTextCtrl::OnUpdateUndo(wxUpdateUIEvent& event){ event.Enable( CanUndo() );}void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event){ event.Enable( CanRedo() );}bool wxTextCtrl::MacSetupCursor( const wxPoint& pt ){ if ( m_macUsesTXN ) return true ; else return wxWindow::MacSetupCursor( pt ) ;}#endif // wxUSE_TEXTCTRL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -