/////////////////////////////////////////////////////////////////////////////
-// Name: src/mac/carbon/textctrl.cpp
+// Name: src/osx/carbon/textctrl.cpp
// Purpose: wxTextCtrl
// Author: Stefan Csomor
// Modified by: Ryan Norton (MLTE GetLineLength and GetLineText)
#include "wx/sysopt.h"
#include "wx/thread.h"
-#include "wx/osx/uma.h"
+#include "wx/osx/private.h"
#include "wx/osx/carbon/private/mactext.h"
class wxMacFunctor
class WXDLLEXPORT wxMacPortSaver
{
- DECLARE_NO_COPY_CLASS(wxMacPortSaver)
+ wxDECLARE_NO_COPY_CLASS(wxMacPortSaver);
public:
wxMacPortSaver( GrafPtr port );
class WXDLLEXPORT wxMacWindowClipper : public wxMacPortSaver
{
- DECLARE_NO_COPY_CLASS(wxMacWindowClipper)
+ wxDECLARE_NO_COPY_CLASS(wxMacWindowClipper);
public:
wxMacWindowClipper( const wxWindow* win );
// common parts for implementations based on MLTE
-class wxMacMLTEControl : public wxMacTextControl
+class wxMacMLTEControl : public wxMacControl, public wxTextWidgetImpl
{
public :
wxMacMLTEControl( wxTextCtrl *peer ) ;
+ ~wxMacMLTEControl() {}
- 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 SetBackgroundColour(const wxColour& col );
- 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
- {
- TXNCommandEventSupportOptions options ;
- TXNGetCommandEventSupport( m_txn , & options ) ;
- return options & kTXNSupportEditCommandProcessing ;
- }
-
- virtual void CheckSpelling(bool check)
- {
- TXNSetSpellCheckAsYouType( m_txn, (Boolean) check );
- }
- 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 ;
-} ;
-
-// implementation available under OSX
-
-class 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 SetBackgroundColour(const wxColour& col ) ;
-
-protected :
- HIViewRef m_scrollView ;
- HIViewRef m_textView ;
-};
-
-// 'classic' MLTE implementation
-
-class 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 Move(int x, int y, int width, int height);
-
-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 ;
-
- 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 ;
-};
-
-
-IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxTextCtrlBase)
-
-BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase)
- 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
-
- MacSuperChangedPosition() ;
-
- if ( m_windowStyle & wxTE_READONLY)
- SetEditable( false ) ;
-
- SetCursor( wxCursor( wxCURSOR_IBEAM ) ) ;
-
- return true;
-}
-
-void wxTextCtrl::CreatePeer(
- const wxString& str,
- const wxPoint& pos,
- const wxSize& size, long style )
-{
- bool forceMLTE = false ;
-
-#if wxUSE_SYSTEM_OPTIONS
- if (wxSystemOptions::HasOption( wxMAC_TEXTCONTROL_USE_MLTE ) && (wxSystemOptions::GetOptionInt( wxMAC_TEXTCONTROL_USE_MLTE ) == 1))
- {
- forceMLTE = true ;
- }
-#endif
-
- if ( UMAGetSystemVersion() >= 0x1050 )
- forceMLTE = false;
-
- if ( !forceMLTE )
- {
- if ( m_windowStyle & wxTE_MULTILINE || ( UMAGetSystemVersion() >= 0x1050 ) )
- m_peer = new wxMacMLTEHIViewControl( this , str , pos , size , style ) ;
- }
-
- if ( !m_peer )
- {
- if ( !(m_windowStyle & wxTE_MULTILINE) && !forceMLTE )
- {
- m_peer = new wxMacUnicodeTextControl( this , str , pos , size , style ) ;
- }
- }
-
- // the horizontal single line scrolling bug that made us keep the classic implementation
- // is fixed in 10.5
-#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
- if ( !m_peer )
- m_peer = new wxMacMLTEClassicControl( this , str , pos , size , style ) ;
-#endif
-}
-
-void wxTextCtrl::MacSuperChangedPosition()
-{
- wxWindow::MacSuperChangedPosition() ;
- GetPeer()->SuperChangedPosition() ;
-}
-
-void wxTextCtrl::MacVisibilityChanged()
-{
- GetPeer()->VisibilityChanged( GetPeer()->IsVisible() );
-}
-
-void wxTextCtrl::MacCheckSpelling(bool check)
-{
- GetPeer()->CheckSpelling(check);
-}
-
-wxString wxTextCtrl::GetValue() const
-{
- return GetPeer()->GetStringValue() ;
-}
-
-void wxTextCtrl::GetSelection(long* from, long* to) const
-{
- GetPeer()->GetSelection( from , to ) ;
-}
-
-void wxTextCtrl::DoSetValue(const wxString& str, int flags)
-{
- // optimize redraws
- if ( GetValue() == str )
- return;
-
- GetPeer()->SetStringValue( str ) ;
-
- if ( (flags & SetValue_SendEvent) && m_triggerOnSetValue )
- {
- SendTextUpdatedEvent();
- }
-}
-
-void wxTextCtrl::SetMaxLength(unsigned long len)
-{
- m_maxLength = len ;
-}
-
-bool wxTextCtrl::SetFont( const wxFont& font )
-{
- if ( !wxTextCtrlBase::SetFont( font ) )
- return false ;
-
- GetPeer()->SetFont( font , GetForegroundColour() , GetWindowStyle() ) ;
-
- return true ;
-}
-
-bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
-{
- GetPeer()->SetStyle( start , end , style ) ;
-
- return true ;
-}
-
-bool wxTextCtrl::SetDefaultStyle(const wxTextAttr& style)
-{
- wxTextCtrlBase::SetDefaultStyle( style ) ;
- SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ;
-
- return true ;
-}
-
-// Clipboard operations
-
-void wxTextCtrl::Copy()
-{
- if (CanCopy())
- GetPeer()->Copy() ;
-}
-
-void wxTextCtrl::Cut()
-{
- if (CanCut())
- {
- GetPeer()->Cut() ;
-
- wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, m_windowId );
- event.SetEventObject( this );
- HandleWindowEvent( event );
- }
-}
-
-void wxTextCtrl::Paste()
-{
- if (CanPaste())
- {
- GetPeer()->Paste() ;
-
- // TODO: eventually we should add setting the default style again
-
- wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, m_windowId );
- event.SetEventObject( this );
- HandleWindowEvent( 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 );
-
- return (from != to);
-}
-
-bool wxTextCtrl::CanPaste() const
-{
- if (!IsEditable())
- return false;
-
- return GetPeer()->CanPaste() ;
-}
-
-void wxTextCtrl::SetEditable(bool editable)
-{
- if ( editable != m_editable )
- {
- m_editable = editable ;
- GetPeer()->SetEditable( editable ) ;
- }
-}
-
-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
-{
- return GetPeer()->GetLastPosition() ;
-}
-
-void wxTextCtrl::Replace(long from, long to, const wxString& str)
-{
- GetPeer()->Replace( from , to , str ) ;
-}
-
-void wxTextCtrl::Remove(long from, long to)
-{
- GetPeer()->Remove( from , to ) ;
-}
-
-void wxTextCtrl::SetSelection(long from, long to)
-{
- GetPeer()->SetSelection( from , to ) ;
-}
-
-void wxTextCtrl::WriteText(const wxString& str)
-{
- // TODO: this MPRemoting will be moved into a remoting peer proxy for any command
- if ( !wxIsMainThread() )
- {
- // unfortunately CW 8 is not able to correctly deduce the template types,
- // so we have to instantiate explicitly
- wxMacMPRemoteGUICall<wxTextCtrl,wxString>( this , &wxTextCtrl::WriteText , str ) ;
-
- return ;
- }
-
- GetPeer()->WriteText( str ) ;
-}
-
-void wxTextCtrl::AppendText(const wxString& text)
-{
- SetInsertionPointEnd();
- WriteText( text );
-}
-
-void wxTextCtrl::Clear()
-{
- GetPeer()->Clear() ;
-}
-
-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, hText;
-
- // these are the numbers from the HIG:
- // we reduce them by the borders first
- wText = 100 ;
-
- switch ( m_windowVariant )
- {
- case wxWINDOW_VARIANT_NORMAL :
- hText = 22 - 6 ;
- break ;
-
- case wxWINDOW_VARIANT_SMALL :
- hText = 19 - 6 ;
- break ;
-
- case wxWINDOW_VARIANT_MINI :
- hText = 15 - 6 ;
- break ;
-
- default :
- hText = 22 - 6;
- break ;
- }
-
- // as the above numbers have some free space around the text
- // we get 5 lines like this anyway
- if ( m_windowStyle & wxTE_MULTILINE )
- hText *= 5 ;
-
- if ( !HasFlag(wxNO_BORDER) )
- hText += 6 ;
-
- return wxSize(wText, hText);
-}
-
-// ----------------------------------------------------------------------------
-// Undo/redo
-// ----------------------------------------------------------------------------
-
-void wxTextCtrl::Undo()
-{
- if (CanUndo())
- GetPeer()->Undo() ;
-}
-
-void wxTextCtrl::Redo()
-{
- if (CanRedo())
- GetPeer()->Redo() ;
-}
-
-bool wxTextCtrl::CanUndo() const
-{
- if ( !IsEditable() )
- return false ;
-
- return GetPeer()->CanUndo() ;
-}
-
-bool wxTextCtrl::CanRedo() const
-{
- if ( !IsEditable() )
- return false ;
-
- return GetPeer()->CanRedo() ;
-}
-
-void wxTextCtrl::MarkDirty()
-{
- m_dirty = true;
-}
-
-void wxTextCtrl::DiscardEdits()
-{
- m_dirty = false;
-}
-
-int wxTextCtrl::GetNumberOfLines() const
-{
- return GetPeer()->GetNumberOfLines() ;
-}
-
-long wxTextCtrl::XYToPosition(long x, long y) const
-{
- return GetPeer()->XYToPosition( x , y ) ;
-}
-
-bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const
-{
- return GetPeer()->PositionToXY( pos , x , y ) ;
-}
-
-void wxTextCtrl::ShowPosition(long pos)
-{
- return GetPeer()->ShowPosition(pos) ;
-}
-
-int wxTextCtrl::GetLineLength(long lineNo) const
-{
- return GetPeer()->GetLineLength(lineNo) ;
-}
-
-wxString wxTextCtrl::GetLineText(long lineNo) const
-{
- return GetPeer()->GetLineText(lineNo) ;
-}
-
-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 ;
- long from, to;
-
- if ( key == 'a' && event.MetaDown() )
- {
- SelectAll() ;
-
- return ;
- }
-
- 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 ;
- }
-
- // Check if we have reached the max # of chars (if it is set), but still
- // allow navigation and deletion
- GetSelection( &from, &to );
- if ( !IsMultiLine() && m_maxLength && GetValue().length() >= m_maxLength &&
- key != WXK_LEFT && key != WXK_RIGHT && key != WXK_TAB && key != WXK_UP && key != WXK_DOWN &&
- key != WXK_BACK && key != WXK_DELETE && !( key == WXK_RETURN && (m_windowStyle & wxTE_PROCESS_ENTER) ) &&
- from == to )
- {
- // eat it, we don't want to add more than allowed # of characters
-
- // TODO: generate EVT_TEXT_MAXLEN()
- 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 ( HandleWindowEvent(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);
- // otherwise the tab will not be inserted.
- WriteText(wxT("\t"));
- eat_key = true;
- }
- break;
-
- default:
- break;
- }
-
- if (!eat_key)
- {
- // perform keystroke handling
- event.Skip(true) ;
- }
-
- if ( ( key >= 0x20 && key < WXK_START ) ||
- ( key >= WXK_NUMPAD0 && key <= WXK_DIVIDE ) ||
- key == WXK_RETURN ||
- key == WXK_DELETE ||
- key == WXK_BACK)
- {
- wxCommandEvent event1(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
- event1.SetEventObject( this );
- wxPostEvent( GetEventHandler(), event1 );
- }
-}
-
-// ----------------------------------------------------------------------------
-// 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::OnDelete(wxCommandEvent& WXUNUSED(event))
-{
- long from, to;
-
- GetSelection( &from, &to );
- if (from != -1 && to != -1)
- Remove( from, to );
-}
-
-void wxTextCtrl::OnSelectAll(wxCommandEvent& WXUNUSED(event))
-{
- SetSelection(-1, -1);
-}
-
-void wxTextCtrl::OnUpdateCut(wxUpdateUIEvent& event)
-{
- event.Enable( CanCut() );
-}
-
-void wxTextCtrl::OnUpdateCopy(wxUpdateUIEvent& event)
-{
- event.Enable( CanCopy() );
-}
-
-void wxTextCtrl::OnUpdatePaste(wxUpdateUIEvent& event)
-{
- event.Enable( CanPaste() );
-}
+ virtual bool CanFocus() const
+ { return true; }
-void wxTextCtrl::OnUpdateUndo(wxUpdateUIEvent& event)
-{
- event.Enable( CanUndo() );
-}
-
-void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event)
-{
- event.Enable( CanRedo() );
-}
+ virtual wxString GetStringValue() const ;
+ virtual void SetStringValue( const wxString &str ) ;
-void wxTextCtrl::OnUpdateDelete(wxUpdateUIEvent& event)
-{
- long from, to;
+ static TXNFrameOptions FrameOptionsFromWXStyle( long wxStyle ) ;
- GetSelection( &from, &to );
- event.Enable( from != -1 && to != -1 && from != to && IsEditable() ) ;
-}
+ void AdjustCreationAttributes( const wxColour& background, bool visible ) ;
-void wxTextCtrl::OnUpdateSelectAll(wxUpdateUIEvent& event)
-{
- event.Enable(GetLastPosition() > 0);
-}
+ virtual void SetFont( const wxFont & font, const wxColour& foreground, long windowStyle, bool ignoreBlack ) ;
+ virtual void SetBackgroundColour(const wxColour& col );
+ 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 long 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 ) ;
-// CS: Context Menus only work with MLTE implementations or non-multiline HIViews at the moment
+ virtual void WriteText( const wxString& str ) ;
-void wxTextCtrl::OnContextMenu(wxContextMenuEvent& event)
-{
- if ( GetPeer()->HasOwnContextMenu() )
+ virtual bool HasOwnContextMenu() const
{
- event.Skip() ;
- return ;
+ TXNCommandEventSupportOptions options ;
+ TXNGetCommandEventSupport( m_txn , & options ) ;
+ return options & kTXNSupportEditCommandProcessing ;
}
- if (m_privateContextMenu == NULL)
+ virtual void CheckSpelling(bool check)
{
- m_privateContextMenu = new wxMenu;
- m_privateContextMenu->Append(wxID_UNDO, _("&Undo"));
- m_privateContextMenu->Append(wxID_REDO, _("&Redo"));
- m_privateContextMenu->AppendSeparator();
- m_privateContextMenu->Append(wxID_CUT, _("Cu&t"));
- m_privateContextMenu->Append(wxID_COPY, _("&Copy"));
- m_privateContextMenu->Append(wxID_PASTE, _("&Paste"));
- m_privateContextMenu->Append(wxID_CLEAR, _("&Delete"));
- m_privateContextMenu->AppendSeparator();
- m_privateContextMenu->Append(wxID_SELECTALL, _("Select &All"));
+ TXNSetSpellCheckAsYouType( m_txn, (Boolean) check );
}
+ virtual void Clear() ;
- if (m_privateContextMenu != NULL)
- PopupMenu(m_privateContextMenu);
-}
-
-bool wxTextCtrl::MacSetupCursor( const wxPoint& pt )
-{
- if ( !GetPeer()->SetupCursor( pt ) )
- return wxWindow::MacSetupCursor( pt ) ;
- else
- return true ;
-}
-
-// ----------------------------------------------------------------------------
-// implementation base class
-// ----------------------------------------------------------------------------
-
-wxMacTextControl::wxMacTextControl(wxTextCtrl* peer) :
- wxMacControl( peer )
-{
-}
+ 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 ;
-wxMacTextControl::~wxMacTextControl()
-{
-}
+ void SetTXNData( const wxString& st , TXNOffset start , TXNOffset end ) ;
+ TXNObject GetTXNObject() { return m_txn ; }
-void wxMacTextControl::SetStyle(long WXUNUSED(start),
- long WXUNUSED(end),
- const wxTextAttr& WXUNUSED(style))
-{
-}
+protected :
+ void TXNSetAttribute( const wxTextAttr& style , long from , long to ) ;
-void wxMacTextControl::Copy()
-{
-}
+ TXNObject m_txn ;
+} ;
-void wxMacTextControl::Cut()
-{
-}
+// implementation available under OSX
-void wxMacTextControl::Paste()
+class wxMacMLTEHIViewControl : public wxMacMLTEControl
{
-}
+public :
+ wxMacMLTEHIViewControl( wxTextCtrl *wxPeer,
+ const wxString& str,
+ const wxPoint& pos,
+ const wxSize& size, long style ) ;
+ virtual ~wxMacMLTEHIViewControl() ;
-bool wxMacTextControl::CanPaste() const
-{
- return false ;
-}
+ virtual bool SetFocus() ;
+ virtual bool HasFocus() const ;
+ virtual void SetBackgroundColour(const wxColour& col ) ;
-void wxMacTextControl::SetEditable(bool WXUNUSED(editable))
-{
-}
+protected :
+ HIViewRef m_scrollView ;
+ HIViewRef m_textView ;
+};
-wxTextPos wxMacTextControl::GetLastPosition() const
-{
- return GetStringValue().length() ;
-}
+// 'classic' MLTE implementation
-void wxMacTextControl::Replace( long from , long to , const wxString &val )
+class wxMacMLTEClassicControl : public wxMacMLTEControl
{
- SetSelection( from , to ) ;
- WriteText( val ) ;
-}
+public :
+ wxMacMLTEClassicControl( wxTextCtrl *wxPeer,
+ const wxString& str,
+ const wxPoint& pos,
+ const wxSize& size, long style ) ;
+ virtual ~wxMacMLTEClassicControl() ;
-void wxMacTextControl::Remove( long from , long to )
-{
- SetSelection( from , to ) ;
- WriteText( wxEmptyString) ;
-}
+ virtual void VisibilityChanged(bool shown) ;
+ virtual void SuperChangedPosition() ;
-void wxMacTextControl::Clear()
-{
- SetStringValue( wxEmptyString ) ;
-}
+ 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) ;
-bool wxMacTextControl::CanUndo() const
-{
- return false ;
-}
+ virtual bool SetupCursor( const wxPoint& WXUNUSED(pt) )
+ {
+ MacControlUserPaneIdleProc();
+ return true;
+ }
-void wxMacTextControl::Undo()
-{
-}
+ virtual void Move(int x, int y, int width, int height);
-bool wxMacTextControl::CanRedo() const
-{
- return false ;
-}
+protected :
+ OSStatus DoCreate();
-void wxMacTextControl::Redo()
-{
-}
+ void MacUpdatePosition() ;
+ void MacActivatePaneText(bool setActive) ;
+ void MacFocusPaneText(bool setFocus) ;
+ void MacSetObjectVisibility(bool vis) ;
-long wxMacTextControl::XYToPosition(long WXUNUSED(x), long WXUNUSED(y)) const
-{
- return 0 ;
-}
+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 ;
-bool wxMacTextControl::PositionToXY(long WXUNUSED(pos),
- long *WXUNUSED(x),
- long *WXUNUSED(y)) const
-{
- return false ;
-}
+ static pascal void TXNScrollActionProc( ControlRef controlRef , ControlPartCode partCode ) ;
+ static pascal void TXNScrollInfoProc(
+ SInt32 iValue, SInt32 iMaximumValue,
+ TXNScrollBarOrientation iScrollBarOrientation, SInt32 iRefCon ) ;
-void wxMacTextControl::ShowPosition( long WXUNUSED(pos) )
-{
-}
+ ControlRef m_sbHorizontal ;
+ SInt32 m_lastHorizontalValue ;
+ ControlRef m_sbVertical ;
+ SInt32 m_lastVerticalValue ;
+};
-int wxMacTextControl::GetNumberOfLines() const
+wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer,
+ wxWindowMac* WXUNUSED(parent),
+ wxWindowID WXUNUSED(id),
+ const wxString& str,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ long WXUNUSED(extraStyle))
{
- ItemCount lines = 0 ;
- wxString content = GetStringValue() ;
- lines = 1;
+ bool forceMLTE = false ;
- for (size_t i = 0; i < content.length() ; i++)
+#if wxUSE_SYSTEM_OPTIONS
+ if (wxSystemOptions::HasOption( wxMAC_TEXTCONTROL_USE_MLTE ) && (wxSystemOptions::GetOptionInt( wxMAC_TEXTCONTROL_USE_MLTE ) == 1))
{
- if (content[i] == '\r')
- lines++;
+ forceMLTE = true ;
}
+#endif
- return lines ;
-}
+ if ( UMAGetSystemVersion() >= 0x1050 )
+ forceMLTE = false;
-wxString wxMacTextControl::GetLineText(long lineNo) const
-{
- // TODO: change this if possible to reflect real lines
- wxString content = GetStringValue() ;
+ wxMacControl* peer = NULL;
- // Find line first
- int count = 0;
- for (size_t i = 0; i < content.length() ; i++)
+ if ( !forceMLTE )
{
- 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++;
+ if ( style & wxTE_MULTILINE || ( UMAGetSystemVersion() >= 0x1050 ) )
+ peer = new wxMacMLTEHIViewControl( wxpeer , str , pos , size , style ) ;
}
- return wxEmptyString ;
-}
-
-int wxMacTextControl::GetLineLength(long lineNo) const
-{
- // TODO: change this if possible to reflect real lines
- wxString content = GetStringValue() ;
-
- // Find line first
- int count = 0;
- for (size_t i = 0; i < content.length() ; i++)
+ if ( !peer )
{
- if (count == lineNo)
+ if ( !(style & wxTE_MULTILINE) && !forceMLTE )
{
- // 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;
+ peer = new wxMacUnicodeTextControl( wxpeer , str , pos , size , style ) ;
}
-
- if (content[i] == '\n')
- count++;
}
- return 0 ;
-}
-
-void wxMacTextControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle )
-{
- wxMacControl::SetFont(font, foreground, windowStyle );
-#ifndef __LP64__
-
- // overrule the barrier in wxMacControl for supporting disabled controls, in order to support
- // setting the color to eg red and back to black by controllers
-
- if ( foreground == *wxBLACK )
- {
- ControlFontStyleRec fontStyle;
- fontStyle.foreColor.red = fontStyle.foreColor.green = fontStyle.foreColor.blue = 0;
- fontStyle.flags = kControlUseForeColorMask;
- ::SetControlFontStyle( m_controlRef , &fontStyle );
- }
+ // the horizontal single line scrolling bug that made us keep the classic implementation
+ // is fixed in 10.5
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+ if ( !peer )
+ peer = new wxMacMLTEClassicControl( wxpeer , str , pos , size , style ) ;
#endif
+ return peer;
}
// ----------------------------------------------------------------------------
DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacUnicodeTextControlEventHandler )
-wxMacUnicodeTextControl::wxMacUnicodeTextControl( wxTextCtrl *wxPeer ) : wxMacTextControl( wxPeer )
+wxMacUnicodeTextControl::wxMacUnicodeTextControl( wxTextCtrl *wxPeer ) : wxMacControl( wxPeer )
{
}
const wxString& str,
const wxPoint& pos,
const wxSize& size, long style )
- : wxMacTextControl( wxPeer )
-{
- Create( wxPeer, str, pos, size, style );
-}
-
-bool wxMacUnicodeTextControl::Create( wxTextCtrl *wxPeer,
- const wxString& str,
- const wxPoint& pos,
- const wxSize& size, long style )
+ : wxMacControl( wxPeer )
{
m_font = wxPeer->GetFont() ;
m_windowStyle = style ;
wxString st = str ;
wxMacConvertNewlines10To13( &st ) ;
wxCFStringRef cf(st , m_font.GetEncoding()) ;
- CFStringRef cfr = cf ;
m_valueTag = kControlEditTextCFStringTag ;
- CreateControl( wxPeer, &bounds, cfr );
+ Boolean isPassword = ( m_windowStyle & wxTE_PASSWORD ) != 0 ;
+ if ( isPassword )
+ {
+ m_valueTag = kControlEditTextPasswordCFStringTag ;
+ }
+ OSStatus err = CreateEditUnicodeTextControl(
+ MAC_WXHWND(wxPeer->MacGetTopLevelWindowRef()), &bounds , cf ,
+ isPassword , NULL , &m_controlRef ) ;
+ verify_noerr( err );
if ( !(m_windowStyle & wxTE_MULTILINE) )
SetData<Boolean>( kControlEditTextPart , kControlEditTextSingleLineTag , true ) ;
+ InstallEventHandlers();
+}
+
+void wxMacUnicodeTextControl::InstallEventHandlers()
+{
::InstallControlEventHandler( m_controlRef , GetwxMacUnicodeTextControlEventHandlerUPP(),
GetEventTypeCount(unicodeTextControlEventList), unicodeTextControlEventList, this,
- NULL);
-
- return true;
+ (EventHandlerRef*) &m_macTextCtrlEventHandler);
}
wxMacUnicodeTextControl::~wxMacUnicodeTextControl()
{
+ ::RemoveEventHandler((EventHandlerRef) m_macTextCtrlEventHandler);
}
void wxMacUnicodeTextControl::VisibilityChanged(bool shown)
verify_noerr( SetData<CFStringRef>( 0, m_valueTag , cf ) ) ;
}
-void wxMacUnicodeTextControl::CreateControl( wxTextCtrl* peer, const Rect* bounds, CFStringRef cfr )
-{
- Boolean isPassword = ( m_windowStyle & wxTE_PASSWORD ) != 0 ;
- if ( isPassword )
- {
- m_valueTag = kControlEditTextPasswordCFStringTag ;
- }
- OSStatus err = CreateEditUnicodeTextControl(
- MAC_WXHWND(peer->MacGetTopLevelWindowRef()), bounds , cfr ,
- isPassword , NULL , &m_controlRef ) ;
- verify_noerr( err );
-}
-
void wxMacUnicodeTextControl::Copy()
{
SendHICommand( kHICommandCopy ) ;
void wxMacUnicodeTextControl::WriteText( const wxString& str )
{
+ // TODO: this MPRemoting will be moved into a remoting peer proxy for any command
+ if ( !wxIsMainThread() )
+ {
+#if wxOSX_USE_CARBON
+ // unfortunately CW 8 is not able to correctly deduce the template types,
+ // so we have to instantiate explicitly
+ wxMacMPRemoteGUICall<wxTextCtrl,wxString>( (wxTextCtrl*) GetWXPeer() , &wxTextCtrl::WriteText , str ) ;
+#endif
+ return ;
+ }
+
wxString st = str ;
wxMacConvertNewlines10To13( &st ) ;
} ;
wxMacMLTEControl::wxMacMLTEControl( wxTextCtrl *peer )
- : wxMacTextControl( peer )
+ : wxMacControl( peer )
{
SetNeedsFocusRect( true ) ;
}
(((UniChar*)*theText)[actualSize]) = 0 ;
wxMBConvUTF16 converter ;
size_t noChars = converter.MB2WC( NULL , (const char*)*theText , 0 ) ;
- wxASSERT_MSG( noChars != wxCONV_FAILED, _T("Unable to count the number of characters in this string!") );
+ wxASSERT_MSG( noChars != wxCONV_FAILED, wxT("Unable to count the number of characters in this string!") );
ptr = new wxChar[noChars + 1] ;
noChars = converter.MB2WC( ptr , (const char*)*theText , noChars + 1 ) ;
- wxASSERT_MSG( noChars != wxCONV_FAILED, _T("Conversion of string failed!") );
+ wxASSERT_MSG( noChars != wxCONV_FAILED, wxT("Conversion of string failed!") );
ptr[noChars] = 0 ;
HUnlock( theText ) ;
#endif
} ;
err = TXNSetTypeAttributes(
- m_txn, sizeof(typeAttr) / sizeof(TXNTypeAttributes),
+ m_txn, WXSIZEOF(typeAttr),
typeAttr, kTXNStartOffset, kTXNEndOffset );
verify_noerr( err );
static inline int wxConvertToTXN(int x)
{
- return wx_static_cast(int, x / 254.0 * 72 + 0.5);
+ return static_cast<int>(x / 254.0 * 72 + 0.5);
}
void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , long to )
if ( typeAttrCount > 0 )
{
verify_noerr( TXNSetTypeAttributes( m_txn , typeAttrCount, typeAttr, from , to ) );
- relayout = true;
+ if (from != to)
+ relayout = true;
}
if ( tabs != NULL )
void wxMacMLTEControl::SetFont(const wxFont & font,
const wxColour& foreground,
- long WXUNUSED(windowStyle))
+ long WXUNUSED(windowStyle),
+ bool WXUNUSED(ignoreBlack))
{
wxMacEditHelper help( m_txn ) ;
TXNSetAttribute( wxTextAttr( foreground, wxNullColour, font ), kTXNStartOffset, kTXNEndOffset ) ;
TXNSetTXNObjectControls( m_txn, false, WXSIZEOF(tag), tag, data ) ;
}
-wxTextPos wxMacMLTEControl::GetLastPosition() const
+long wxMacMLTEControl::GetLastPosition() const
{
wxTextPos actualsize = 0 ;
Handle theText ;
+#if wxUSE_UNICODE
+ OSErr err = TXNGetDataEncoded( m_txn, kTXNStartOffset, kTXNEndOffset, &theText, kTXNUnicodeTextData );
+ // all done
+ if ( err == noErr )
+ {
+ actualsize = GetHandleSize( theText )/sizeof(UniChar);
+ DisposeHandle( theText ) ;
+ }
+#else
OSErr err = TXNGetDataEncoded( m_txn, kTXNStartOffset, kTXNEndOffset, &theText, kTXNTextData );
// all done
actualsize = GetHandleSize( theText ) ;
DisposeHandle( theText ) ;
}
+#endif
else
{
actualsize = 0 ;
void wxMacMLTEControl::WriteText( const wxString& str )
{
+ // TODO: this MPRemoting will be moved into a remoting peer proxy for any command
+ if ( !wxIsMainThread() )
+ {
+#if wxOSX_USE_CARBON
+ // unfortunately CW 8 is not able to correctly deduce the template types,
+ // so we have to instantiate explicitly
+ wxMacMPRemoteGUICall<wxTextCtrl,wxString>( (wxTextCtrl*) GetWXPeer() , &wxTextCtrl::WriteText , str ) ;
+#endif
+ return ;
+ }
+
wxString st = str ;
wxMacConvertNewlines10To13( &st ) ;
// there will be an error returned for classic MLTE implementation when the control is
// invisible, but HITextView works correctly, so we don't assert that one
- // wxASSERT_MSG( theErr == noErr, _T("TXNScroll returned an error!") );
+ // wxASSERT_MSG( theErr == noErr, wxT("TXNScroll returned an error!") );
}
void wxMacMLTEControl::SetTXNData( const wxString& st, TXNOffset start, TXNOffset end )
#else
wxMBConvUTF16 converter ;
ByteCount byteBufferLen = converter.WC2MB( NULL, st.wc_str(), 0 ) ;
- UniChar *unibuf = (UniChar*)malloc( byteBufferLen ) ;
- converter.WC2MB( (char*)unibuf, st.wc_str(), byteBufferLen ) ;
+ wxASSERT_MSG( byteBufferLen != wxCONV_FAILED,
+ wxT("Conversion to UTF-16 unexpectedly failed") );
+ UniChar *unibuf = (UniChar*)malloc( byteBufferLen + 2 ) ; // 2 for NUL in UTF-16
+ converter.WC2MB( (char*)unibuf, st.wc_str(), byteBufferLen + 2 ) ;
TXNSetData( m_txn, kTXNUnicodeTextData, (void*)unibuf, byteBufferLen, start, end ) ;
free( unibuf ) ;
#endif
}
}
-void wxMacMLTEClassicControl::Move(int x, int y, int width, int height)
+void wxMacMLTEClassicControl::Move(int x, int y, int width, int height)
{
wxMacControl::Move(x,y,width,height) ;
MacUpdatePosition() ;
MAC_WXHWND(wxPeer->GetParent()->MacGetTopLevelWindowRef()),
&bounds, featureSet, &m_controlRef );
verify_noerr( err );
+ SetControlReference( m_controlRef , (URefCon) wxPeer );
DoCreate();
{
HIViewAddSubview( m_scrollView , m_textView ) ;
m_controlRef = m_scrollView ;
- wxMacControl::MacInstallEventHandler( m_textView, wxPeer ) ;
+ InstallEventHandler( (WXWidget) m_textView ) ;
}
else
{
{
}
-OSStatus wxMacMLTEHIViewControl::SetFocus( ControlFocusPart focusPart )
+bool wxMacMLTEHIViewControl::SetFocus()
{
- return SetKeyboardFocus( GetControlOwner( m_textView ), m_textView, focusPart ) ;
+ return SetKeyboardFocus( GetControlOwner( m_textView ), m_textView, kControlFocusNextPart ) == noErr ;
}
bool wxMacMLTEHIViewControl::HasFocus() const