📄 textctrl.cpp
字号:
/////////////////////////////////////////////////////////////////////////////// Name: src/mac/carbon/textctrl.cpp// Purpose: wxTextCtrl// Author: Stefan Csomor// Modified by: Ryan Norton (MLTE GetLineLength and GetLineText)// Created: 1998-01-01// RCS-ID: $Id: textctrl.cpp,v 1.208.2.1 2006/12/11 16:36:14 RD Exp $// Copyright: (c) Stefan Csomor// Licence: wxWindows licence/////////////////////////////////////////////////////////////////////////////#include "wx/wxprec.h"#if wxUSE_TEXTCTRL#include "wx/textctrl.h"#ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/app.h" #include "wx/utils.h" #include "wx/dc.h" #include "wx/button.h" #include "wx/menu.h" #include "wx/settings.h" #include "wx/msgdlg.h" #include "wx/toplevel.h"#endif#ifdef __DARWIN__ #include <sys/types.h> #include <sys/stat.h>#else #include <stat.h>#endif#if wxUSE_STD_IOSTREAM #if wxUSE_IOSTREAMH #include <fstream.h> #else #include <fstream> #endif#endif#include "wx/filefn.h"#include "wx/sysopt.h"#if defined(__BORLANDC__) && !defined(__WIN32__) #include <alloc.h>#elif !defined(__MWERKS__) && !defined(__GNUWIN32) && !defined(__DARWIN__) #include <malloc.h>#endif#ifndef __DARWIN__#include <Scrap.h>#endif#ifndef __DARWIN__#include <MacTextEditor.h>#include <ATSUnicode.h>#include <TextCommon.h>#include <TextEncodingConverter.h>#endif#include "wx/mac/uma.h"#ifndef __WXMAC_OSX__enum{ kTXNVisibilityTag = 'visb' // set the visibility state of the object};#endifclass wxMacFunctor{public : wxMacFunctor() {} virtual ~wxMacFunctor() {} virtual void* operator()() = 0 ; static void* CallBackProc( void *param ) { wxMacFunctor* f = (wxMacFunctor*) param ; void *result = (*f)() ; return result ; }} ;template<typename classtype, typename param1type>class wxMacObjectFunctor1 : public wxMacFunctor{ typedef void (classtype::*function)( param1type p1 ) ; typedef void (classtype::*ref_function)( const param1type& p1 ) ;public : wxMacObjectFunctor1( classtype *obj , function f , param1type p1 ) : wxMacFunctor() { m_object = obj ; m_function = f ; m_param1 = p1 ; } wxMacObjectFunctor1( classtype *obj , ref_function f , param1type p1 ) : wxMacFunctor() { m_object = obj ; m_refFunction = f ; m_param1 = p1 ; } virtual ~wxMacObjectFunctor1() {} virtual void* operator()() { (m_object->*m_function)( m_param1 ) ; return NULL ; }private : classtype* m_object ; param1type m_param1 ; union { function m_function ; ref_function m_refFunction ; } ;} ;template<typename classtype, typename param1type>void* wxMacMPRemoteCall( classtype *object , void (classtype::*function)( param1type p1 ) , param1type p1 ){ wxMacObjectFunctor1<classtype, param1type> params(object, function, p1) ; void *result = MPRemoteCall( wxMacFunctor::CallBackProc , ¶ms , kMPOwningProcessRemoteContext ) ; return result ;}template<typename classtype, typename param1type>void* wxMacMPRemoteCall( classtype *object , void (classtype::*function)( const param1type& p1 ) , param1type p1 ){ wxMacObjectFunctor1<classtype,param1type> params(object, function, p1) ; void *result = MPRemoteCall( wxMacFunctor::CallBackProc , ¶ms , kMPOwningProcessRemoteContext ) ; return result ;}template<typename classtype, typename param1type>void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( param1type p1 ) , param1type p1 ){ wxMutexGuiLeave() ; void *result = wxMacMPRemoteCall( object , function , p1 ) ; wxMutexGuiEnter() ; return result ;}template<typename classtype, typename param1type>void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( const param1type& p1 ) , param1type p1 ){ wxMutexGuiLeave() ; void *result = wxMacMPRemoteCall( object , function , p1 ) ; wxMutexGuiEnter() ; return result ;}// common interface for all implementationsclass wxMacTextControl : public wxMacControl{public : wxMacTextControl( wxTextCtrl *peer ) ; virtual ~wxMacTextControl() ; virtual wxString GetStringValue() const = 0 ; virtual void SetStringValue( const wxString &val ) = 0 ; virtual void SetSelection( long from, long to ) = 0 ; virtual void GetSelection( long* from, long* to ) const = 0 ; virtual void WriteText( const wxString& str ) = 0 ; virtual void SetStyle( long start, long end, const wxTextAttr& style ) ; virtual void Copy() ; virtual void Cut() ; virtual void Paste() ; virtual bool CanPaste() const ; virtual void SetEditable( bool editable ) ; virtual wxTextPos GetLastPosition() const ; virtual void Replace( long from, long to, const wxString &str ) ; virtual void Remove( long from, long to ) ; virtual bool HasOwnContextMenu() const { return false ; } virtual bool SetupCursor( const wxPoint& pt ) { return false ; } virtual void Clear() ; virtual bool CanUndo() const; virtual void Undo() ; virtual bool CanRedo() const; virtual void Redo() ; virtual int GetNumberOfLines() const ; virtual long XYToPosition(long x, long y) const; virtual bool PositionToXY(long pos, long *x, long *y) const ; virtual void ShowPosition(long WXUNUSED(pos)) ; virtual int GetLineLength(long lineNo) const ; virtual wxString GetLineText(long lineNo) const ; virtual void CheckSpelling(bool check) { }#ifndef __WXMAC_OSX__ virtual void MacControlUserPaneDrawProc(wxInt16 part) = 0 ; virtual wxInt16 MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) = 0 ; virtual wxInt16 MacControlUserPaneTrackingProc(wxInt16 x, wxInt16 y, void* actionProc) = 0 ; virtual void MacControlUserPaneIdleProc() = 0 ; virtual wxInt16 MacControlUserPaneKeyDownProc(wxInt16 keyCode, wxInt16 charCode, wxInt16 modifiers) = 0 ; virtual void MacControlUserPaneActivateProc(bool activating) = 0 ; virtual wxInt16 MacControlUserPaneFocusProc(wxInt16 action) = 0 ; virtual void MacControlUserPaneBackgroundProc(void* info) = 0 ;#endif} ;// common parts for implementations based on MLTEclass wxMacMLTEControl : public wxMacTextControl{public : wxMacMLTEControl( wxTextCtrl *peer ) ; virtual wxString GetStringValue() const ; virtual void SetStringValue( const wxString &str ) ; static TXNFrameOptions FrameOptionsFromWXStyle( long wxStyle ) ; void AdjustCreationAttributes( const wxColour& background, bool visible ) ; virtual void SetFont( const wxFont & font, const wxColour& foreground, long windowStyle ) ; virtual void SetBackground( const wxBrush &brush ) ; virtual void SetStyle( long start, long end, const wxTextAttr& style ) ; virtual void Copy() ; virtual void Cut() ; virtual void Paste() ; virtual bool CanPaste() const ; virtual void SetEditable( bool editable ) ; virtual wxTextPos GetLastPosition() const ; virtual void Replace( long from, long to, const wxString &str ) ; virtual void Remove( long from, long to ) ; virtual void GetSelection( long* from, long* to ) const ; virtual void SetSelection( long from, long to ) ; virtual void WriteText( const wxString& str ) ; virtual bool HasOwnContextMenu() const {#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 if ( UMAGetSystemVersion() >= 0x1040 ) { TXNCommandEventSupportOptions options ; TXNGetCommandEventSupport( m_txn , & options ) ; return options & kTXNSupportEditCommandProcessing ; }#endif return false ; } virtual void CheckSpelling(bool check) {#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 TXNSetSpellCheckAsYouType( m_txn, (Boolean) check );#endif } virtual void Clear() ; virtual bool CanUndo() const ; virtual void Undo() ; virtual bool CanRedo() const; virtual void Redo() ; virtual int GetNumberOfLines() const ; virtual long XYToPosition(long x, long y) const ; virtual bool PositionToXY(long pos, long *x, long *y) const ; virtual void ShowPosition( long pos ) ; virtual int GetLineLength(long lineNo) const ; virtual wxString GetLineText(long lineNo) const ; void SetTXNData( const wxString& st , TXNOffset start , TXNOffset end ) ; TXNObject GetTXNObject() { return m_txn ; }protected : void TXNSetAttribute( const wxTextAttr& style , long from , long to ) ; TXNObject m_txn ;} ;#if TARGET_API_MAC_OSX// implementation available under OSX#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2class wxMacMLTEHIViewControl : public wxMacMLTEControl{public : wxMacMLTEHIViewControl( wxTextCtrl *wxPeer, const wxString& str, const wxPoint& pos, const wxSize& size, long style ) ; virtual ~wxMacMLTEHIViewControl() ; virtual OSStatus SetFocus( ControlFocusPart focusPart ) ; virtual bool HasFocus() const ; virtual void SetBackground( const wxBrush &brush) ;protected : HIViewRef m_scrollView ; HIViewRef m_textView ; EventHandlerRef m_textEventHandlerRef ;};#endifclass wxMacUnicodeTextControl : public wxMacTextControl{public : wxMacUnicodeTextControl( wxTextCtrl *wxPeer, const wxString& str, const wxPoint& pos, const wxSize& size, long style ) ; virtual ~wxMacUnicodeTextControl(); virtual void VisibilityChanged(bool shown); virtual wxString GetStringValue() const ; virtual void SetStringValue( const wxString &str) ; virtual void Copy(); virtual void Cut(); virtual void Paste(); virtual bool CanPaste() const; virtual void SetEditable(bool editable) ; virtual void GetSelection( long* from, long* to) const ; virtual void SetSelection( long from , long to ) ; virtual void WriteText(const wxString& str) ;protected : // contains the tag for the content (is different for password and non-password controls) OSType m_valueTag ; // as the selection tag only works correctly when the control has the focus we have to mirror the // intended value EventHandlerRef m_focusHandlerRef ;public : ControlEditTextSelectionRec m_selection ;};#endif// 'classic' MLTE implementationclass wxMacMLTEClassicControl : public wxMacMLTEControl{public : wxMacMLTEClassicControl( wxTextCtrl *wxPeer, const wxString& str, const wxPoint& pos, const wxSize& size, long style ) ; virtual ~wxMacMLTEClassicControl() ; virtual void VisibilityChanged(bool shown) ; virtual void SuperChangedPosition() ; virtual void MacControlUserPaneDrawProc(wxInt16 part) ; virtual wxInt16 MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) ; virtual wxInt16 MacControlUserPaneTrackingProc(wxInt16 x, wxInt16 y, void* actionProc) ; virtual void MacControlUserPaneIdleProc() ; virtual wxInt16 MacControlUserPaneKeyDownProc(wxInt16 keyCode, wxInt16 charCode, wxInt16 modifiers) ; virtual void MacControlUserPaneActivateProc(bool activating) ; virtual wxInt16 MacControlUserPaneFocusProc(wxInt16 action) ; virtual void MacControlUserPaneBackgroundProc(void* info) ; virtual bool SetupCursor( const wxPoint& WXUNUSED(pt) ) { MacControlUserPaneIdleProc(); return true; } virtual void SetRect( Rect *r ) ;protected : OSStatus DoCreate(); void MacUpdatePosition() ; void MacActivatePaneText(bool setActive) ; void MacFocusPaneText(bool setFocus) ; void MacSetObjectVisibility(bool vis) ;private : TXNFrameID m_txnFrameID ; GrafPtr m_txnPort ; WindowRef m_txnWindow ; // bounds of the control as we last did set the txn frames Rect m_txnControlBounds ; Rect m_txnVisBounds ;#ifdef __WXMAC_OSX__ static pascal void TXNScrollActionProc( ControlRef controlRef , ControlPartCode partCode ) ; static pascal void TXNScrollInfoProc( SInt32 iValue, SInt32 iMaximumValue, TXNScrollBarOrientation iScrollBarOrientation, SInt32 iRefCon ) ; ControlRef m_sbHorizontal ; SInt32 m_lastHorizontalValue ; ControlRef m_sbVertical ; SInt32 m_lastVerticalValue ;#endif};IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxTextCtrlBase)BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase) EVT_ERASE_BACKGROUND( wxTextCtrl::OnEraseBackground ) EVT_DROP_FILES(wxTextCtrl::OnDropFiles) EVT_CHAR(wxTextCtrl::OnChar) EVT_MENU(wxID_CUT, wxTextCtrl::OnCut) EVT_MENU(wxID_COPY, wxTextCtrl::OnCopy) EVT_MENU(wxID_PASTE, wxTextCtrl::OnPaste) EVT_MENU(wxID_UNDO, wxTextCtrl::OnUndo) EVT_MENU(wxID_REDO, wxTextCtrl::OnRedo) EVT_MENU(wxID_CLEAR, wxTextCtrl::OnDelete) EVT_MENU(wxID_SELECTALL, wxTextCtrl::OnSelectAll) EVT_CONTEXT_MENU(wxTextCtrl::OnContextMenu) EVT_UPDATE_UI(wxID_CUT, wxTextCtrl::OnUpdateCut) EVT_UPDATE_UI(wxID_COPY, wxTextCtrl::OnUpdateCopy) EVT_UPDATE_UI(wxID_PASTE, wxTextCtrl::OnUpdatePaste) EVT_UPDATE_UI(wxID_UNDO, wxTextCtrl::OnUpdateUndo) EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo) EVT_UPDATE_UI(wxID_CLEAR, wxTextCtrl::OnUpdateDelete) EVT_UPDATE_UI(wxID_SELECTALL, wxTextCtrl::OnUpdateSelectAll)END_EVENT_TABLE()void wxTextCtrl::Init(){ m_editable = true ; m_dirty = false; m_maxLength = 0; m_privateContextMenu = NULL; m_triggerOnSetValue = true ;}wxTextCtrl::~wxTextCtrl(){ delete m_privateContextMenu;}bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString& str, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name ){ m_macIsUserPane = false ; m_editable = true ; if ( ! (style & wxNO_BORDER) ) style = (style & ~wxBORDER_MASK) | wxSUNKEN_BORDER ; if ( !wxTextCtrlBase::Create( parent, id, pos, size, style & ~(wxHSCROLL | wxVSCROLL), validator, name ) ) return false; if ( m_windowStyle & wxTE_MULTILINE ) { // always turn on this style for multi-line controls m_windowStyle |= wxTE_PROCESS_ENTER; style |= wxTE_PROCESS_ENTER ; } CreatePeer( str, pos, size, style ); MacPostControlCreate(pos, size) ; // only now the embedding is correct and we can do a positioning update
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -