📄 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.197 2006/07/02 07:40:47 JS 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"
// if this is set to 1 then under OSX 10.2 the 'classic' MLTE implementation will be used
// if set to 0 then the unicode textctrl will be used
#ifndef wxMAC_AWAYS_USE_MLTE
#define wxMAC_AWAYS_USE_MLTE 1
#endif
#ifndef __WXMAC_OSX__
enum
{
kTXNVisibilityTag = 'visb' // set the visibility state of the object
};
#endif
class 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 ;
}
~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 implementations
class wxMacTextControl : public wxMacControl
{
public :
wxMacTextControl( wxTextCtrl *peer ) ;
~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 ;
#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 MLTE
class 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 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_2
class wxMacMLTEHIViewControl : public wxMacMLTEControl
{
public :
wxMacMLTEHIViewControl( wxTextCtrl *wxPeer,
const wxString& str,
const wxPoint& pos,
const wxSize& size, long style ) ;
~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 ;
};
#endif
class wxMacUnicodeTextControl : public wxMacTextControl
{
public :
wxMacUnicodeTextControl( wxTextCtrl *wxPeer,
const wxString& str,
const wxPoint& pos,
const wxSize& size, long style ) ;
~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 implementation
class wxMacMLTEClassicControl : public wxMacMLTEControl
{
public :
wxMacMLTEClassicControl( wxTextCtrl *wxPeer,
const wxString& str,
const wxPoint& pos,
const wxSize& size, long style ) ;
~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 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -